iOS 11 UIBarButtonItem图片没有resize

我的问题的答案暗示在这个问题 ,所以我想答案是禁用我的UIToolbar视图的自动布局。

据说为视图工作的代码是

cButton.translatesAutoresizingMaskIntoConstraints = YES; 

但我不知道它是否适用于我的代码,因为UIToolbar不从UIViewinheritance。

我在游戏中使用了很多小图片,这些图片的尺寸取决于设备和方向。 当苹果推出新设备时,我决定先制作一张160×160的图像,然后在使用时重新resize,而不是添加许多不同的图像。 这从iOS 4 – iOS 10很好,但在iOS 11失败。

代码非常简单:

 // Get the image NSString *pictFile = [[NSBundle mainBundle] pathForResource:@"Correct" ofType:@"png"]; UIImage *imageToDisplay = [UIImage imageWithContentsOfFile:pictFile]; UIImage *cImage = [UIImage imageWithCGImage:imageToDisplay.CGImage scale:[UIScreen mainScreen].scale orientation:imageToDisplay.imageOrientation]; UIButton *cButton = [UIButton buttonWithType:UIButtonTypeCustom]; [cButton setImage:cImage forState:UIControlStateNormal]; [cButton setTitle:@"c" forState:UIControlStateNormal]; //set the frame of the button to the size of the image cButton.frame = CGRectMake(0, 0, standardButtonSize.width, standardButtonSize.height); //create a UIBarButtonItem with the button as a custom view c = [[UIBarButtonItem alloc] initWithCustomView:cButton]; 

这就是pre11。 酒吧button项目已经resize,并很好地适应底部酒吧。 注意我将复选标记的大小减less了50%,以确保我正在查看正确的代码,并且其行为与我所期望的相同。

正确的版本

这里是他们在Xcode 9.0 GM和iOS 11的模拟器中的样子。请注意,顶部的button行正确resize,但底部的行扩大,以填充分配给标签栏的空间。 同样的行为也发生在iPad以及各种设备上。

iOS 11

任何关于如何禁用Autolayout或添加约束的想法?

BarButtonItem(iOS11 \ xCode9)使用自动布局而不是帧。 试试这个(Swift):

 if #available(iOS 9.0, *) { cButton.widthAnchor.constraint(equalToConstant: customViewButton.width).isActive = true cButton.heightAnchor.constraint(equalToConstant: customViewButton.height).isActive = true } 

目标C

 if (@available(iOS 9, *)) { [cButton.widthAnchor constraintEqualToConstant: standardButtonSize.width].active = YES; [cButton.heightAnchor constraintEqualToConstant: standardButtonSize.height].active = YES; } 

Fallstreak答案(+1)是我的情况下的解决scheme。 我有一个自定义的视图不工作。 只是想分享我必须做的导航项目中的自定义视图工作。 这一切都很快3

 let backButtonView = BackButtonView.loadNib() backButtonView?.addTarget(self, action: #selector(returnToPrevious), for: .touchUpInside) backButtonView.widthAnchor.constraint(equalToConstant: backButtonView.frame.width).isActive = true backButtonView.heightAnchor.constraint(equalToConstant: backButtonView.frame.height).isActive = true self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButtonView!) 

关于锚宽度/高度的2行来自Fallstreak的答案,并在这种情况下的解决scheme。