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

Hai*_*ezu 5 iphone uinavigationbar uibarbuttonitem ios ios7

我正在开发一个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];
Run Code Online (Sandbox Code Playgroud)

在iOS 6上工作得很好,产生了这个结果

iOS 6

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

IOS 7

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

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

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

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

Tia*_*ago 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;
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

UINavigationController使用您的子类,UINavigationBar您可以使用initWithNavigationBarClass:toolbarClass:初始化器:

UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:nil];
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个`view.frame =({expression;})`巫术!不知道你能做到这一点.;-) (3认同)

kjh*_*kjh -1

您只需更改导航栏的框架即可更改导航栏的大小:

CGRect navigationBarFrame = self.navigationController.navigationBar.frame;