UIView和它的子类都有frame和bounds属性。有什么不同?
当前回答
以上所有答案都是正确的,以下是我的看法:
为了区分框架和边界概念,开发者应该阅读:
相对于父视图(父视图),它包含在= FRAME中 相对于它自己的坐标系,决定了它的子视图location = BOUNDS
"bounds"是令人困惑的,因为它给人的印象是坐标是它所设置的视图的位置。但这些是有关系的,可以根据坐标系常数进行调整。
其他回答
UIView的边界是一个矩形,表示为相对于它自己的坐标系(0,0)的位置(x,y)和大小(宽度,高度)。
UIView的框架是一个矩形,表示为相对于它所包含的父视图的位置(x,y)和大小(宽度,高度)。
因此,想象一个视图的大小为100x100(宽x高),位于其父视图的25,25 (x,y)处。下面的代码打印出这个视图的边界和框架:
// This method is in the view controller of the superview
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"bounds.origin.x: %f", label.bounds.origin.x);
NSLog(@"bounds.origin.y: %f", label.bounds.origin.y);
NSLog(@"bounds.size.width: %f", label.bounds.size.width);
NSLog(@"bounds.size.height: %f", label.bounds.size.height);
NSLog(@"frame.origin.x: %f", label.frame.origin.x);
NSLog(@"frame.origin.y: %f", label.frame.origin.y);
NSLog(@"frame.size.width: %f", label.frame.size.width);
NSLog(@"frame.size.height: %f", label.frame.size.height);
}
这段代码的输出是:
bounds.origin.x: 0
bounds.origin.y: 0
bounds.size.width: 100
bounds.size.height: 100
frame.origin.x: 25
frame.origin.y: 25
frame.size.width: 100
frame.size.height: 100
我们可以看到,在这两种情况下,视图的宽度和高度是相同的不管我们是在看边界还是在看框架。不同之处在于视图的x,y定位。在边界的情况下,x和y坐标是0,0,因为这些坐标是相对于视图本身的。然而,坐标系x和y坐标是相对于视图在父视图中的位置(前面我们说过是在25,25)。
还有一个关于UIViews的很棒的演示。请看幻灯片1-20,它不仅解释了帧和边界之间的区别,而且还展示了可视化的例子。
Frame是视图在它的父视图坐标系中的原点(左上角)和大小,这意味着你在它的父视图中通过改变帧原点来转换视图,另一方面,边界是它自己坐标系中的大小和原点,所以默认情况下边界原点是(0,0)。
大多数情况下,框架和边界是相等的,但如果你有一个框架((140,65),(200,250))和边界((0,0),(200,250))的视图,并且视图倾斜到它的右下角,那么边界仍然是((0,0),(200,250)),但框架不是。
框架将是封装/包围视图的最小矩形,因此框架(如照片中的)将是((140,65),(320,320))。
另一个区别是,例如,如果你有一个边界为((0,0),(200,200)的superView,这个superView有一个框架为((20,20),(100,100)的子view,你把superView的边界改为((20,20),(200,200)),那么子view的框架仍然是((20,20),(100,100)),但是被(20,20)偏移,因为它的父视图坐标系被(20,20)偏移。
我希望这能帮助到一些人。
这里有一个很棒的视频(来自Sean Allen):
Swift - Bounds vs. Frame - iOS面试问题
框架是相对于父视图坐标的位置:
边界是相对于自身坐标系的位置。
和…如果视图是旋转的,它会变得更加棘手。(看视频!)
框架与边界
If you create a view at X:0, Y:0, width:400, height:400, its frame and bounds are the same. If you move that view to X:400, its frame will reflect that change but its bounds will not. Remember, the bounds is relative to the view’s own space, and internally to the view nothing has changed. If you transform the view, e.g. rotating it or scaling it up, the frame will change to reflect that, but the bounds still won’t – as far as the view is concerned internally, it hasn’t changed. If you change the bounds then it will change the content inside the frame because the origin of the bounds rectangle starts at a different part of the view.
Frame相对于SuperView,而Bounds相对于NSView。
例子:40 X = Y = 60。也包含3个视图。这张图向你展示了清楚的想法。
推荐文章
- 如何使用接口生成器创建的nib文件加载UIView
- 模拟器慢动作动画现在打开了吗?
- 滑动删除和“更多”按钮(就像iOS 7的邮件应用程序)
- 如何比较两个nsdate:哪个是最近的?
- 删除/重置核心数据中的所有条目?
- 不区分大小写的比较
- 我如何模仿地图应用程序的底部表格?
- 编译警告:对于架构i386,没有处理文件的规则
- 如何复制文本到剪贴板/剪贴板与Swift
- 在prepareForSegue方法中阻止segue ?
- 从路径字符串中提取文件名
- CSS打印:避免在页面之间减半div ?
- 如何在不接触其他依赖项的情况下更新单个pod
- 运行时出现“未知类<MyClass> in Interface Builder file”错误
- UIView无限360度旋转动画?