2015-05-13 4 views
1

Я пытаюсь повлиять на NSLayoutConstraint в моем подклассе UIView. Однако, когда я помещаю код, он, похоже, не изменяет ограничение автоопределения.
Я использовал NSLayoutConstraint много раз, но по некоторым причинам не может ссылаться на него в подклассе.Изменение NSLayoutConstraint в подклассе UIView

Моего ограничение

self.ripHeight.constant 

Соединенного

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *ripHeight; 

Я попробовал его в init и awakeFromNib методах, как показано ниже

- (id)init { 
    self = [super init]; 
    if (self) { 

     //self.ripHeight.constant = 100; 

    } 
    return self; 
} 

-(void)awakeFromNib { 

    [super awakeFromNib]; 

    // 2 . Change Height of Ripll Container to suit device - bitch 
    CGRect screenRect = [[UIScreen mainScreen] bounds]; 
    CGFloat screenWidth = screenRect.size.width; 

    //Create Nib Frame 
    CGRect frameRect = self.frame; 
    frameRect.size.width = screenWidth; 
    frameRect.size.height = screenWidth * 1.3333; 
    self.frame = frameRect; 

    self.ripHeight.constant = 100; 

} 

Я загружающий вид в по

[self.ripContainer addSubview:customView]; 
+0

Как вы связываете высоту Rip с вашими ограничениями, чтобы ваш код работал - убедитесь, что NSLayoutConstriants настроены при выполнении этого вызова. В init слишком рано. – Volker

+0

где вы устанавливаете 'ripHeight'? Можете ли вы добавить объявление этого свойства? –

+0

Я связал свойство, как показано выше в коде. Это находится в пределах Nib. – Allreadyhome

ответ

0

Попробуйте обновить раскладку вручную, как только вы изменили ограничение:

-(void)awakeFromNib { 

    [super awakeFromNib]; 
    //... 
    //your code for constraint 

    [self.superview setNeedsLayout]; 
} 

- setNeedsLayout

Аннулирует текущую схему приемника и вызывает макет обновление во время следующего цикла обновления.

Обсуждение

Вызов этого метода на главном потоке вашего приложения, когда вы хотите настроить расположение подобозрения открывается вид в. Этот метод делает примечание запроса и немедленно возвращается. Поскольку этот метод делает , принудительное немедленное обновление, но вместо этого ожидает цикл следующего цикла , вы можете использовать его для отмены макета нескольких видов перед обновлением любого из этих представлений. Это позволяет вам объединить все ваши обновления макета в один цикл обновления, который обычно лучше для производительности.

+0

К сожалению, к сожалению, к сожалению – Allreadyhome

+0

, а затем после setNeedsLayout, выполнив [self.superview layoutIfNeeded]; ? – Niko

+0

Был ли мой последний комментарий дополнительным решением, чтобы заставить его работать? если так, то я отредактирую свой ответ, чтобы добавить его – Niko

0

Возможный подход к решению этого вопроса: awakeAfterUsingCoder.
Он работает как вид замещающего. Загрузите ваш взгляд здесь, а не в ViewController. Также установите ограничения компоновки прямо в XIB.

Для получения дополнительной информации см. Ссылку this.

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