在UINavigationBar中垂直居中的元素,具有自定义高度

时间:2014-01-02 12:31:13

标签: ios iphone ios7 uinavigationbar uibarbuttonitem

我正在开发一款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 6

但是在iOS 7上不起作用,而是给我这个。

iOS 7

我已经读过iOS 7下的调整仅在使用自定义视图时有效但对我来说似乎很奇怪,特别是考虑到setBackButtonTitlePositionAdjustment:forBarMetrics:实际上移动了后退按钮的文本,而不是雪佛龙和那个实际上这个标题确实很轻松。

我也尝试过一个子类化路由,使用layoutSubviews向下移动UINavigationBar中的视图。 这很有效,但当按下新的视图控制器时,按钮会在过渡期间跳转。

我错过了什么吗?提前致谢

更新我已经编辑了描述,以便更清楚我的问题是关于栏内的内容,而不是栏本身。

5 个答案:

答案 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;