导航栏rightbaritem图像button错误的iOS 11

此代码在ios10中正常工作。 我得到我的标签和一个图像button,这是用户的照片configuration文件,圆形圆….好吧。 但是当运行xcode 9 ios11模拟器时,我把它拉长了。 button框架必须是32×32,当检查模拟和获取视图,并告诉xcode描述视图我得到的输出为170×32或类似的东西。

inheritance我的代码。

let labelbutton = UIButton( type: .system) labelbutton.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside) labelbutton.setTitleColor(UIColor.white, for: .normal) labelbutton.contentHorizontalAlignment = .right labelbutton.titleLabel?.font = UIFont.systemFont(ofSize: 18.00) let button = UIButton(type: .custom) button.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside) button.frame = CGRect(x: 0, y: 0, width: 32, height: 32) button.setTitleColor(UIColor.white, for: .normal) button.setTitleColor(UIColor.white, for: .highlighted) var buttomItem : UIBarButtonItem = UIBarButtonItem() buttomItem.customView = button buttomItem.target = self buttomItem.action = "ToLogin" var labelItem : UIBarButtonItem = UIBarButtonItem() labelItem.customView = labelbutton labelItem.target = self labelItem.action = "ToLogin" if let user = PFUser.current() { print("LOGIN : checkiando si existe usuario ") labelbutton.setTitle(USERNAME, for: UIControlState.normal) labelbutton.sizeToFit() if(user["profile_photo_url"] != nil) { print(" ENCONTRO PROFILE PHOTO URL NOT NIL Y ES \(user["profile_photo_url"])") let photoURL = user["profile_photo_url"] as! String let a = LoginService.sharedInstance a.downloadImage(url: photoURL, complete: { (complete) in if (complete) { button.setImage(LoginService.sharedInstance.profile_photo! , for: UIControlState.normal) button.layer.cornerRadius = 0.5 * button.bounds.size.width // button.imageView!.contentMode = .scaleAspectFit // button.imageView!.frame = CGRect(x: 0, y: 0, width: 40, height: 40) //button.imageView!.contentMode = .scaleAspectFit //button.imageView!.clipsToBounds = true //button.imageView!.layer.cornerRadius = 60 button.clipsToBounds = true self.NavigationItem.rightBarButtonItems = [buttomItem,labelItem] } }) } else { self.NavigationItem.rightBarButtonItem = labelItem } print(" EL FRAME DEL BUTTON ES \(button.frame)") } else { labelbutton.setTitle("Login", for: UIControlState.normal) labelbutton.sizeToFit() self.NavigationItem.rightBarButtonItem = labelItem } 

在这里输入图像说明

原因

出现这个问题是因为从ios 11 UIBarButtonItem使用autolayout而不是处理帧。

如果您使用Xcode 9,则应该为此图像button添加宽度约束。

  button.widthAnchor.constraint(equalToConstant: 32.0).isActive = true button.heightAnchor.constraint(equalToConstant: 32.0).isActive = true 

PS

button不是UIBarButtonItem ,它是UIBarButtonItem UIButton 。 你不应该为UIBarButtonItem设置约束,而应该为其中的元素设置约束。

感谢所有的贡献! 你们是对的! 为xcode9 ios11你需要把一个约束。

  let widthConstraint = button.widthAnchor.constraint(equalToConstant: 32) let heightConstraint = button.heightAnchor.constraint(equalToConstant: 32) heightConstraint.isActive = true widthConstraint.isActive = true 

那么,新的barButtonItem使用自动布局,而不是处理帧。

您添加到button的图像大于button尺寸本身。 这就是为什么button本身拉伸到图像的大小。 在将图像添加到button之前,必须调整图像的大小以匹配所需button的大小。

目标C代码现在已经过时了。 但是对于需要在iOS 11中构build/维护Objective C项目的用户,从Swift(Karoly Nyisztor答案)到Objective C的下列翻译将有所帮助。

 // UIView+Navbar.h #import <UIKit/UIKit.h> @interface UIView (Navbar) - (void)applyNavBarConstraints:(CGFloat)width height:(CGFloat)height; @end //---------- // UIView+Navbar.m #import "UIView+Navbar.h" @implementation UIView (Navbar) - (void)applyNavBarConstraints:(CGFloat)width height:(CGFloat)height { if (width == 0 || height == 0) { return; } NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:height]; NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:width]; [heightConstraint setActive:TRUE]; [widthConstraint setActive:TRUE]; } //---------- // Usage :- [button applyNavBarConstraints:33 height:33]; 

我写了一个微小的扩展名来设置导航栏项目的约束:

 import UIKit extension UIView { func applyNavBarConstraints(size: (width: CGFloat, height: CGFloat)) { let widthConstraint = self.widthAnchor.constraint(equalToConstant: size.width) let heightConstraint = self.heightAnchor.constraint(equalToConstant: size.height) heightConstraint.isActive = true widthConstraint.isActive = true } } // Usage button.applyNavBarConstraints(size: (width: 33, height: 33)) 

我使用以下几行来客观地做到这一点:

 NSLayoutConstraint * widthConstraint = [customButton.widthAnchor constraintEqualToConstant:40]; NSLayoutConstraint * HeightConstraint =[customButton.heightAnchor constraintEqualToConstant:40]; [widthConstraint setActive:YES]; [HeightConstraint setActive:YES]; UIBarButtonItem* customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customButton]; self.navigationItem.leftBarButtonItem = customBarButtonItem; 

感谢快乐编码!

我做了什么?

在我的应用程序中,我在navigationBar上的右边栏button项上添加了configuration文件图像。 在iOS 11之前,它工作正常,显示正常,但是当更新到iOS 11时,则改变行为

在这里输入图像说明

所以我在右键项目中添加UIView ,并将UIButton设置为UIView子视图? 如下所示,

在这里输入图像说明

我设置了UIButton高度和宽度约束。

在这里输入图像说明 在这里输入图像说明

而我的问题解决了。 不要忘了将UIView的背景色设置为清晰的颜色。

注意:如果你的button不起作用,那么检查你的UIView's高度可能是0,在这里你应该改变高度044或任何你想要的。 而且也做clipToBound = true ,现在你可以设置你的button的位置,这将是很好的工作。

即使iOS 11使用Autolayout导航栏,也可以使其传统设置框架。 这里是我的代码为ios11和ios10或更旧版本工作:

 func barItemWithView(view: UIView, rect: CGRect) -> UIBarButtonItem { let container = UIView(frame: rect) container.addSubview(view) view.frame = rect return UIBarButtonItem(customView: container) } 

这里是酒吧项目是如何组成的:

  let btn = UIButton() btn.setImage(image.withRenderingMode(.alwaysTemplate), for: .normal) btn.tintColor = tint btn.imageView?.contentMode = .scaleAspectFit let barItem = barItemWithView(view: btn, rect: CGRect(x: 0, y: 0, width: 22, height: 22)) return barItem 

我也通过实现intrinsicContentSize为我想用作自定义视图的任何自定义UIView子类返回适当的大小而取得了成功。

为运行iOS 11.X的用户编写限制条件。 但是,对于运行iOS 10.X的用户来说,条形button仍然很紧张。 我猜AppStore的审查者是运行iOS 11.X因此无法识别我的问题,所以我的应用程序准备出售和上传..

我的解决scheme是在另一个软件中将我的图像尺寸更改为30×30(以前的图像尺寸为120×120)。