Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Когда применяются классы размера UIView для загрузки UIView непосредственно из Xib?

Автор вопроса: DivideByZer0Ответов: 5

Я запускаю UIView с помощью xib программно:

- (id)initWithFrame:(CGRect)frame
{
    self = [[[NSBundle mainBundle] loadNibNamed:@"MyViewNib" owner:self options:nil] objectAtIndex:0];
    if (self)
    {
        //perform setup of various components

        return self;
    }
}

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

У меня есть UIButton в xib, на фоне которого мне нужно поместить круг, например:

self.closeButton.layer.cornerRadius = self.closeButton.frame.size.width / 2.0f;
self.closeButton.layer.backgroundColor = [UIColor colorWithWhite:164.0f / 255.0f alpha:1.0f].CGColor;

Если я попытаюсь установить угловой радиус кнопки в функции инициализации, когда я нахожусь на устройстве, использующем любую ширину, компактную высоту, рамка метки по-прежнему имеет значение "Любая ширина, любая высота". Я также пытался переопределить layoutSubviews и установить там значение, но безуспешно. Похоже, что ограничения класса размера применяются после layoutSubviews без другого вызова layoutSubviews, поскольку другие компоненты отображаются на экране правильно.

Итак, мне интересно, есть ли для меня хорошая точка входа, чтобы понять, где применяются классы размера, чтобы я мог правильно установить радиус угла фона кнопки. Я мог бы просто настроить кнопку программно, но я хотел бы выяснить, как это сделать, поскольку она, вероятно, снова появится в процессе преобразования в классы размеров.

iosobjective-cuiviewxibsize-classes

Ответы

Ответ 1 · TheSD

В вашем классе xib -(void)awakeFromNib;

Ответ 2 · DivideByZer0

Это работает, если я поставлю его в конец функции инициализации:

 [self performSelector:@selector(updateButtonBackground) withObject:nil afterDelay:.001];

По-видимому, к этому моменту ограничения были установлены с классами размеров. Это, безусловно, неидеально, поэтому, если у кого-то есть ответ, основанный на событиях или связанный с представлением "жизненного цикла" (насколько это применимо к UIView), я соглашусь с этим...

Ответ 3 · Subbu

Как насчет этого?

-(void)layoutSubviews
{
    [super layoutSubviews];
self.closeButton.layer.cornerRadius = self.closeButton.frame.size.width / 2.0f;
self.closeButton.layer.backgroundColor = [UIColor colorWithWhite:164.0f / 255.0f alpha:1.0f].CGColor;
//more of your changes
[self layoutIfNeeded]; // You can remove this line if it works without it for you..
}

Ответ 4 · vmeyer

Я знаю, что эта тема устарела, но я не вижу здесь хорошего ответа.

Классы размера определяются в методе traitCollectionDidChange:. Вы не можете гарантировать, что traitCollection установлен в initWithFrame: или awakeFromNib:. Поэтому установите радиус угла в методе traitCollectionDidChange: на основе классов размера представления.

Ответ 5 · рейтинг -1 · Lawrence MacFadyen

Вам нужно применить радиус угла в viewDidLayoutSubviews. Именно в этот момент вы знаете, что границы кнопки установлены.

Вы можете увидеть пример в моем блоге.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы