使用自动布局以编程方式更改框架

43

我有一个带有自动布局的UITableView,当屏幕底部出现GADBannerView时,我需要减小高度。

不幸的是,使用自动布局是无法修改框架的。解决方法是删除自动布局并手动设置框架。这非常危险,因为所有我的应用程序在3.5英寸和4.0英寸的显示器上都运行良好,并且删除自动布局会增加新的测试阶段和更多工作量。

即使启用了自动布局,是否有一种方法可以更改框架?


2
为您的约束创建一个出口,并在您的 GADBannerView 出现时更改其值。 - Bharat
你能举个例子更好地解释一下吗? - Fry
如何以编程方式更新UIView的常量高度约束? - AshvinGudaliya
4个回答

64

将你的UITableView底部布局的约束设置为0,并创建一个IBOutlet。现在假设你的GADBannerView高度是40,所以改变你的outlet.constant = 40;。关于如何创建IBOutlet并更改其值的更多信息,请参考此处此处,希望这可以帮助到你。

编辑:对于那些寻求示例的人,请遵循以下简单步骤(由于这是被接受的答案,我认为有一个示例是值得的。感谢@manujmv提供的示例)。

  1. 在您的界面中为视图创建高度约束。

  2. 然后在您的类中为此约束添加一个IBOutlet对象。 例如:

    @property (weak, nonatomic) IBOutlet NSLayoutConstraint *heightConstraint;

在连接面板中连接此对象。

  1. 然后根据需要更改此约束的值。

    self.heightConstraint.constant = 40;


12
有点晚了,但是将 self.translatesAutoresizingMaskIntoConstraints = YES; 添加到您的视图中可能会消除修改约束常数的需求。 - John Rogers
4
@JohnRogers的评论实际上是正确答案! - Benjamin

41

不要试图更改视图的框架,使用自动布局添加高度约束并减小此约束的值。执行以下步骤:

  1. 在您的界面中为视图创建一个高度约束。
  2. 然后在您的类中为此约束添加一个 IBOutlet 对象。例如:

     @property (weak, nonatomic) IBOutlet NSLayoutConstraint *heightConstraint;
    

    将此对象连接到您的连接面板中。

  3. 然后在需要时更改此约束的值。

  4.  self.heightConstraint.constant = 40;
    

7

还有一件事,当您更改约束条件时,您必须调用 [self.view layoutIfNeeded]; 方法。

祝您愉快 :)


2
你可以像这样找出约束条件
extension UIView {
    var heightConstaint: NSLayoutConstraint? {
        get {
            for constraint: NSLayoutConstraint in constraints {
                if constraint.firstAttribute == .height {
                    if constraint.relation == .equal {
                        return constraint
                    }
                }
            }
            return nil
        }

        set{
            setNeedsLayout()
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接