17

There is another question on SO about this but this has nothing to do with it because I think this has to do with a beta version of iOS 11.

I have these 2 UIButtons that are grouped inside a UIView. This UIView is put inside a UIBarButtonItem and the whole thing is set as Left Bar Button Items, using Interface Builder.

Each button, when clicked, show a popover, triggered by storyboard.

I am testing this on an iPad 3, running iOS 9, using Xcode 8. This works wonderfully.

Now I have decided to test this on my iPad Pro 9.7" that is running iOS 11 beta 7. I am using Xcode 9 beta 6. When I run this on the iPad Pro, all buttons on the navigation bar are dead. They don't respond to clicks. Now I try the same Xcode 9 beta 6 and run the app on the iPad 3 with iOS 9 and again, all work wonderfully.

I am compiling for iOS 9.1.

Buttons not even highlight to acknowledge the tap, as they do on iOS 9.

Is there an issue with iOS 11 beta 7 and bar button items?

Any ideas?

Duck
  • 34,902
  • 47
  • 248
  • 470

5 Answers5

18

I found that the same code builded with XCode 8 works well on ios10-11, but when I build with XCode 9 UIBarButtonItem with a custom view don't respond to clicks.

looks that the problem appears because from ios 11 navigation bar uses auto layout instead of dealing with frames. The buttons on screen look well but seem that technically they are offscreen.

So my fix is to add auto layout constraint to my custom view.

//my custom view init
let view = MyCustomView()
view.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
let rightButtonItem = UIBarButtonItem(customView: view)

//constraints
let widthConstraint = view.widthAnchor.constraint(equalToConstant: 44)
let heightConstraint = view.heightAnchor.constraint(equalToConstant: 44)

heightConstraint.isActive = true
widthConstraint.isActive = true

//add my view to nav bar 
self.rightBarButtonItem = rightButtonItem

After that custom right bar button receives clicks successfully.

Chandresh Kachariya
  • 667
  • 2
  • 13
  • 31
4

I have discovered the problem! Amazing bug!

This is the drill. I was adding two buttons to the left navigation item by doing this:

  1. create a view
  2. add two UIButtons inside that view.
  3. add that view to the left navigation item.

This was compiled for iOS 9 and works on a device with iOS 10 and below but not iOS 11.

The "correct" way of doing this is this

  1. Drag an UIButton to the left navigation item.
  2. Drag another UIButton to the left navigation item.

You will see that iOS allows that to happen and will manage both buttons under "navigation items".

this will work on all iOS versions I have tested from 9 thru 11.

Duck
  • 34,902
  • 47
  • 248
  • 470
  • 2
    This does not solve the problem as someone may have a customview other than some buttons inside. So "correct" (at least working) solution is to set a constraint (width and height) to the view inside your `UIBarButtonItem`. This could be done manually in viewDidLoad. See answer from andreylanadelrey. – coyer Mar 28 '18 at 12:48
4

I got this working by adding this method to the UIBarButtonItem:

[self.barBTNItem setWidth:44];
Josher
  • 73
  • 7
2

let tap:

UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(manualAdd.dismissKeyboard))  
tap.cancelsTouchesInView = false  // this line is required for xcode 9  
view.addGestureRecognizer(tap)  
Duck
  • 34,902
  • 47
  • 248
  • 470
Ahmad
  • 2,844
  • 1
  • 13
  • 9
0

I had the same issue when upgrading to iOS 11.

The size of the UIView containing the buttons were 0x0.

I fixed the height x width of the UIView on Interface Builder and it works after that.

Quan Vu
  • 1
  • 1