1

After upgrading to Swift 4, the code I used to add a custom UIBarButtonItem no longer works, and instead, squeezes the image in a peculiar fashion:

enter image description here

  // In viewDidLayoutSubviews
  if let backButton = Utils.createBackButton(color: .white, target: self, selector: #selector(LoginViewController.backPressed)) {
        navigationItem.leftBarButtonItem = backButton
        print("navigation button width", backButton)
    }

// In Utils.swift
class func createBackButton(color: BackArrowColors, target: UIViewController, selector: Selector) -> UIBarButtonItem? {
    var backImage = UIImage()
    if color == .white {
        backImage = UIImage(named: "back-arrow-white.png")!
    } else if color == .black {
        backImage = UIImage(named: "back-arrow-black.png")!
    } else {
        return nil
    }

    let backButton: UIButton = UIButton(type: UIButtonType.custom)
    backButton.frame = CGRect(x: 0, y: 0, width: 35, height: 35)
    backButton.contentMode = UIViewContentMode.scaleAspectFit
    backButton.setImage(backImage, for: .normal)
    backButton.addTarget(target, action: selector, for: .touchUpInside)
    backButton.imageEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 10)
    let leftBarButtonItem: UIBarButtonItem = UIBarButtonItem(customView: backButton)
    return leftBarButtonItem
}

It seems the frame is correct, in the console I get the following console message:

navigation button width <UIBarButtonItem: 0x7fb3d7c0d010> view=<UIButton: 0x7fb3d7c20ae0; frame = (0 0; 35 35); opaque = NO; layer = <CALayer: 0x60c000238b40>>

Any ideas? Thanks guys!

Dane Jordan
  • 1,071
  • 1
  • 17
  • 27

1 Answers1

1

This is a known bug with current iOS 11 release. UIBarButton items now uses constraints instead of the earlier frame approach.

Follow this and this for solution or more explanation.

And this link helps with the new implementation.

Umar Farooque
  • 2,049
  • 21
  • 32