Почему я не могу изменить рамки моего UILabel?
Я пытаюсь в течение двух дней изменять кадр UILabel
, который
смешно... UILabel
- это IBOutlet, но это не причина
почему он не работает: я попытался создать UILabel
программно и
он все еще не работает. Вот как я это делаю:
self.descriptionLabel.text = description;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0]
constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX)
lineBreakMode:self.descriptionLabel.lineBreakMode];
CGFloat frameHeight = textSize.height;
CGRect frame = self.descriptionLabel.frame;
frame.size.height = frameHeight;
self.descriptionLabel.frame = frame;
CGRect bounds = self.descriptionLabel.frame;
bounds.origin.x = self.descriptionLabel.frame.origin.x + 10.0;
bounds.size.width = self.descriptionLabel.frame.size.width - 20.0;
self.descriptionLabel.bounds = bounds;
self.descriptionLabel.numberOfLines = 0;
Я уже спросил IRC, и они сказали мне, что нет причин, по которым
кадр не будет изменен...
Я также попытался создать фрейм с CGRectMake
и дать ему произвольное
но это тоже не помогло.
Кто-нибудь знает, что может быть проблемой?
Изменить 1: Я зарегистрировал кадр до и после, и я получил нечетные результаты:
Before: 0.000000 0.000000 0.000000 0.000000
After: 0.000000 0.000000 0.000000 33525.000000
Высота после того, как я установил фрейм, является единственным значением, которое имеет смысл (у меня есть много текста в ярлыке).
Изменить 2: Я изменил код следующим образом: в журнале говорится, что кадр
изменен, но на симуляторе он не изменился; Я доказал это, добавив красный
граничит со слоем UILabel
.
self.descriptionLabel.text = description;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0]
constrainedToSize:CGSizeMake(self.view.frame.size.width, FLT_MAX)
lineBreakMode:self.descriptionLabel.lineBreakMode];
CGFloat frameHeight = textSize.height;
CGRect frame = CGRectMake(0.0, 300.0, self.view.frame.size.width, frameHeight);
self.descriptionLabel.frame = frame;
DDLogInfo(@"After: %f %f %f %f", self.descriptionLabel.frame.origin.x, self.descriptionLabel.frame.origin.y, self.descriptionLabel.frame.size.width, self.descriptionLabel.frame.size.height);
// After: 0.000000 300.000000 320.000000 585.000000
self.descriptionLabel.numberOfLines = 0;
self.descriptionLabel.layer.borderColor = [UIColor redColor].CGColor;
self.descriptionLabel.layer.borderWidth = 2;
![Proof]()
Ответы
Ответ 1
Если вы используете автоматическую компоновку, вы не должны делать какие-либо настройки фреймов - либо отключите автомасштабирование, либо используйте ограничения, чтобы изменить размер вашей метки. Самый простой способ сделать это - дать метке ограничение по высоте (и ширину, если вы хотите иметь постоянную ширину) в IB, и сделать IBOutlet для него. Затем в коде измените постоянное значение этого ограничения на основе значения, которое вы получаете от sizeWithFont: constrainedToSize: lineBreakMode:.
Ответ 2
У вашей метки есть нулевой кадр, чтобы начать, поэтому, когда вы это сделаете:
CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0]
constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX)
lineBreakMode:self.descriptionLabel.lineBreakMode];
Вы просите метод sizeWithFont
сделать что-то практически невозможное - сообщите вам, какая высота требуется, если ширина не разрешена. Ответ, который он дает (33525.000000), вероятно, является высотой, если один символ разрешен в каждой строке или что-то в этом роде.
Итак, либо установите ширину метки перед запуском, либо укажите разрешенную ширину для метода sizeWithFont
, а затем установите размер метки с помощью ответа (а не только высоты).
Также рассмотрите, что вы пытаетесь сделать, изменив границы. Прокомментируйте код, пока вы не получите фрейм, по крайней мере, затем вы можете добавить его обратно и проверить, действительно ли он делает то, что вы хотите.