Как узнать точную структуру представления UIViewController? - PullRequest
5 голосов
/ 16 августа 2011

Когда можно узнать точный размер вида UIViewController?

Проблема

У меня есть многострочная UILabel, чья рамка зависит от текста и ширины родительского представления. Учитывая, что мне нужно расположить другие виды ниже UILabel, важно, чтобы его рамка точно соответствовала пространству текста.

В настоящее время я вычисляю размер как этот на viewDidLoad:

labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(self.view.frame.size.width, MAX_HEIGHT)];

Проблема в том, что ширина родительского представления изменяется, когда UIViewController используется в качестве модальной таблицы или всплывающего окна. Если я использую autoresizingMask, то рамка UILabel корректируется соответствующим образом, но она больше не подходит для текста.

Где я могу вычислить кадр этого UILabel, зная точный размер UIViewController's вида?

Усилия по отладке

Это результат печати self.view.frame при отображении UIViewController в виде листа модальной формы (UIModalPresentationFormSheet).

viewDidLoad: (0.000000;0.000000;320.000000;480.000000)
viewWillAppear: (0.000000;0.000000;768.000000;960.000000)
afterDelay: (0.000000;0.000000;540.000000;576.000000)

Код, который производит вышеуказанный вывод:

- (void)viewDidLoad {
    [super viewDidLoad];
    [Utils logFrame:self.view.frame tag:@"viewDidLoad"];
}

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [Utils logFrame:self.view.frame tag:@"viewWillAppear"];
    [self performSelector:@selector(afterDelay) withObject:nil afterDelay:0.1];
}

- (void) afterDelay {
    [Utils logFrame:self.view.frame tag:@"afterDelay"];
}

Ответы [ 4 ]

2 голосов
/ 16 августа 2011

Это потому, что корневое представление вашего UIViewController использует autoresizingMask. Я не думаю, что есть «идеальное время» для определения размера корневого представления вашего UIViewController, если вы не переопределите метод корневого представления «layoutSubviews».

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

Если вы не уверены, какие типы авторазмера используют ваши корневые представления, NSLog - ваш друг.

1 голос
/ 16 августа 2011

Это похоже на ошибку, значение должно быть известно в viewWillAppear.

Альтернативой является создание подкласса вашего UIView и переопределение там layoutSubviews для упорядочения подпредставлений на основе содержимого.Затем вам придется вызывать [self.view setNeedsLayout] с вашего контроллера представления каждый раз, когда вы обновляете содержимое метки.Система вызовет его, если размер представления изменится, так что это должно вас охватить.

0 голосов
/ 16 августа 2011

попробуйте viewWillAppear. Нет оснований не знать размер до того, как представление будет показано

0 голосов
/ 16 августа 2011

Попробуйте найти размер этикетки,

labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(self.label.frame.size.width, MAX_HEIGHT)];

Вместо использования ширины вида используйте ширину метки в ограниченном размере. Это должно быть доступно в методах viewDidLoad, viewDidApper контроллера представления.

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