以编程方式定位 UIView 不起作用 - 坚持情节提要定位

Posted

技术标签:

【中文标题】以编程方式定位 UIView 不起作用 - 坚持情节提要定位【英文标题】:Position UIView programatically not working - stuck to storyboard positioning 【发布时间】:2016-05-20 00:15:10 【问题描述】:

我有以下限制:

@IBOutlet weak var square1ViewOutlet: UIView!

使用情节提要插入到以下视图中:

@IBOutlet weak var holderView: UIView!

我的问题是我无法覆盖故事板建立的square1ViewOutlet 的定位。以下代码没有任何作用。我尝试了如下的一些变体,但没有任何效果,并且 视图确实受制于以前的情节提要限制。我用我的 viewDidLoad 方法调用它。

    square1ViewOutlet.frame.origin.y = self.holderView.frame.origin.y + 20
    square1ViewOutlet.frame.origin.x = self.holderView.frame.origin.x + 20
    square1ViewOutlet.frame = CGRectOffset(CGRect(origin: square1ViewOutlet.frame.origin, size: square1ViewOutlet.frame.size), 20, 20)

    square1ViewOutlet.center = CGPointMake(150, 150)
    square1ViewOutlet.frame = CGRectMake( 100, 200, square1ViewOutlet.frame.size.width, square1ViewOutlet.frame.size.height )

知道我在这里做错了什么吗?

【问题讨论】:

更新你的约束而不是你的视图框架。见这里:***.com/questions/23655096/… 【参考方案1】:

当您使用自动布局并尝试像代码一样更改框架尺寸或位置时,为了更正所涉及的正确约束,您可以禁用约束效果,从而导致警告和意外的视图尺寸和移动。

正确的做法是在代码中将约束链接为 IBOutlets:

@IBOutlet weak var customViewTopConstraint: NSLayoutConstraint
@IBOutlet weak var customViewHeightConstraint: NSLayoutConstraint
@IBOutlet weak var customViewLeadingConstraint: NSLayoutConstraint
@IBOutlet weak var customViewWidthConstraint: NSLayoutConstraint

并使用这些属性更改它的常量值 (.constant)。 这些规则适用于您必须更改框架尺寸的所有代码,因此请检查所有代码并将其更改为约束工作。

【讨论】:

【参考方案2】:

您能否在您的 viewDidAppear() 方法中尝试该代码。请转到下面的链接ios UIViewController Lifecycle。

由于您已将代码放在viewDidLoad 方法中,这可能是您的框架未应用的原因。

如果这不起作用,请在设置框架后为您的视图尝试layoutIfNeeded 方法。 layoutIfNeeded 强制接收器在需要时立即布局其子视图。

通过这种方式,您可以为视图设置框架。但是这样做会改变您在 xib 文件中设置的约束。如果您真的想更改视图框架,那么最好的方法是为您的约束创建出口并更改该约束的值。希望这会有所帮助:)

【讨论】:

感谢您的回答,它现在适用于 viewDidAppear 和其他方法。你对生命周期的看法是对的,而我试图让它在 viewdidload 或 viewwillappear 上工作是错误的。

以上是关于以编程方式定位 UIView 不起作用 - 坚持情节提要定位的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在子视图中创建 UIButton 不起作用

ios UIViewController以编程方式定位按钮不起作用

以编程方式移动 UIView

Swift - 以编程方式在 UIView 中定位项目

UIButton 选择器方法不起作用

以编程方式创建 UIView 后滑块没有响应