UIView自动调整大小

4
我可以轻松地花费数小时(甚至几天)来尝试解决这个问题(我已经花费了数小时的时间!!!)。
我有一个包含子视图的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时(当我还不知道v1的尺寸时)立即设置v2上的autoresizingMask,无论是使用Objective-C还是C语言?

一些问题:1. 你是否正在使用自动布局?2. 你确定你没有使用自动布局吗? - Andrea
谢谢 @Andrea 的回复。我只能告诉你的是,我没有使用Storyboard或Xib文件(一切都在编程中完成),并且我没有在我的代码中声明使用(或不使用)自动布局。 - Adam Jenkins
你是否设置了托管视图(mySubview)的自动调整掩码? - Andrea
@Andrea,不,我在原帖中提到的关于自动调整大小的设置就是我所设定的全部内容。 - Adam Jenkins
尝试在添加mySubviews之前加入以下代码:mySubview.autoresingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight - Andrea
1个回答

2

如果您有一个视图v1,它的子视图v2,并且您希望v2具有固定的左边缘,而当调整v1的大小时,v2的宽度会改变(即v1的右边缘和v2的右边缘之间的距离保持不变),请使用以下代码:

v2.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;

对于Swift:

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

autoresizesSubviews默认为YES,您无需设置它。

编辑

每个视图都有尺寸,即使您不知道它的尺寸(只需使用NSLog就可以了解)。如果视图刚初始化,其尺寸可能为(0,0)。autoresizesSubviews在这种情况下也有效,只要您知道需要在子视图和父视图之间留多少间距。

例如,如果您希望v2左边距离v1为10像素,右边距离为20像素,则可以使用以下代码:

// 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将设置为一些负数,但是当您或UITableViewCell将v1的frame设置为其正确的大小时,v2将相应地调整大小(由于自动调整大小约束),并成为您想要实现的确切大小。

这可能有所帮助,但还不确定。我正在对v1的某个未知上下文中的subView v2执行initWithFrame操作。当我最终在v1上执行setBounds时,v2是否应该自动变宽?请记住,在super的frame被定义之前,我已经执行了initWithFrame:CGRectMake(110,10,super.frame.size.width,super.frame.size.height)。 - Adam Jenkins
当调用这行代码时,你需要知道v1v2的确切尺寸。在这行代码之后,对v1宽度的更改将会传播到v2 - Khanh Nguyen

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