A UISlider
рисует себя, используя подвид для большого пальца и частей дорожки. Вот вид иерархии тривиальный тест приложения:
<UIWindow: 0x7d26cf90; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x7d2609a0>; layer = <UIWindowLayer: 0x7d25f0c0>>
| <UIView: 0x7d27d530; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x7d27cec0>>
| | <UISlider: 0x7d27d700; frame = (14 225; 292 31); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7d27d960>; value: 0.513699>
| | | <UIView: 0x7b755a50; frame = (150 15; 140 2); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7b7559d0>>
| | | | <UIImageView: 0x7b7551d0; frame = (-148 0; 288 2); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7b755410>>
| | | <UIImageView: 0x7b755640; frame = (2 15; 148 2); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7b755720>>
| | | <UIImageView: 0x7d5c3450; frame = (134 0; 31 31); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7d5c4750>>
| | | | <UIImageView: 0x7d5c44a0; frame = (-13 -6.5; 57 43.5); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7d5c6c20>>
| | <_UILayoutGuide: 0x7d27daa0; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x7d27ccf0>>
| | <_UILayoutGuide: 0x7d27e020; frame = (0 480; 0 0); hidden = YES; layer = <CALayer: 0x7d27e0f0>>
Обратите внимание, что UISlider
имеет в общей сложности пять потомков просмотров. Это деталь реализации, на которую нельзя положиться, но полезно понять, что происходит.
Когда ползунок должен изменить свое значение, он сохраняет свое новое значение в переменной экземпляра и устанавливает свой собственный флаг needsLayout
. В конце концов, цикл выполнения достигает фазы макета, а макет иерархии представлений обновляется, начиная с окна и прокладывая путь вниз по иерархии. Когда он достигает ползунка, слайдер обновляет свои кадры subviews в соответствии со своим значением и другими переменными экземпляра.
Если вам нужно знать размер подзаголовка, вы можете сами позвонить по телефону layoutIfNeeded
, а затем сразу получить размер подзаголовка, чтобы макет выполнялся под вашим контролем.
Нет такого метода, как 'viewDidLoadSubviews'. Что вы на самом деле имеете в виду? – rmaddy
Вы имеете в виду viewDidLayoutSubviews? –
«Мой метод ViewControllerDidLayoutSubviews() вызывается повторно« Ну и что? Когда вызываемые методы времени просмотра контроллера вызваны не до вас. Ваша задача - внедрять и реагировать на них по мере необходимости. В чем вопрос, даже? – matt