2014-02-20 5 views
2

У меня есть UIVIew с UILabel внутри, я хочу, чтобы UILabel и UIView обернули размер текстового содержимого. Итак, я вычисляю размер текста и устанавливаю рамку UIView и рамку UIlabel на новую высоту. UIView полностью изменяется, но UILabel не изменяется. Остается всегда одного размера. Не знаю, почемуИзменение размера UILabel не будет

Вот мой код:

[mylabel setNumberOfLines:0]; 
CGSize maximumLabelSize = CGSizeMake(mylabel.frame.size.width, 160); 
CGSize expectedLabelSize = [text sizeWithFont:mylabel.font 
             constrainedToSize:maximumLabelSize 
              lineBreakMode:mylabel.lineBreakMode]; 
CGRect newFrame = mylabel.frame; 
newFrame.size.height = expectedLabelSize.height; 
mylabel.frame = newFrame; 
mylabel.text = text; 

myView.frame = CGRectMake(myView.frame.origin.x, 
           myView.frame.origin.y, 
           myView.frame.size.width, 
           newFrame.size.height); 

PD: Я смены кадров в viewDidLayoutSubviews, я должен сделать это где-нибудь еще?

UPDATE: Я использую Autolayout с некоторыми ограничениями. Мне нужен Autolayout, потому что у меня есть панель навигации и приложение на основе вкладок.

+0

Этот код выглядит так, как будто он должен работать нормально. Вы настраиваете рамку метки где-нибудь еще в своем коде, который может перезаписать то, что вы здесь делаете? – Putz1103

+0

Не совсем: S, я использую автомат, возможно, это вызывает проблему. – 6rod9

+0

Я никогда не пользовался автозапуском, поэтому я не помогу. – Putz1103

ответ

4

Если вы используете Autolayout, ограничения компоновки будут определять, какими будут размеры представлений. Не рекомендуется использовать Autolayout, а также изменять рамки просмотров, потому что результаты не всегда предсказуемы.

Если вы хотите, чтобы UILabel был размером с UIView, убедитесь, что UILabel имеет ограничения по высоте и ширине, такие же, как UIView. UILabels имеют внутренний размер (размер, который должен иметь знак «должен»). Метка всегда будет пытаться быть ее внутренним размером, если не указано иное.

В представлении должно быть какое-то ограничение для того, что такое высота/ширина. если вы установите их в Xcode, установите IBOutlet в свой контроллер для этих ограничений и измените свойство constant.

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

[UIView animateWithDuration:.5f animations:^{ 
    [self.view layoutIfNeeded]; 
}]; 

вызова layoutIfNeeded вызовет ограничение Автокомпоновки быть перепроверено. вызов его внутри анимации будет анимировать измененные ограничения.

Из-за внешнего вида вы хотите, чтобы UILabel был ограничен одинаковой высотой/шириной, как UIView, и иметь IBOutlet для ограничения высоты на UIView. измените свойство constant на этом IBOutlet на нужную высоту, а затем вызовите layoutIfNeeded изнутри блока анимации.

+0

Действительно хороший ответ, и все мои сомнения! Я собираюсь попробовать подход ограничений и посмотреть, как это происходит. Спасибо! – 6rod9

+0

Придется удалить автозапуск, чтобы не возникало проблем при редактировании размеров по коду. +1 – voghDev

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