iphone - 以编程方式更改 View 尺寸时,Autolayout 似乎不起作用

标签 iphone ios uitableview autolayout

我有一个 UITableViewCell 的自定义子类,设置了一些约束。

问题是当我尝试像这样更改一个 View 的大小时:

CGRect frm = CGRectMake(0, 0, someValue, 30);
cell.indentView.frame = frm;

其他取决于 cell.indentView 宽度的 View 根本没有移动。

会是什么情况?

此代码将起作用:

// enumerate over all constraints
for (NSLayoutConstraint *constraint in cell.indentView.constraints) {
    // find constraint on this view and with 'width' attribute
    if (constraint.firstItem == cell.indentView && constraint.firstAttribute == NSLayoutAttributeWidth)
    {
        // increase width of constraint
        constraint.constant = someValue;
        break;
    }
}

最佳答案

这是因为您不能只更改具有自动布局约束的对象的框架(因为约束决定了位置,而不是手动设置 frame 属性 ... frame 属性将在重新应用约束时重置)。参见 this松散相关的帖子,其中演示了如何正确调整约束以移动 View 。 (在那种情况下,我们正在制作动画,这不是这里的问题,但它确实演示了如何调整约束以影响 UIView 的移动。)

简而言之,如果您想在自动布局中移动 UIView,您一定不要尝试更改 frame,而是调整约束本身。如果您为约束本身创建 IBOutlet 引用,这会得到简化,此时,您可以调整 NSLayoutConstraint常量


更新:

Egor 建议列举约束并编辑与所讨论的约束相匹配的约束。这很好用,但就我个人而言,我更喜欢为我要编辑的特定约束使用 IBOutlet,而不是枚举它们并寻找有问题的约束。如果你有一个名为 indentViewWidthConstraintIBOutlet 用于 indentView 的宽度 NSLayoutConstraint,那么你可以简单地:

self.indentViewWidthConstraint.constant = newIndentConstantValue;

关于iphone - 以编程方式更改 View 尺寸时,Autolayout 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14215641/

相关文章:

ios - Xcode 8 中的使用说明

ios - 将 NSDictionary 值转换为 NSString

ios - Foursquare "Missing access credentials"用于使用客户端 ID 和客户端 key 进行 field 搜索

ios - 连接到原型(prototype)单元时无法使单元出列错误

ios - 如何在另一个 pod .podspec 文件中添加私有(private) CocoaPod 作为依赖项?

ios - 如何使用自定义转换 ios7 制作 uiview 全屏 View Controller

iOS自动布局-将位于tableviewcell内的 View 移动到屏幕中央

ios - 记住 tableView 中选定的单元格

iphone - ScrollView 中的 UITableView

iphone - 应用未运行时检查 JSON 内容的变化