Вызывается ли layoutSubviews при изменении размера представления? - PullRequest
8 голосов
/ 04 сентября 2011

По моему мнению, при autoresizesSubviews = YES layoutSubviews следует вызывать каждый раз, когда изменяется размер представления. Но я обнаружил, что это не тот случай, на мой взгляд. Мои ожидания неверны?

Ответы [ 4 ]

6 голосов
/ 06 сентября 2011

Согласно источникам в Apple,

"- [UIView layoutSubviews] должен вызываться при изменении размера представления."

Они также отсылали меня к этому из Руководства по программированию представления для iOS:

"Всякий раз, когда изменяется размер представления, UIKit применяет поведение автоматического изменения размера подпредставлений этого представления и затем вызывает метод layoutSubviewsчтобы позволить ему вносить изменения вручную. Вы можете реализовать метод layoutSubviews в пользовательских представлениях, когда сами по себе действия по изменению размера не дают желаемых результатов. "

На данный момент, ваш лучший шаг - создать небольшой пример проекта, в котором layoutSubviews не будет вызван (или отправить ваш существующий проект) ошибку в Apple, используя BugReporter , и включить этот пример проекта сваш баг.

1 голос
/ 05 сентября 2011

Если вам нужно, чтобы что-то происходило при изменении размера вашего представления, вы также можете переопределить setBounds: и setFrame: для вашего класса, чтобы убедиться, что это произойдет.Это выглядело бы примерно так

-(void)setBounds:(GCRect newBounds) {
    // let the UIKit do what it would normally do
    [super setBounds:newBounds];

    // set the flag to tell UIKit that you'd like your layoutSubviews called
    [self setNeedsLayout];
}

-(void)setFrame:(CGRect newFrame) {
    // let the UIKit do what it would normally do
    [super setFrame:newFrame];

    // set the flag to tell UIKit that you'd like your layoutSubviews called
    [self setNeedsLayout];
}

Другая причина, по которой я иногда переопределяю эти методы (временно), заключается в том, что я могу остановиться в отладчике и посмотреть, когда их вызывают и по какому коду.

0 голосов
/ 11 сентября 2013

всякий раз, когда вы хотите изменить размеры представлений вручную и автоматически изменяет размеры, вызывайте layoutSubViews метод

-(void)layoutSubviews
{

    [super layoutSubviews];

    CGRect contentRect = self.contentView.bounds;

    CGFloat boundsX = contentRect.origin.x;

    CGRect frame,itemlabelframe,statuslabelframe;

    frame= CGRectMake(boundsX+1 ,0, 97, 50);

    itemlabelframe=CGRectMake(boundsX+100, 0, 155, 50);

    statuslabelframe=CGRectMake(boundsX+257, 0, 50, 50);
    ItemDescButton.frame=itemlabelframe;


    priorityButton.frame = frame;
    statusButton.frame=statuslabelframe;
    //    ItemDescLabel.frame=itemlabelframe;
    //    statusLabel.frame=statuslabelframe;

}
0 голосов
/ 04 сентября 2011

Насколько я понимаю, layoutSubviews вызывается при изменении границ представления. Это означает, что если его позиция в суперпредставлении изменится (но не в размере), то layoutSubviews не изменится (поскольку начальная точка в границах находится в системе координат представления - поэтому она почти всегда равна 0,0). Короче говоря, только изменение размера вызовет это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...