因为后退button,导航栏的中间不能设置titleView

我正在使用图像视图在导航栏中显示图像。 问题是由于后退button,我无法正确设置到中心。 我查了一下相关的问题,之前解决了几乎相同的问题,但这次我不知道。

早些时候,我用假酒吧button解决了这个问题,所以我尝试在右侧(和左侧)添加一个假酒吧button,但是这并没有帮助。

- (void) searchButtonNavBar { CGRect imageSizeDummy = CGRectMake(0, 0, 25,25); UIButton *dummy = [[UIButton alloc] initWithFrame:imageSizeDummy]; UIBarButtonItem *searchBarButtonDummy =[[UIBarButtonItem alloc] initWithCustomView:dummy]; self.navigationItem.rightBarButtonItem = searchBarButtonDummy; } - (void)setNavBarLogo { [self setNeedsStatusBarAppearanceUpdate]; CGRect myImageS = CGRectMake(0, 0, 44, 44); UIImageView *logo = [[UIImageView alloc] initWithFrame:myImageS]; [logo setImage:[UIImage imageNamed:@"color.png"]]; logo.contentMode = UIViewContentModeScaleAspectFit; self.navigationItem.titleView = logo; [[UIBarButtonItem appearance] setTitlePositionAdjustment:UIOffsetMake(0.0f, 0.0f) forBarMetrics:UIBarMetricsDefault]; } 

我认为它应该工作正常,因为在这种情况下, titleView在同一侧有栏button。 有没有解释为什么它与编程创build的栏button一起工作,但不能与公共后退button一起使用?

只要有足够的空间, UINavigationBar自动将它的titleView 。 如果标题不居中,这意味着标题视图太宽而无法居中,而且如果你设置了backgroundColor,如果你的UIImageView你会看到这正是发生了什么。

标题视图过于宽泛,因为导航栏会自动调整标题以保存其内容,使用-sizeThatFits: 这意味着您的标题视图将始终按照您的图像大小resize。

两个可能的修复:

  1. 你使用的图像太大了。 使用2x和3x版本的正确大小的44×44点图像。

  2. 将UIImageView封装在常规UIView中以避免resize。

例:

 UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.jpeg"]]; imageView.contentMode = UIViewContentModeScaleAspectFit; UIView* titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)]; imageView.frame = titleView.bounds; [titleView addSubview:imageView]; self.navigationItem.titleView = titleView; 

Darren第二种方式的Swift 3版本中的一个例子:

 let imageView = UIImageView(image: UIImage(named: "test")) imageView.contentMode = UIViewContentMode.scaleAspectFit let titleView = UIView(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) imageView.frame = titleView.bounds titleView.addSubview(imageView) self.navigationItem.titleView = titleView 

不要使用titleView。

只需将您的图像添加到navigationController.navigationBar

 CGRect myImageS = CGRectMake(0, 0, 44, 44); UIImageView *logo = [[UIImageView alloc] initWithFrame:myImageS]; [logo setImage:[UIImage imageNamed:@"color.png"]]; logo.contentMode = UIViewContentModeScaleAspectFit; logo.center = CGPointMake(self.navigationController.navigationBar.width / 2.0, self.navigationController.navigationBar.height / 2.0); logo.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; [self.navigationController.navigationBar addSubview:logo]; 

我build议你重写函数 – (void)setFrame:(CGRect)fram是这样的:

 - (void)setFrame:(CGRect)frame { [super setFrame:frame]; //systom function self.center = CGPointMake(self.superview.center.x, self.center.y); //rewrite function } 

这样titleView.center总是正确的位置

群力为我工作得很好 这里是快速的2.3代码:

 override var frame: CGRect { set(newValue) { super.frame = newValue if let superview = self.superview { self.center = CGPoint(x: superview.center.x, y: self.center.y) } } get { return super.frame } } 

如果您使用的是笔尖的自定义视图,请确保在nib文件上禁用自动布局。

1)您可以尝试通过调用将图像设置为UINavigationBar的背景图像

 [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"color.png"] forBarMetrics:UIBarMetricsDefault]; 

viewDidLoad方法里面。

这样它将始终居中,但是如果您将具有长标题的button作为左导航项目,则可能会出现在您的徽标顶部。 你应该首先创build另一个与导航栏大小相同的图像,然后在其中心绘制图像,然后将其设置为背景图像。

2)或者,您可以将图像视图设置为titleView ,而不是将图像视图设置为titleView ,只需添加at作为子视图,这样就不会有左右栏button项的约束。

我创build了一个自定义的UINavigationController ,当你想隐藏时,你只需要调用showNavBarTitle(title:font:)当你想要显示和removeNavBarTitle()

 class NavigationController: UINavigationController { private static var mTitleFont = UIFont(name: <your desired font (String)> , size: <your desired font size -- however, font size will automatically adjust so the text fits in the label>)! private static var mNavBarLabel: UILabel = { let x: CGFloat = 60 let y: CGFloat = 7 let label = UILabel(frame: CGRect(x: x, y: y, width: UIScreen.main.bounds.size.width - 2 * x, height: 44 - 2 * y)) label.adjustsFontSizeToFitWidth = true label.minimumScaleFactor = 0.5 label.font = NavigationController.mTitleFont label.numberOfLines = 0 label.textAlignment = .center return label }() func showNavBarLabel(title: String, font: UIFont = mTitleFont) { NavigationController.mNavBarLabel.text = title NavigationController.mNavBarLabel.font = font navigationBar.addSubview(NavigationController.mNavBarLabel) } func removeNavBarLabel() { NavigationController.mNavBarLabel.removeFromSuperview() } } 

我发现调用showNavBarTitle(title:font:)removeNavBarTitle()的最佳位置分别在视图控制器的viewWillAppear()viewWillDisappear()方法中:

 class YourViewController: UIViewController { func viewWillAppear() { (navigationController as! NavigationController).showNavBarLabel(title: "Your Title") } func viewWillDisappear() { (navigationController as! NavigationController).removeNavBarLabel() } } 

在Swift中,这对我来说是有效的,但它不是最好的解决scheme(基本上,将其添加到navigationBar中):

  let titleIV = UIImageView(image: UIImage(named:"some")) titleIV.contentMode = .scaleAspectFit titleIV.translatesAutoresizingMaskIntoConstraints = false if let navigationController = self.navigationController{ navigationController.navigationBar.addSubview(titleIV) titleIV.centerXAnchor.constraint(equalTo: navigationController.navigationBar.centerXAnchor).isActive = true titleIV.centerYAnchor.constraint(equalTo: navigationController.navigationBar.centerYAnchor).isActive = true } else{ view.addSubview(titleIV) titleIV.topAnchor.constraint(equalTo: view.topAnchor, constant: UIApplication.shared.statusBarFrame.height).isActive = true titleIV.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true }