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") 中很快就完成了配置。
我目前正在尝试学习 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") 中很快就完成了配置。