iOS 7:Subclassed UINavigationbar崩溃-layoutSubViews需要调用super

时间:2015-02-20 14:00:23

标签: ios7 autolayout

更新(2015年2月23日)

不要做我在下面尝试做的事情。请参阅此问题下方的更新“回答”。

我正在尝试在我的项目中实现自定义UINavigationBar,并使用Autolayout在其中放置图像和文本字段。

我已经将UINavigationBar子类化,添加了我的UIImageView图像和UITextField,并尝试使用AutoLayout进行布局,这适用于iOS 8,但它在iOS 7上不断崩溃。

以下是子类UINavigationBar的代码

#import "SHNavigationBar.h"
#import "UIColor+SHColor.h"
#import "UIView+AutoLayout.h"
#import "UITextField+SHTextField.h"

@interface SHNavigationBar()
@property (nonatomic, strong) UIImageView *titleImage;
@end

@implementation SHNavigationBar

@synthesize searchTextField;
@synthesize titleImage;

- (id)initWithFrame:(CGRect)frame {
    if(self = [super initWithFrame:frame]) {
        [self setBarStyle:UIBarStyleBlack];
        [self setTranslucent:NO];

        /**
         *   autoLayoutView below is a category that calls 
         *   setTranslatesAutoresizingMaskIntoConstraints and sets it
         *   to NO for a view. 
         */
        self.titleImage = [UIImageView autoLayoutView];
        [self.titleImage setImage:[UIImage imageNamed:@"Shelfd"]];
        [self.titleImage setContentMode:UIViewContentModeScaleAspectFill];
        [self addSubview:self.titleImage];

        [self addConstraint:[NSLayoutConstraint constraintWithItem:self.titleImage attribute:NSLayoutAttributeLeading  relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0 constant:10.0f]];

        [self addConstraint:[NSLayoutConstraint constraintWithItem:self.titleImage attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]];


    }
    return self;
}

/**
 *  This does not seem to work
 */
- (void)layoutSubviews {
    [super layoutSubviews];
}

我使用以下代码将此子类UINavigationBar设置为导航控制器

self.featuredNavigationController = [[FeaturedNavigationController alloc] initWithNavigationBarClass:[SHNavigationBar class] toolbarClass:[UIToolbar class]];
[self.featuredNavigationController.tabBarItem setTitle:@"Featured"];

在iOS 7上,我收到的错误消息如下:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. SHNavigationBar's implementation of -layoutSubviews needs to call super.'

从这条消息中,我尝试在我的自定义UINavigationBar类中添加layoutSubviews函数,但它不起作用,我得到了与以前相同的错误消息。

有没有其他人遇到过这个问题,如果有,你是怎么解决的?

由于

1 个答案:

答案 0 :(得分:0)

虽然严格来说这个答案不是解决方案,但我希望它能帮助遇到此问题的其他人。

从更多的讨论和研究到解决方案,我可以确认在UINavigationBar中使用Autolayout对子视图并不是一种好的做法,尝试这样做会导致你陷入困境,将来会出现更多问题。

我建议不要尝试这样做,因为iOS的后续版本可能会破坏您的代码。