自动布局+尺寸类别:可以区分不同的iPhone X和其他设备吗?

时间:2019-05-07 10:45:44

标签: ios autolayout size-classes

虽然自动布局和大小类是定义不同约束的好方法,因此对于iPhone和iPad等不同设备而言,布局也不同,但似乎无法自动区分带(iPhone X,Xs等)设备和不带设备的设备。 (iPhone 8、8 Plus,7等)安全区域。

这正确吗?

我的一个ViewController使用ScrollView作为根视图。内容显示一些信息,并在按钮下方,该按钮位于屏幕底部附近,便于访问。

尽管此功能在类似iPhone X的设备上很好用,但如果不在没有安全区域的旧设备上滚动,则该按钮不可见。

我想使用尺寸类自动区分两种设备类型,以不同的方式放置按钮。但是,所有iPhone设备都具有紧凑的宽度和常规的高度。因此,没有办法使用尺寸类别为不同的iPhone设备进行布局。是否必须以编程方式执行此操作?

2 个答案:

答案 0 :(得分:1)

您是正确的,目前尚无法仅使用大小类来区分具有顶部和底部填充的设备与其他设备。

这是因为在其他iPhone(iPhone 8、8 Plus,7)中也存在“安全区域”,但是它等于视图控制器的前和后边距(safeAreaInsets = 0)。

Apple试图使我们的布局与safeAreaInsets值无关。

我同意您的看法,这将是非常有用的实现。

答案 1 :(得分:0)

您可以使用以下课程,

添加到您的项目并直接从情节提要中更改常量。

我已经很长时间没有更新了,因此您可能需要根据自己的要求使用

//
//  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
            }
        }
    }
}