Классы Autolayout + size: можно ли отличить разные iPhone X от других устройств? - PullRequest
0 голосов
/ 07 мая 2019

Несмотря на то, что классы автоматического размещения и размера являются отличным способом определения различных ограничений и, следовательно, разной компоновки для разных устройств, таких как iPhone и iPad, кажется, что невозможно автоматически различать устройства с (iPhone X, Xs и т. Д.) И без(iPhone 8, 8 Plus, 7 и т. д.) безопасные зоны.

Это правильно?

Один из моих ViewControllers использует ScrollView в качестве корневого представления.Контент показывает некоторую информацию и находится под кнопкой, расположенной в нижней части экрана, чтобы быть легко доступной.

Хотя это прекрасно работает на устройствах, подобных iPhone X, кнопка не видна без прокрутки на старых устройствах без безопасных областей.

Я хотел бы использовать классы размеров, чтобы автоматически различать два типа устройств для позиционирования кнопки по-разному.Тем не менее, все устройства iPhone имеют компактную ширину и обычную высоту.Итак, нет ли способа использовать классы размеров для разметки под разные устройства iPhone.Нужно ли делать это программно?

Ответы [ 2 ]

1 голос
/ 07 мая 2019

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

Это потому, что «Безопасная зона» присутствует и в других iPhone (iPhone 8, 8 Plus, 7), но она равна начальным и конечным полям контроллеров представления (safeAreaInsets = 0).

Apple пытается сделать наши макеты независимыми от значения safeAreaInsets.

Я согласен с вами, что это было бы действительно полезным осуществлением.

0 голосов
/ 07 мая 2019

Вы можете использовать следующий класс,

Добавить в свой проект и изменить константу прямо из раскадровки.

Я не обновляю это уже долгое время, поэтому вам может потребоваться использовать его в соответствии с вашими требованиями

//
//  ConstraintHelper.swift
// 
//
//  Created by Prashant on 29/08/18.
//  Copyright © 2018 Prashant. All rights reserved.
//

import Foundation

import UIKit


@IBDesignable
public class LayoutConstraint: NSLayoutConstraint {

    // MARK: ?3¨5


    @IBInspectable
    public var ?3¨5_const: CGFloat = 0 {
        didSet {

            if UIScreen.main.bounds.maxY == 480 {
                constant = ?3¨5_const
            }
        }
    }


    @IBInspectable
    public var ?3¨5_multip: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 480 {
                self.setValue(?3¨5_multip, forKey: "multiplier")
            }
        }
    }


    @IBInspectable
    public var ?3¨5_active: Bool = true {
        didSet {
            if UIScreen.main.bounds.maxY == 480 {
                isActive = ?3¨5_active
            }
        }
    }

    // MARK: ?4¨0


    @IBInspectable
    public var ?4¨0_const: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 568 {
                constant = ?4¨0_const
            }
        }
    }


    @IBInspectable
    public var ?4¨0_multip: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 568 {
                self.setValue(?4¨0_multip, forKey: "multiplier")
            }
        }
    }


    @IBInspectable
    public var ?4¨0_active: Bool = true {
        didSet {
            if UIScreen.main.bounds.maxY == 568 {
                isActive = ?4¨0_active
            }
        }
    }

    // MARK: ?4¨7


    @IBInspectable
    public var ?4¨7_const: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 667 {
                constant = ?4¨7_const
            }
        }
    }


    @IBInspectable
    public var ?4¨7_multip: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 667 {
                self.setValue(?4¨7_multip, forKey: "multiplier")
            }
        }
    }


    @IBInspectable
    public var ?4¨7_active: Bool = true {
        didSet {
            if UIScreen.main.bounds.maxY == 667 {
                isActive = ?4¨7_active
            }
        }
    }
    // MARK: ?5¨5


    @IBInspectable
    public var ?5¨5_const: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 736 {
                constant = ?5¨5_const
            }
        }
    }


    @IBInspectable
    public var ?5¨5_multip: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 736 {
                self.setValue(?5¨5_multip, forKey: "multiplier")
            }
        }
    }


    @IBInspectable
    public var ?5¨5_active: Bool = true {
        didSet {
            if UIScreen.main.bounds.maxY == 736 {
                isActive = ?5¨5_active
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...