Xcode - viewDidLayoutSubviews
У меня есть представление внутри viewController, я хотел, чтобы начать меньший вид за пределами viewController слева, и анимировать его в центр, когда я нажимаю кнопку. поэтому я сделал это так:
override func viewDidLayoutSubviews() {
smallView.center = CGPointMake(smallView.center.x - 400, smallView.center.y)
}
И это работает отлично!, проблема в том, что у меня есть текстовое представление внутри этого меньшего представления, и каждый раз, когда я начинаю редактировать его, оно выпрыгивает за пределы основного viewController прямо там, где он был, и мне нужно снова нажать кнопку, чтобы вывести его внутрь, Как это исправить?
PS: я попытался расположить его в центре, когда я начинаю редактировать текстовое представление следующим образом:
func textViewDidBeginEditing(textView: UITextView) {
smallView.center = CGPointMake(smallView.center.x + 400, smallView.center.y)
}
Но это не работает. и метод правильно подключен к textView (делегат)
PS2: у меня также есть imagePickerController внутри моего viewController.
1 ответ
ОК, так как вы используете Auto Layout.
Первое правило Auto Layout (вы увидите это в любой книге Auto Layout) заключается в том, что вы абсолютно не можете коснуться frame
или же center
зрения напрямую.
// don't do these
myView.frame = CGRectMake(0, 0, 100, 100);
// ever
myView.center = CGPointMake(50, 50);
Вы можете получить рамку и центр, но вы никогда не сможете установить рамку или центр.
Чтобы перемещать вещи с помощью Auto Layout, вам нужно обновить ограничения.
Например, если я настроил представление под названием myView
и хочу, чтобы он рос и уменьшался в высоте, я бы сделал что-то вроде...
- Установите верхнее ограничение для суперпредставления на 0.
- Установите левое ограничение на суперпредставление в 0.
- Установите правильное ограничение для суперпредставления на 0.
- Установите ограничение высоты 50 (например) и сохраните его в свойстве под названием
heightConstraint
,
Теперь, чтобы оживить изменение высоты, я делаю это...
self.heightConstraint.constant = 100;
[UIView animateWithDuration:1.0
animations:^ {
[self.view layoutIfNeeded];
}];
Это тогда оживит высоту от 50 (где это было, когда я установил это) до 100.
Это то же самое для ЛЮБОЙ анимации видов с использованием Auto Layout. Если бы (например) я сохранил левое ограничение, я мог бы изменить его, и оно увеличило бы и уменьшило бы разрыв от левого края суперпредставления до myView
,
На сайте Ray Wenderlich есть несколько действительно хороших руководств по AutoLayout. Я бы посоветовал вам взглянуть на них.
Что бы вы ни делали, я бы настоятельно рекомендовал не просто отключать Auto Layout. Если вы не знаете, как использовать Auto Layout, вы очень быстро отстанете с iOS 8 и новыми размерами устройств.