我正在开发一款iOS 6和7应用程序,要求导航栏比通常的44/64分高
我搜索过高和低,到目前为止,似乎最干净的解决方案是使用类别(或子类)并实现- (CGSize)sizeThatFits:(CGSize)size
方法返回不同的大小。
这样可以正常制作,但这样做会导致里面的所有物品都停留在导航栏的底部,而我想让它们居中。 我尝试使用Appearance Proxy协议来定义按钮的垂直偏移,特别是此代码
[[UIBarButtonItem appearance] setBackgroundVerticalPositionAdjustment: -10 forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackButtonBackgroundVerticalPositionAdjustment: -10 forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment: -10 forBarMetrics: UIBarMetricsDefault];
在iOS 6上工作得很好,产生了这个结果
但是在iOS 7上不起作用,而是给我这个。
我已经读过iOS 7下的调整仅在使用自定义视图时有效但对我来说似乎很奇怪,特别是考虑到setBackButtonTitlePositionAdjustment:forBarMetrics:
实际上移动了后退按钮的文本,而不是雪佛龙和那个实际上这个标题确实很轻松。
我也尝试过一个子类化路由,使用layoutSubviews向下移动UINavigationBar中的视图。 这很有效,但当按下新的视图控制器时,按钮会在过渡期间跳转。
我错过了什么吗?提前致谢
更新我已经编辑了描述,以便更清楚我的问题是关于栏内的内容,而不是栏本身。
答案 0 :(得分:8)
我发现这个问题的最干净的解决方案是使用我自己的UINavigationBar
子类,并通过覆盖layoutSubviews
方法垂直居中按钮:
- (void)layoutSubviews
{
[super layoutSubviews];
NSArray *subviews = self.subviews;
for (UIView *view in subviews) {
if ([view isKindOfClass:[UIButton class]]) {
view.frame = ({
CGRect frame = view.frame;
CGFloat navigationBarHeight = CGRectGetHeight(self.frame);
CGFloat buttonHeight = CGRectGetHeight(view.frame);
frame.origin.y = (navigationBarHeight - buttonHeight) / 2.0f;
frame;
});
}
}
}
要使UINavigationController
使用UINavigationBar
的子类,您可以使用initWithNavigationBarClass:toolbarClass:
初始值:
UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:nil];
答案 1 :(得分:0)
您是否尝试将以下代码添加到viewDidLoad
方法:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
Apple在迁移到iOS 7文档时快速解释:https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html
//将状态栏高度保持在上方。
答案 2 :(得分:0)
快速解决这个问题,除非你找到合适的解决方案,否则这肯定会有效;)
检查系统是否运行iOS7。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
{
// Add below code
}
将标签添加到导航栏:
UINavigationBar *bar = [self.navigationController navigationBar];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(110, 55, 150, 20)]; //Set the frame appropriate to your screen
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:14];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor blackColor];
label.highlightedTextColor = [UIColor blackColor];
[bar addSubview:label];
答案 3 :(得分:0)
Swift 3版本的Tiago他的回答
override func layoutSubviews() {
super.layoutSubviews()
subviews.filter { (subview) -> Bool in
return subview is UIButton
}.forEach { (subview) in
subview.center.y = frame.height / 2
}
}
调整titleView垂直位置
setTitleVerticalPositionAdjustment(-10, for: .default)
答案 4 :(得分:-1)
只需更改导航栏的框架即可更改导航栏的大小:
CGRect navigationBarFrame = self.navigationController.navigationBar.frame;