9

I am completely new to iOS development and I am supposed to fix some bugs in an iOS app which is made using Swift 3.0 and Xcode 8 and it works almost fine. But when I open it with Xcode 9 and Swift 4.0 it shows some buttons way different that they were before.

Here is the source code for one of those buttons.

let button: UIButton = UIButton.init(type: UIButtonType.custom) //set image for button button.setImage(UIImage(named: "menu.png"), for: UIControlState()) button.frame = CGRect(x: 0, y: 0, width: 30, height: 23) let barButton = UIBarButtonItem(customView: button) button.addTarget(self, action: #selector(ViewController.shareButtonPressed), for: UIControlEvents.touchUpInside) self.navigationItem.leftBarButtonItem = barButton 

this code is inside the ViewDidLoad method. My problem is when I remove,

button.setImage(UIImage(named: "menu.png"), for: UIControlState()) 

it disappears the button but when I change the height and the width from,

button.frame = CGRect(x: 0, y: 0, width: 30, height: 23) 

it changes nothing. My problem is how can I fix this bug. Any suggestion, answer is highly appreciated and if the given details are not enough, please mention. Thank you!

3 Answers 3

13

Beginning with iOS 11, views added to toolbars using UIBarButtonItem using UIBarButtonItem(customView:) are now laid out using auto layout. You should add sizing constraints on your button. For example:

button.widthAnchor.constraintEqualToConstant(30.0).isActive = true button.heightAnchor.constraintEqualToConstant(23.0).isActive = true 

Otherwise, auto layout will use the intrinsic content size of your header view which is likely not what you expect.

For more information see the WWDC 2017 session Updating your app for iOS 11.

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you for the answer. It works as this if #available(iOS 9.0, *) { button.widthAnchor.constraint(equalToConstant: 20.0).isActive = true } else { // Fallback on earlier versions }
Yes. Anchors were introduced with iOS 9. If you are targeting below that, you need the #available but as mentioned constraint sizing will only be applied on iOS 11 and up.
11

swift 4:

button.widthAnchor.constraint(equalToConstant: 30.0).isActive = true button.heightAnchor.constraint(equalToConstant: 20.0).isActive = true 

1 Comment

constraintEqualToConstant changed to 'constraint(equalToConstant: '. btn.widthAnchor.constraint(equalToConstant: 30.0).isActive = true
1

You can customize width and height of button using storyboard in Xcode. Just select your button and open this window. Constraint Layout

After that just add the height constraints.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.