iOS 11 UIBarButtonItem图片未调整大小

时间:2017-09-15 21:04:16

标签: ios uitabbar ios11

我的问题的答案在this question中被暗示,所以我认为答案是禁用我的UIToolbar视图的自动布局。

据说适用于视图的代码是

cButton.translatesAutoresizingMaskIntoConstraints = YES;

但我不确定它是否适用于我的代码,因为UIToolbar不会从UIView继承。

我在游戏中使用了很多小图像,这些图像根据设备和方向的不同而不同。当Apple推出新设备时,我决定先制作一张160x160的图像,然后在使用时调整大小,而不是拥有大量不同的图像,并添加新图像。这在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的样子。条形按钮项目已调整大小并适合底部栏。注意我将复选标记的大小减小了50%,以确保我正在查看正确的代码并且它的行为与我期望的一样。

correct version

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

iOS 11

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

2 个答案:

答案 0 :(得分:45)

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

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;
}

答案 1 :(得分:0)

在我的案例中,

Fallstreak答案(+1)是解决方案。我的自定义视图无法正常工作。只想分享我必须做的事情才能使导航项中的自定义视图起作用。这都是迅速的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的答案,在这种情况下是解决方案。