向UINavigationBar添加0.5点高度子视图,不在iOS7

时间:2015-06-05 10:02:00

标签: ios objective-c ios7 uiview uinavigationbar

我有一个继承自UINavigationBar的类,我想添加一个分隔线作为其子视图,以分隔导航栏和导航内容。

线条的高度定义如下。

#define SEPERATOR_LINE_HEIGHT (1.0f / [UIScreen mainScreen].scale)

我的代码:

@interface MyPopNavigationBar : UINavigationBar
@end

@implementation MyPopNavigationBar {
    UIView *separatorLine;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.clipsToBounds = YES;
        self.translucent = NO;

        separatorLine = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetHeight(self.bounds) - SEPERATOR_LINE_HEIGHT, CGRectGetWidth(self.bounds), SEPERATOR_LINE_HEIGHT)];
        separatorLine.backgroundColor = [UIColor redColor];
        separatorLine.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
        [self addSubview:separatorLine];
    }
    return self;
}

这适用于iOS 6和iOS 8(所有Retina),但我无法在iOS 7中看到separatorLine(也是Retina)!

iOS 6& 8:

iOS6_8

iOS 7:

iOS7

此外,当我尝试将分隔线高度设置为精确1时,它会在所有iOS版本中显示。

separatorLine = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetHeight(self.bounds) - 1, CGRectGetWidth(self.bounds), 1)];

allversion

出了什么问题?

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。它是autoresizingMask的错。我强烈怀疑这是iOS7的一个错误。

我在lldb中打印recursiveDescription,但发现在iOS7中separatorLine的高度已自动恢复为零!相比之下,iOS8中的值为0.5。

所以,删除这一行:

separatorLine.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;

再次使用layoutSubviews MyPopNavigationBar方法设置框架以使其正确:

- (void)layoutSubviews {
    [super layoutSubviews];
    separatorLine.frame = CGRectMake(0, CGRectGetHeight(self.bounds) - SEPERATOR_LINE_HEIGHT, CGRectGetWidth(self.bounds), SEPERATOR_LINE_HEIGHT);
}

然后该行显示在所有iOS版本中。