Раскадровка расширения фотографии с ошибкой Autolayout

Недавно я пишу расширение для фотографий для своего приложения.

Однако я обнаружил, что раскадровка расширения не может правильно определить кадр для каждого представления с помощью AutoLayout.

Например, я установил это в раскадровке:

введите здесь описание изображения

введите здесь описание изображения

Однако, когда я запускаю симулятор, он показывает: введите здесь описание изображения

Кроме того, когда я проверяю кадр для своего настроенного представления в didMoveToWindow(), он также показывает неправильный кадр:

(66.0, 512.0, 468.0, 30.0)

На самом деле, настроенный ползунок отлично работает в раскадровке моего приложения.

Что со мной не так?

Ps: ползунок здесь представляет собой настроенный UIView, а не UISlider


Изменить:

Заменив класс на UIView (с цветом) в раскадровке, я теперь уверен, что это не проблема ограничений Autolayout, потому что все работает нормально.

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

Итак, я не могу получить правильный кадр UIView в его методе didMoveToWindow() при использовании Autolayout?

Но это отлично работает в моем оригинальном приложении. Так что я в замешательстве.

Изменить2

Я использую функцию задержки для повторной проверки кадра через 5 секунд:

func delay(#seconds: Double, completion:()->()) {
    let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64( Double(NSEC_PER_SEC) * seconds ))
    dispatch_after(popTime, dispatch_get_main_queue()) {
    completion()
    }
}
override func didMoveToWindow() {
    delay(seconds: 5, {
        println(self.frame)
    })
}

Через 5 секунд кадр правильный! Таким образом, при вызове метода ограничения еще не применяются. Итак, теперь мне нужно получить обратный вызов в UIView, когда его ViewController superView завершит ViewDidLoad.

Изменить3

Я нахожу ответ. Я должен настроить фрейм subView в методе layoutSubviews() UIView. В этом случае я могу получить правильный кадр при использовании Autolayout.

На самом деле, после того, как ограничения UIView будут применены, он вызовет свой layoutSubviews()


person duan    schedule 14.04.2015    source источник
comment
неправильные ограничения.....   -  person EI Captain v2.0    schedule 14.04.2015
comment
ведущие ограничения пространства первого ползунка....   -  person EI Captain v2.0    schedule 14.04.2015
comment
512 и 468? это то, что вам нужно, чтобы исправить это!   -  person 13th Ghost    schedule 14.04.2015
comment
@Bhavin, слайдер здесь представляет собой настраиваемый UIView, а не UISlider.   -  person duan    schedule 14.04.2015


Ответы (2)


Прочтите это => это вам очень поможет :)

научитесь любить-auto-layout ИЛИ если вы хотите ПОЛЮБИТЬ AUTO LAYOUT… ПРОГРАММНО 1 i/p image2 i/p image выходное изображение

person Yuyutsu    schedule 14.04.2015
comment
ползунок здесь представляет собой настроенный UIView, а не UISlider - person duan; 14.04.2015
comment
хм.. я знаю, что заменить его на ваш UIView. Это просто для справки.. :) - person Yuyutsu; 14.04.2015
comment
Вы пробовали эти ограничения? Пожалуйста, попробуйте .. это может вам помочь :) - person Yuyutsu; 14.04.2015
comment
Поскольку у меня UIView, поэтому я должен дать ему постоянную высоту, за исключением этого, я думаю, что у нас есть один и тот же набор ограничений макета. - person duan; 14.04.2015
comment
Спасибо, тело, я думаю, что теперь нашел проблему, см. Мое редактирование вопроса. - person duan; 14.04.2015

Вместо того, чтобы давать хвостовое и начальное пространство, примените это простое ограничение.

  1. Сделайте свой рост постоянным (если хотите!)
  2. Поместите UIView в центр контейнера
  3. Дайте ограничение «Горизонтальный центр в контейнере»
  4. Примените соответствующие «верхнее пространство» и «нижнее пространство»

Вот и все! Готово.

person Sohil R. Memon    schedule 14.04.2015