ios – UIView Autoresizing

我可以轻松地花几个小时(如果不是几天)试图解决这个问题(我已经进入了几个小时!!!)

我有一个包含子视图的UIView(参见附图),在它被添加为任何东西的子视图之前构建.

在某个特定时间点,我将其作为子视图视图添加到UITableViewCell.我打电话

[tableViewCell.contentView addSubview:mySubview]
    //....
[mySubview setBounds:tableViewCell.contentView.bounds]

当我开始我的子视图时,我有:

[self setAutoresizesSubviews:YES]

从我的图形,你可以看到我假设只有宽度改变.我需要做些什么来使mySubview的右侧子视图扩展到全宽,同时保持它的原始原点?

在我的思考中,我很容易接近这一切,我欢迎任何建议!

编辑
非常感谢你的帮助,Khanh Nguyen

因此,正如我之前所说,当我初始化v1时,(并且,根据定义v2)我不知道v1的维度.

当我知道我想要放置v1的边界时,我假设我可以做这样的事情:

[v1 setBounds:(some CGRECT)];
v2.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;

或者我只是在实例化它时立即在v2上设置autoresizingMask(当我还不知道v1的尺寸时)?

最佳答案 如果你有一个视图v1,它的子视图v2,你希望v2有固定的左边缘,而当v1调整大小时它的宽度会改变(即v1的右边缘和v2的右边缘之间的距离是常数),请使用:

v2.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;

对于Swift:

v2.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleBottomMargin]

默认情况下,autoresizesSubviews为YES.您无需进行设置.

编辑

每个视图都有尺寸,即使你不知道它(如果你想知道它,只需要做一个NSLog).如果视图刚刚初始化,则其尺寸可能是(0,0). autoresizesSubviews甚至可以在这种情况下工作,只要您知道子视图和超级视图之间需要多少间距.

例如,您希望v2是左边距v1为10px,右边距为20px,以下情况如下

// v1 has been initialized, and its dimensions are unknown (to you)
// It's probably (0, 0), but that doesn't matter
// 30px = 10px + 20px
v2.frame = CGRectMake(10, 0, v1.bounds.size.width - 30, 100);
v2.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;

注意第三行,如果v1最初为零,则v2.frame将设置为某些负数,但是当v1的帧设置为其正确大小时(由您或UITableViewCell设置),v2将相应地调整大小(因为自动调整大小)约束)并成为你想要实现的目标.

点赞