Когда применяются классы размеров UIView, для UIView, загружаемого непосредственно из Xib?
Я запускаю 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;
}
}
В этом представлении используются классы размеров для любой ширины, любой высоты и любой ширины, компактной высоты.
У меня есть UIB-кнопка в 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, так как другие компоненты отображаются на экране правильно.
Итак, мне интересно, есть ли хорошая точка входа для меня, чтобы поймать, где применяются классы размеров, чтобы я мог правильно установить радиус угла фона кнопки. Я мог бы просто настроить кнопку программно, но я хотел бы выяснить, как это сделать, поскольку она, вероятно, снова возникнет в процессе преобразования в классы размеров.
5 ответов
Я знаю, что эта ветка старая, но я не вижу здесь хорошего ответа.
Классы размеров определены в traitCollectionDidChange: метод. Вы не можете гарантировать, что traitCollection установлен в initWithFrame:
или же awakeFromNib:
, Так что установите свой угловой радиус в traitCollectionDidChange:
метод, основанный на классах размера представления.
Как насчет этого?
-(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..
}
Это работает, если я поставлю его в конце функции init:
[self performSelector:@selector(updateButtonBackground) withObject:nil afterDelay:.001];
По-видимому, к этому моменту ограничения были установлены с размерами классов. Это, конечно, не идеал, поэтому, если у кого-то есть ответ, который определяется событиями или включает представление "жизненный цикл" (насколько это относится к UIView), я приму это...
Вам необходимо применить угловой радиус в viewDidLayoutSubviews
, Именно в этот момент вы знаете, что границы кнопки были установлены.
Вы можете увидеть пример в моем блоге.