изображения отображаются больше при программной загрузке на iPhone X, Xs? - PullRequest
0 голосов
/ 22 декабря 2018

У кого-нибудь была проблема с рендерингом изображений большего размера при программной загрузке на 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 Ответ

0 голосов
/ 23 декабря 2018

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

enter image description here


Я докажу это в два этапа.Во-первых, давайте поговорим только о представлении изображения, добавленном в код.Вот мой научный тестовый код (он написан на 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:

enter image description here

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

enter image description here

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


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

enter image description here

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

enter image description here

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

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

enter image description here

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


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

...