Update (23/02/2015)
Не делать то, что я пытаюсь сделать ниже. См. Обновленный ответ на этот вопрос.IOS 7: подклассы UINavigationbar сбой -layoutSubViews нужно вызвать супер
Я пытаюсь реализовать пользовательский UINavigationBar в своем проекте и использовать Autolayout для размещения изображения и текстового поля внутри него.
Я подклассы в UINavigationBar, добавил мой UIImageView с изображением и UITextField и попытался уложить его, используя AutoLayout, который прекрасно работает для прошивки 8 но он держит сбой на прошивке 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"];
КСН 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.'
Из этого сообщения, я попытался добавить функцию layoutSubviews в моем классе пользовательских UINavigationBar, но он не работает, и я получаю ту же ошибку сообщение как раньше.
Неужели кто-то еще столкнулся с этой проблемой, и если да, то как вы ее решили?
Благодаря
Это не обязательно ответ, а скорее наблюдение. Учитывая, что обсуждения AutoLayout для UINavigationBars мало или вообще не обсуждаются, похоже, что эта проблема неразрешима. Я начинаю думать, что подход, взятый выше, не обязательно правильный подход, поскольку я не видел, чтобы он обсуждался где-то еще и не мог найти ответ нигде вообще, несмотря на то, что более 24 часов травля Интернета пытались найти решение. Я считаю, что есть лучшее решение, чем использование вычислений на основе фрейма - должно быть - особенно, учитывая, что AutoLayout остается здесь. – matfin
Я буду придерживаться другого подхода к этой проблеме и документирую все, что я сделал, в надежде, что это поможет другим, столкнувшимся с этой проблемой. Совет, который я прочитал до сих пор, заключается в том, чтобы не вмешиваться в подвыборы внутри панели UINavigation. – matfin