Используйте одно фоновое изображение программно для iPhone4 и iPhone5 с NSLayoutConstraint

Я пытаюсь не определять размер экрана iPhone 4 или 5, используя NSLayoutConstraint. Это мой код:

UIImageView *backgroundImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Flow-02"]];
[self.view addSubview:backgroundImage];
[self.view sendSubviewToBack:backgroundImage];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[backgroundImage]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(backgroundImage)]];

но это не работает.

Мое изображение Flow-02 имеет разрешение 640x1136, поэтому я думал, что оно подойдет для экрана, но это не так. Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: после ответа rmaddy ниже я добавил строку, которая устанавливает рамку изображения следующим образом:

backgroundImage.frame = self.view.bounds;

Это правильно устанавливает мое изображение на симуляторе iPhone 5, но на моем iPhone 4s оно все еще растянуто вбок.

Ни подход autoresizingMask, ни установка V и H на constraintsWithVisualFormat, предложенные Аниндей Сенгуптой, не имеют никакого эффекта.


person Eddy    schedule 20.03.2014    source источник
comment
но это не работает, не помогает в диагностике вашей проблемы. Какой результат вы видите? Вы видите какие-либо предупреждения в консоли? Вы добавили горизонтальные ограничители, а как насчет вертикальных — не думаете ли вы, что они тоже должны быть у вас?   -  person rdelmar    schedule 20.03.2014
comment
Если вы хотите использовать Layout Constraint, я бы порекомендовал использовать конструктор интерфейса (файл xib). Это будет намного проще   -  person Yossi    schedule 20.03.2014


Ответы (2)


Другой вариант будет примерно таким:

UIImageView *backgroundImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Flow-02"]];
backgroundImage.contentMode = UIViewContentModeScaleToFill;
backgroundImage.frame = self.view.bounds;
backgroundImage.autoResizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self.view addSubview:backgroundImage];
[self.view sendSubviewToBack:backgroundImage];

Имейте в виду, что любой из этих подходов является лишь хорошей идеей: изображение выглядит нормально при масштабировании по мере необходимости.

person rmaddy    schedule 20.03.2014
comment
Спасибо @rmaddy. Я отредактировал свой вопрос, чтобы отразить улучшение после вашего ответа и проблему, которая все еще остается. - person Eddy; 20.03.2014
comment
Попробуйте также добавить backgroundImage.contentMode = UIViewContentModeScaleToFill;. Возможно, вам понадобится другое значение в зависимости от ваших потребностей. - person rmaddy; 20.03.2014
comment
UIViewContentModeScaleAspectFill делает это. Спасибо. - person Eddy; 20.03.2014

Проблема в визуальном формате, который вы устанавливаете.

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[backgroundImage]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(backgroundImage)]];

Приведенный выше код прикрепляет backgroundImage к левой и правой сторонам контейнера. Но iPhone не толстеет, верно? Итак, давайте сделаем это дополнительно

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[backgroundImage]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(backgroundImage)]];

Я только что добавил V:, который сообщит компилятору, что нужно рассматривать его вертикально. Для Horizontal это было бы H: Если вы ничего не упомянули, по умолчанию это «Horizontal», но рекомендуется всегда упоминать его, чтобы сделать код более понятным.

person Anindya Sengupta    schedule 20.03.2014
comment
Спасибо @Anindya, но, похоже, это все еще не имеет никакого эффекта. Я отредактировал свой вопрос, чтобы отразить текущую ситуацию. - person Eddy; 20.03.2014