Соотношение сторон при просмотре изображения на iPad не такое, как на iPhone - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь сделать игру Connect Four, и все работает нормально, за исключением того, что соотношение сторон на моей плате отличается, когда на iPad и когда на iPhone, и я не могу понять проблему , Это вызывает у меня проблемы, потому что я полагаюсь на соотношение сторон, чтобы иметь возможность рассчитать положение фигур, когда я их сбрасываю на доску.

Я сделал базовый c пример проблемы, и код выглядит следующим образом

override func viewDidLoad() {
    super.viewDidLoad()

    let guide = view.safeAreaLayoutGuide

    let bottomView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
    bottomView.backgroundColor = .red
    bottomView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(bottomView)
    NSLayoutConstraint.activate([
        bottomView.bottomAnchor.constraint(equalTo: guide.bottomAnchor),
        bottomView.leadingAnchor.constraint(equalTo: guide.leadingAnchor),
        bottomView.trailingAnchor.constraint(equalTo: guide.trailingAnchor),
        bottomView.heightAnchor.constraint(equalToConstant: 120)
    ])

    let image = UIImage(named: "Frontground")
    imageView = UIImageView(image: image)
    imageView.translatesAutoresizingMaskIntoConstraints = false

    view.addSubview(imageView)

    NSLayoutConstraint.activate([
        imageView.trailingAnchor.constraint(equalTo: guide.trailingAnchor),
        imageView.leadingAnchor.constraint(equalTo: guide.leadingAnchor),
        imageView.heightAnchor.constraint(equalTo: imageView.widthAnchor, multiplier: 329/389),
        imageView.bottomAnchor.constraint(equalTo: bottomView.topAnchor, constant: -32)
    ])
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let desiredAspectRatio = CGFloat(CGFloat(389)/CGFloat(329))
    let actualAspectRatio = imageView.frame.size.width/imageView.frame.size.height

    print("Desired Aspect Ratio is \(desiredAspectRatio), actual Aspect ratio is \(actualAspectRatio)")
}

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

Соотношение сторон на iPad не ТАКОЕ далекое, но этого достаточно, чтобы кусочки в конечном итоге не помещались точно в отверстия. Все отлично работает на iPhone версиях, хотя, хотя у меня соотношение сторон не точное, возможно, из-за того, что экран меньше, проблемы не так заметны.

Вот пример изображения, которое я использовал.

Sample Image

Когда я бегу на iPhone, я получаю: Требуемое соотношение сторон равно 1.182370820668693, фактическое соотношение сторон равно 1.1828571428571428

Когда Я запускаю на iPad, который я получаю: Требуемое соотношение сторон - 1.182370820668693, Фактическое соотношение сторон - 1.1824817518248176

Есть ли у меня возможность получить точное соотношение сторон, которое я хочу?

Любая помощь по вопрос будет принята с благодарностью.

Спасибо, Алан

1 Ответ

1 голос
/ 28 февраля 2020

Имейте в виду, что UIKit не может рисовать на частичных пикселях.

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

На этих устройствах мы получаем:

Ratio: 329.0 / 389.0 = 0.8457583547557841

iPad Pro 12.9
actual w: 1024.0 * 0.8457583547557841 = 866.0565552699229 ... but actual h: 866.0

iPad Pro 9.7
actual w:  768.0 * 0.8457583547557841 = 649.5424164524422 ... but actual h: 649.5

iPhone 8
actual w:  375.0 * 0.8457583547557841 = 317.15938303341903 ... but actual h: 317.0

iPhone 11
actual w:  414.0 * 0.8457583547557841 = 350.14395886889463 ... but actual h: 350.0

Так что ваше Фактическое соотношение сторон для разных размеров будет не будет точно так же.

Чтобы получить идеальное выравнивание по пикселям, вам необходимо учитывать это.

Также обратите внимание, что Точки не равны Пикселям . На устройствах с экранной шкалой 2x значения кадра могут быть округлены до 1/2 точки, поэтому вы можете получить высоту, например 649.5.

На 3x устройствах с масштабированием экрана значения кадра могут быть округлены до 1/3 точки, поэтому вы можете получить высоту 649.6666667 точек.

...