【问题标题】:Constraint a UIBarButtonItem's size in the navigaiton bar with iOS 11使用 iOS 11 约束导航栏中的 UIBarButtonItem 大小
【发布时间】:2017-09-22 11:11:55
【问题描述】:

我尝试在导航栏中使用不同大小的图像设置 UIBarButtonItem。所以我创建了一个基于 UIBarButtonItem 的自定义视图,并将自定义视图的框架设置为约束 UIBarButtonItem 的宽度。在我将软件更新到 iOS 11 之前它一直运行良好。设置自定义视图的框架以限制 UIBarButtonItem 的宽度似乎在 iOS 11 上不再有用。

我使用的图像defaultImage 120*120:

UIButton *leftCustomButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];

[leftCustomButton setImage:[UIImage imageNamed:@"defaultImage"] forState:UIControlStateNormal];

UIBarButtonItem * leftButtonItem =[[UIBarButtonItem alloc] initWithCustomView:leftCustomButton];

self.navigationItem.leftBarButtonItems = @[self.headerIconItem];

在 iOS10、iOS9 上,leftBarButtonItem 的图像没有被拉伸。它显示如下:

但是leftBarButtonItem的图片在iOS11上被拉伸了。如下图所示。

在 iOS 11 上是否有一些方法可以限制 UIBarButtonItem 在导航栏中的宽度?

【问题讨论】:

    标签: ios objective-c uibarbuttonitem


    【解决方案1】:

    从 iOS 11 开始,UIBarButtonItems 现在使用自动布局引擎进行布局,在针对 iOS 11 的情况下,您应该这样说:

    UIButton *leftCustomButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
    
    [leftCustomButton.widthAnchor constraintEqualToConstant:35].active = YES;
    [leftCustomButton.heightAnchor constraintEqualToConstant:35].active = YES; 
    
    [leftCustomButton setImage:[UIImage imageNamed:@"defaultImage"] forState:UIControlStateNormal];
    UIBarButtonItem * leftButtonItem =[[UIBarButtonItem alloc] initWithCustomView:leftCustomButton];
    self.navigationItem.leftBarButtonItems = @[leftButtonItem];
    

    有关更多信息,您应该查看Updating Your App for iOS 11 WWDC 2017 会议。

    【讨论】:

    • headerIconItem 来自哪里?谢谢
    • @Evusas 我认为这只是原始帖子的疏忽。我编辑了答案以明确说明,一旦您创建了条形按钮项,您应该将其设置为视图控制器的 navigationItem 作为所需的左或右条形按钮项。
    【解决方案2】:

    适用于 Swift 5

    let titleView = createTitleLabel() // Create UILabel view with specific settings
    titleView.widthAnchor.constraint(equalToConstant: 165).isActive = true
    let title = UIBarButtonItem(customView: titleView)
    

    【讨论】: