Я получаю странное поведение при использовании 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;
}
}
Хорошо. Итак, нужно ли мне создавать все мои элементы управления программно, а затем назначать ограничения? Это похоже на работу, но я надеялся использовать IB для компоновки элементов управления, а затем просто переместить их. Это (добавление ограничений для существующего элемента управления), похоже, не работает. –
@ ken-man, вы можете сделать IBOutlets для ограничений и изменить постоянный параметр, или удалить и заменить их, если вам нужно. Обычно, когда я живу, я просто изменяю постоянное значение в блоке анимации. – rdelmar
Это сработало ... так просто, когда вы делаете это правильно. –