导航栏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,在这里你应该改变高度0到44或任何你想要的。 而且也做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
为运行iOS 11.X的用户编写限制条件。 但是,对于运行iOS 10.X的用户来说,条形button仍然很紧张。 我猜AppStore的审查者是运行iOS 11.X因此无法识别我的问题,所以我的应用程序准备出售和上传..
我的解决scheme是在另一个软件中将我的图像尺寸更改为30×30(以前的图像尺寸为120×120)。
更改widthAnchor
/ heightAnchor
仅适用于iOS 11+设备。 对于iOS 10设备,您需要使用经典的手动更改帧的方式。 问题是这两种方法都不适用于这两个版本,所以您绝对需要以编程方式交替取决于运行时版本,如下所示:
if #available(iOS 11.0, *) { button.widthAnchor.constraint(equalToConstant: 32.0).isActive = true button.heightAnchor.constraint(equalToConstant: 32.0).isActive = true }else { var frame = button.frame frame.size.width = 32.0 frame.size.height = 32.0 button.frame = frame }
我也通过实现intrinsicContentSize
为我想用作自定义视图的任何自定义UIView子类返回适当的大小而取得了成功。