59
votes

I have an UIView with around 50 UIButtons. All button positions were given in pixels, relative to the left upper corner of my main UIView.

All (background) images used in the view are available in higher resolution. As I am porting my app from iPhone to iPad, I would like to increase the effective pixel size of the UIView.

Now I'm searching a way to upscale the whole UIView by a factor of 2*. Is that possible without destroying the position of the inner elements?

FYI, the UIView is designed in a NIB-file in XCode. But I don't mind if it can be done programmatically.

4
as in you want the buttons to remain in their original positions or to stretch with the parent view? - KDaker
50 buttons? Sounds like an end-user's nightmare. Are you trying to make a calculator? - Richard J. Ross III
The buttons have to upscale too. So their width and height has to double as their parent is doubling too. -- Don't worry, it's not a user's nightmare. The app shows a stadium, you can click each sector and get an image from there. - andreas
Just set the width and height of the button frames to the new value - this will not affect the button's origin. - Luke
not sure is this what you want self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2, 2); - Bryan Chen

4 Answers

123
votes

I ended up using

self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2, 2);

It allowed me to keep the design created in the Interface Builder.

Unfortunately the sharpness of the image suffers in that case, but this is a small price to pay compared to scripting the whole design programmatically.

12
votes

Update for Swift 3.0

self.view.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)
10
votes

For Swift 4.0, zoom 2x:

myView.transform = CGAffineTransform.identity.scaledBy(x: 2, y: 2)
2
votes

You can first programmatically create those buttons like example create those buttons using the CGRectMake method and stating the width and height to be X and Y and multiply by 2 if ipad is detected as for origin it should change respectively too, might cause overlapping if too close to each other

Edit: It all depends on your logic, im unsure too