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

  1. Установите верхнее ограничение для суперпредставления на 0.
  2. Установите левое ограничение на суперпредставление в 0.
  3. Установите правильное ограничение для суперпредставления на 0.
  4. Установите ограничение высоты 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 и новыми размерами устройств.

Другие вопросы по тегам