2015-02-20 4 views
1

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, но он не работает, и я получаю ту же ошибку сообщение как раньше.

Неужели кто-то еще столкнулся с этой проблемой, и если да, то как вы ее решили?

Благодаря

+0

Это не обязательно ответ, а скорее наблюдение. Учитывая, что обсуждения AutoLayout для UINavigationBars мало или вообще не обсуждаются, похоже, что эта проблема неразрешима. Я начинаю думать, что подход, взятый выше, не обязательно правильный подход, поскольку я не видел, чтобы он обсуждался где-то еще и не мог найти ответ нигде вообще, несмотря на то, что более 24 часов травля Интернета пытались найти решение. Я считаю, что есть лучшее решение, чем использование вычислений на основе фрейма - должно быть - особенно, учитывая, что AutoLayout остается здесь. – matfin

+0

Я буду придерживаться другого подхода к этой проблеме и документирую все, что я сделал, в надежде, что это поможет другим, столкнувшимся с этой проблемой. Совет, который я прочитал до сих пор, заключается в том, чтобы не вмешиваться в подвыборы внутри панели UINavigation. – matfin

ответ

0

Хотя, строго говоря, этот ответ не является решением проблемы, я надеюсь, это поможет кому-то, кто сталкивался с этой проблемой.

От большего количества обсуждений и исследований в решении я могу подтвердить, что использование Autolayout на подзонах внутри UINavigationBar не является хорошей практикой, и попытка сделать это приведет вас к кроличьей дыре, где в будущем могут возникнуть дополнительные проблемы ,

Моя рекомендация - не пытаться это сделать, потому что последующие выпуски iOS могут сломать ваш код.

Смежные вопросы