Подтвердить что ты не робот

Проблема с автоматической компоновкой на iOS 8 (код отлично работает на iOS 7)

У меня есть приложение, которое было построено с помощью auto-layout, и все работает по-прежнему, как и ожидалось, когда я запускаю его на своем устройстве iOS 7, однако, когда я запускаю его на устройстве iOS 8, некоторые из моих ограничений идут немного странно.

Я действительно испытал подобную проблему в другом приложении, но это была не большая проблема. Теперь я начинаю задаваться вопросом, является ли это ошибкой в ​​SDK iOS 8 или существует новый способ обработки автоматического макета в iOS8, о котором я не знаю.

Вот моя настройка: У меня есть UIView с UIImageView, встроенным внутри него. Как представление, так и изображение имеют ограничения, связывающие их нижний, передний и задний фронты с их супервизорами с константой = 0.

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

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

Что на самом деле происходит в iOS8: Вид контейнера сокращается, как ожидалось (он остается прижатым к бокам и внизу, а высота сжимается). UIImageView ведет себя так, как если бы он имел ограничение верхнего пространства с cosntant == 0. Вместо того, чтобы отрезать верхнюю часть изображения, все изображение сжимается. Так как у меня есть изображение в режиме AspectFit, стороны также зажимают, чтобы соотношение сторон было одинаковым (но сам образ просмотра остается прикрепленным к ведущему, заднему и нижнему краям, как это должно быть).

Как я это делаю: У меня есть уведомление, которое срабатывает из другой части моего кода, чтобы настроить ограничение верхнего уровня, подключенное к IBOutlet. Метод, который он вызывает, действительно очень прост:

- (void) setTopSpaceForContainerView:(NSNotification*) notif{
    containerView_TopSpace.constant = [[notif.userInfo objectForKey:kTopSpace] intValue];
    [self.view setNeedsUpdateConstraints];
    [self.view setNeedsLayout];
}

У кого-нибудь есть аналогичный опыт? Я пытаюсь найти обходной путь, но iOS 8 просто решил сжать изображение.

Спасибо, тонна!

4b9b3361

Ответ 1

Это определенно ошибка iOS 8. Я смог обойти его, отправив setNeedsLayout в вид контейнера (просмотр представления изображения).

Я вижу, что вы отправляете setNeedsLayout в self.view. Если этот код находится в вашем контроллере вида, то, думаю, self.view не является видом контейнера. Попробуйте отправить setNeedsLayout непосредственно в контейнер.

Демо-проект здесь.

enter image description here

Ответ 2

Попробуйте использовать UIViewContentModeScaleAspectFill и setClipsToBounds: NO