我正在使用图像视图在导航栏中显示图像 . 问题是由于后退按钮我无法正确设置它 . 我检查了相关问题,并且在我解决之前遇到了几乎相同的问题,但这次我不知道 .
之前我用假条形按钮解决了这个问题,所以我尝试在右侧(和左侧)添加假条形按钮,但它没有帮助 .
- (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
在同一侧有条形按钮 . 是否有任何解释为什么它可以使用以编程方式创建但不能与常用后退按钮一起使用的条形按钮?
10 回答
只要有足够的空间,
UINavigationBar
会自动将其titleView
居中 . 如果 Headers 不居中意味着 Headers 视图太宽而无法居中,并且如果您设置了backgroundColor,那么UIImageView
你正好发生了什么 .Headers 视图太宽,因为导航栏将使用
-sizeThatFits:
自动调整 Headers 大小以保存其内容 . 这意味着您的 Headers 视图将始终调整为图像大小 .两个可能的修复:
你正在使用的图像太大了 . 使用尺寸合适的44x44 pt图像,2x和3x版本 .
在常规UIView中包装UIImageView以避免调整大小 .
例:
Darren第二种方式的 Swift 3 版本中的一个例子:
我建议你覆盖函数 - (void)setFrame:(CGRect)fram像这样:
这样titleView.center始终是正确的位置
不要使用titleView .
只需将您的图像添加到navigationController.navigationBar即可
群力对我很有帮助 . 这是swift 2.3代码:
如果您正在使用笔尖中的自定义视图,请确保在nib文件上禁用自动布局 .
我创建了一个自定义
UINavigationController
,在你输入之后,你要做的唯一事情是当你想要显示时调用showNavBarTitle(title:font:)
,当你想隐藏时调用removeNavBarTitle()
:我发现调用
showNavBarTitle(title:font:)
和removeNavBarTitle()
的最佳位置分别位于视图控制器的viewWillAppear()
和viewWillDisappear()
方法中:1)您可以尝试通过调用将图像设置为UINavigationBar的背景图像
在
viewDidLoad
方法内 .这样它将始终居中,但如果你有一个带有长 Headers 的
back
按钮作为左侧导航项,它可以显示在你的徽标顶部 . 您可能应该首先创建与导航栏大小相同的另一个图像,然后在其中心绘制图像,然后将其设置为背景图像 .2)或者不是将图像视图设置为
titleView
,您可以尝试简单地将其添加为子视图,因此它不会具有与右侧和左侧条形按钮项相关的约束 .在Swift中,这对我有用,但它不是最好的解决方案(基本上,将它添加到navigationBar):
扩展Darren的答案,对我来说一个修复就是返回
sizeThatFits
,大小为UILabel
. 事实证明,这是在layoutSubViews之后调用的,因此标签有一个大小 .还要注意我有
+ titleInset*2
因为我设置水平约束如下: