2015-11-29 2 views
0

Метод My ViewController viewDidLayoutSubviews() вызывается повторно, когда я перемещаю UISlider. (Мне нужно было его вызвать один раз, чтобы я мог определить размер подзаголовка - viewDidLoad() был слишком ранним в этом процессе, но он называется ad infinitum, когда я перетаскиваю UISlider.)Почему viewDidLayoutSubviews() вызывается при перемещении UISliders?

Любые идеи были бы оценили!

+1

Нет такого метода, как 'viewDidLoadSubviews'. Что вы на самом деле имеете в виду? – rmaddy

+1

Вы имеете в виду viewDidLayoutSubviews? –

+0

«Мой метод ViewControllerDidLayoutSubviews() вызывается повторно« Ну и что? Когда вызываемые методы времени просмотра контроллера вызваны не до вас. Ваша задача - внедрять и реагировать на них по мере необходимости. В чем вопрос, даже? – matt

ответ

1

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, а затем сразу получить размер подзаголовка, чтобы макет выполнялся под вашим контролем.

0

Поскольку вы упоминаете viewDidLoad, находясь слишком рано, вы могли бы сделать свои расчеты в viewWillAppear: или viewDidAppear:?

viewDidLayoutSubviews вызывается несколько раз по нескольким причинам. Вы не можете полагаться на или изменять частоту вызываемого вызова (например, он вызывается, когда строка состояния меняет высоту).

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