iOS 界面生成器自动约束问题

iOS interface builder auto constraints problem

我目前正在尝试学习 iOS 开发,但是我被界面生成器困住了。我正在尝试做的实际上是非常基本的观点。不幸的是,我对“小于或等于”关系感到很困惑。我认为,如果将约束设置为小于或等于,则意味着当有大量 space 时,它的最大大小将保持不变,否则它会更小。事实证明,无论如何,它总是有最大的尺寸,这不是我想要达到的。

在iPhone11界面是这样的:

在iPhone8界面是这样的:

当然我现在还没有关于自动约束的所有必要知识,但也许有人知道在这种情况下问题出在哪里?另外,如果有任何关于界面生成器或一些好习惯的好教程,我将不胜感激。

谢谢 彼得

听起来您正在尝试根据设备的大小在输入之间创建间距?我不知道它是否会像你期望的那样,但我以前在不同的情况下不得不这样做。您可以使用类似 NSLayoutConstraint subclass 的内容来实现您想要的。本质上,根据约束是垂直还是水平,这个 class 会在运行时计算屏幕尺寸,并根据你给它的百分比值修改约束尺寸。

/// Layout constraint to calculate size based on multiplier.
class PercentLayoutConstraint: NSLayoutConstraint {

    @IBInspectable var marginPercent: CGFloat = 0

    var screenSize: (width: CGFloat, height: CGFloat) {
        return (UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height)
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        guard marginPercent > 0 else { return }
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: #selector(layoutDidChange),
            name: UIDeviceOrientationDidChangeNotification,
            object: nil)
    }

    /**
     Re-calculate constant based on orientation and percentage.
     */
    func layoutDidChange() {
        guard marginPercent > 0 else { return }

        switch firstAttribute {
        case .Top, .TopMargin, .Bottom, .BottomMargin:
            constant = screenSize.height * marginPercent
        case .Leading, .LeadingMargin, .Trailing, .TrailingMargin:
            constant = screenSize.width * marginPercent
        default: break
        }
    }

    deinit {
        guard marginPercent > 0 else { return }
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}

来源:https://basememara.com/percentage-based-margin-using-autolayout-storyboard/

所以,这似乎是您想要的那种东西。这是 6s:

这里是 iPhone 11:

这里是 iPhone 6s rotated:

如您所见,有四个 "groups" - 两个标签、标签和文本字段、第二个标签和文本字段以及按钮。它们在两个屏幕上从上到下均匀分布

这是正确的想法,不是吗?

那是怎么做到的呢?简单的。一个垂直 堆栈视图 填满屏幕,分布设置为等间距。在其中,一个 UIView 包含每个组(除了独立的按钮),并且每个 UIView 由其自己的高度约束赋予固定高度。还有更多内容,但这是问题的核心。一旦你有了它,你当然可以根据需要进一步调整。

绝对没有代码;整个过程在 Xcode 的 nib 编辑器 ("interface builder") 中很快就完成了配置。