2013-09-16 2 views
1

Я получаю странное поведение при использовании viewDidLayoutSubviews для организации элементов управления для контроллера вида. Я поставил несколько элементов управления (ярлыки, текстовые поля, сборщики дат и сегментированные элементы управления) на контроллере представления в построителе интерфейса. В viewDidLoad я скрываю некоторые из этих элементов управления, а остальные нужно переставить (перевернуть), чтобы не было пробелов, где скрытые элементы управления.UISegmentedControl не сохраняет свое начало кадра после viewDidLayoutSubviews

При загрузке представления viewDidLayoutSubviews срабатывает и все элементы управления расположены по желанию. Но тогда, если вы нажмете на сегментированный элемент управления, он «проиграет» его начало кадра и вернется в исходное местоположение от IB. Что такое стрельба, которая приведет к тому, что сегментированный элемент управления потеряет свою структуру кадра?

Затем, если вы редактируете текстовое поле, viewDidLayoutSubviews снова срабатывает, а сегментированный элемент управления возвращается в нужное место. Это не кажется подходящим - я не выполняю никаких setFrame или других действий, которые потребуют этого.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // arbitrarily hide two of the controls 
    _textField2.hidden = YES; 
    _textField4.hidden = YES; 
} 

- (void)viewDidLayoutSubviews { 
    // move the controls up in the view if any preceding controls are hidden 
    float currentYPosition = _textField1.frame.origin.y; 

    NSArray *arrayControls = @[_textField1, _textField2, _segmentedControl1, _textField3, _textField4, _textField5]; 

    for (int i=0; i < arrayControls.count; i++) { 
     // move the associated control...also capture the offset to the next label/control 
     UIView <NSObject> *object = (UIView <NSObject> *)[arrayControls objectAtIndex:i]; 
     float newYPosition = [self rearrangeFrame:object withCurrentYPosition:currentYPosition]; 

     // update our reference to the current Y position 
     currentYPosition = newYPosition; 
    } 
} 

- (float)rearrangeFrame:(id)controlObject withCurrentYPosition:(float)topSpaceToSuperview { 
    // input: control on the view that needs to be rearranged 
    // output: the updated y coordinate for the next control 

    float padding = 3.0f; 
    if ([controlObject conformsToProtocol:@protocol(NSObject)]) { 
     UIView <NSObject> *object = (UIView <NSObject> *) controlObject; 
     if (object.hidden) { 
      // return a box with a height of 0 if the control is hidden 
      [object setFrame:CGRectMake(object.frame.origin.x, topSpaceToSuperview, object.frame.size.width, 0)]; 
      return topSpaceToSuperview; 
     } else { 
      // update the y position of the control's frame origin 
      [object setFrame:CGRectMake(object.frame.origin.x, topSpaceToSuperview, object.frame.size.width, object.frame.size.height)]; 
      return topSpaceToSuperview + object.frame.size.height + padding; 
     } 
    } else { 
     return topSpaceToSuperview; 
    } 
} 

ответ

0

Возможно, это связано с тем, что автоматическая компоновка включена (по умолчанию она включена). При перемещении видов с автоматическим расположением макетов вам необходимо изменить ограничения, а не устанавливать кадры. Итак, чтобы решить эту проблему. вам нужно либо отключить автоматическую компоновку, либо изменить код для использования ограничений.

+0

Хорошо. Итак, нужно ли мне создавать все мои элементы управления программно, а затем назначать ограничения? Это похоже на работу, но я надеялся использовать IB для компоновки элементов управления, а затем просто переместить их. Это (добавление ограничений для существующего элемента управления), похоже, не работает. –

+0

@ ken-man, вы можете сделать IBOutlets для ограничений и изменить постоянный параметр, или удалить и заменить их, если вам нужно. Обычно, когда я живу, я просто изменяю постоянное значение в блоке анимации. – rdelmar

+0

Это сработало ... так просто, когда вы делаете это правильно. –

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