Изображения отображаются больше при программной загрузке на iPhone X,Xs?

У кого-нибудь были проблемы с рендерингом изображений при программной загрузке на iPhone X,Xs?

Если я добавляю изображение в раскадровку, оно корректно изменяет размер, однако, если я загружаю его программно, оно будет больше. Я использую Xcode 10.1. Я попробовал и файл launch.storyboard, и образы запуска, чтобы убедиться, что я правильно получаю доступ к iPhone X, Xs.

Изображения загружаются правильно на XsMax и XR. Я знаю X, Xs по-разному отображает пиксели. Это одно изображение, я не использую @2x, @3x и т. Д.

Если я добавлю элемент UIImageView в представление раскадровки, а его прямоугольник кадра (3,95) и (130x253) изображение будет выглядеть правильно в раскадровке и при запуске симулятора. Если я загружаю то же изображение, но делаю это программно, например:

UIImageView *dot =[[UIImageView alloc] initWithFrame:CGRectMake(3,95,130,253)];
dot.image=[UIImage imageNamed:@"apple.png"];
[TestView addSubview:dot];

Программно UIImageView выглядит больше, чем 130x253. Может быть, 1/3 больше?

Спасибо

1 ответ

Решение

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


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

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        for i in stride(from: 0, to: 500, by: 100) {
            let v = UIView(frame:CGRect(
                x: CGFloat(i), y: 20, width: 10, height: 50))
            v.backgroundColor = .black
            self.view.addSubview(v)
        }
        let im = UIImage(named:"bullwinkle2.jpg")!
        let iv = UIImageView(frame:CGRect(
            x: 0, y: 50, width: im.size.width, height: im.size.height))
        iv.image = im
        self.view.addSubview(iv)
    }
}

Вы видите, что я делаю? Сначала я строю своего рода "линейку" из черных подпредставлений, расположенных на расстоянии 100 пикселей друг от друга. Затем я создаю вид изображения и добавляю его, указывая ширину и высоту изображения.

Вот как это выглядит на симуляторе iPhone 5s:

Вот как это выглядит на симуляторе iPhone X:

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


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

Теперь я снова запускаю тот же код на симуляторе iPhone 8:

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

Хорошо, но теперь давайте снова запустим симулятор iPhone 5s:

Ага! Изображение раскадровки меньше из-за настроек авторазмера. Итак, вы видите, дело не в том, что изображение кода выходит слишком большим; это то, что изображение раскадровки иногда получается слишком маленьким.


Последнее замечание: ваша конечная цель - создать представление изображения в коде того же размера, что и представление изображения из раскадровки. Но причина , которая не всегда работает, состоит в том, что вы поместили этот код в viewDidLoad что слишком рано. Вы не знаете размер изображения раскадровки, пока не произойдет автоматическое изменение размера, а это означает, что viewDidLayoutSubviews должен был быть вызван. Это происходит позже, чем viewDidLoad,

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