我有一个继承自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:
iOS 7:
此外,当我尝试将分隔线高度设置为精确1时,它会在所有iOS版本中显示。
separatorLine = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetHeight(self.bounds) - 1, CGRectGetWidth(self.bounds), 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版本中。