无法让 UIView sizeToFit 做任何有意义的事情
当我向 UIView
添加子视图时,或者当我调整现有子视图的大小时,我期望 [view sizeToFit]
和 [view sizeThatFits]
以反映这种变化。但是,我的经验是 sizeToFit
不执行任何操作,并且 sizeThatFits
在更改之前和之后返回相同的值。
我的测试项目有一个包含单个按钮的视图。单击该按钮会向视图添加另一个按钮,然后在包含的视图上调用 sizeToFit
。在添加子视图之前和之后,视图的边界都会转储到控制台。
- (void) logSizes {
NSLog(@"theView.bounds: %@", NSStringFromCGRect(theView.bounds));
NSLog(@"theView.sizeThatFits: %@", NSStringFromCGSize([theView sizeThatFits:CGSizeZero]));
}
- (void) buttonTouched {
[self logSizes];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(10.0f, 100.0f, 400.0f, 600.0f);
[theView addSubview:btn];
[theView sizeToFit];
[self performSelector:@selector(logSizes) withObject:nil afterDelay:1.0];
}
输出是:
2010-10-15 15:40:42.359 SizeToFit[14953:207] theView.bounds: {{0, 0}, {322, 240}}
2010-10-15 15:40:42.387 SizeToFit[14953:207] theView.sizeThatFits: {322, 240}
2010-10-15 15:40:43.389 SizeToFit[14953:207] theView.bounds: {{0, 0}, {322, 240}}
2010-10-15 15:40:43.391 SizeToFit[14953:207] theView.sizeThatFits: {322, 240}
我一定在这里遗漏了一些东西。
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
文档对此非常清楚。
-sizeToFit
几乎调用-sizeThatFits:
(可能以视图的当前大小作为参数),并且-sizeThatFits:
的默认实现确实如此几乎什么都没有(它只是返回它的参数)。某些 UIView 子类会重写
-sizeThatFits:
来执行更有用的操作(例如 UILabel)。如果您想要任何其他功能(例如调整视图大小以适合其子视图),您应该子类化 UIView 并重写-sizeThatFits:
。The documentation is pretty clear on this.
-sizeToFit
pretty much calls-sizeThatFits:
(probably with the view's current size as the argument), and the default implementation of-sizeThatFits:
does almost nothing (it just returns its argument).Some UIView subclasses override
-sizeThatFits:
to do something more useful (e.g. UILabel). If you want any other functionality (such as resizing a view to fit its subviews), you should subclass UIView and override-sizeThatFits:
.如果你不重写 UIView,你可以只使用扩展。
Swift:
相同的代码,但速度快了 3 倍:
If you won't override UIView, u can just use extension.
Swift:
The same code but 3 times faster:
您可以单独使用 IB (xcode 4.5) 执行类似操作:
UIView
,将content Hugging
拖动到 1(水平和垂直)constraints
下将>compressionresistance 更改为 1000(两者均适用),Width
并将priority
更改为 250UIView
的inset
来控制左/右/上/下的填充You can do some like that using IB alone (xcode 4.5):
UIView
content hugging
to 1 (both horizontal and vertical)compression resistance
to 1000 (for both)constraints
click onWidth
and changepriority
to 250UIView
'sinset
to control padding for left/right/top/bottom这对我有用。
This worked for me.