黄海峰 發表於 2022-9-19 14:57:14

iOS开发frame和bounds使用示例详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>简述</li><li>frame和bounds</li><li>何时使用Frame,何时使用Bounds</li></ul></div><p class="maodian"></p><h2>简述</h2>
<p>Frame: 视图的位置和大小使用是父视图的坐标系,所以将视图放置在父级中这一点就很重要。 Bounds:视图的位置和大小,使用的是其自己的坐标系,而对于这一点而言将视图的内容或子视图放置在其自身内很重要。</p>
<p class="maodian"></p><h2>frame和bounds</h2>
<div class="jb51code"><pre class="brush:cpp;">UIImageView *imageView = [ initWithFrame:CGRectMake(0, 0, 100, 100)];
;
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202209/20220919084040042.jpg" /></p>
<blockquote><p>Frame origin = (0, 0) width = 100 height = 100</p></blockquote>
<blockquote><p>Bounds origin = (0, 0) width = 100 height = 100</p></blockquote>
<p>该图片中的<code>Frame</code>和<code>Bounds</code>完全相同。</p>
<div class="jb51code"><pre class="brush:cpp;">UIImageView *imageView = [ initWithFrame:CGRectMake(10, 50, 100, 100)];
;
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202209/20220919084040043.jpg" /></p>
<blockquote><p>Frame origin = (10, 50) width = 100 height = 100</p></blockquote>
<blockquote><p>Bounds origin = (0, 0) width = 100 height = 100</p></blockquote>
<p>改变Frame的 x、y 坐标会在父视图中移动它。但是视图本身看起来仍然完全一样。Bounds并没有不同。到目前为止,我们看到的<code>Frame</code>和<code>Bounds</code>的宽度和高度一直是完全相同的。然而这并不总是正确的。下面看看如果旋转视图片会发生什么。</p>
<div class="jb51code"><pre class="brush:cpp;">UIImageView *imageView = [ initWithFrame:CGRectMake(10, 50, 100, 100)];
;
imageView.transform = CGAffineTransformMakeRotation(M_PI * 0.05);
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202209/20220919084040044.jpg" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202209/20220919084040045.jpg" /></p>
<p>可以看到<code>Bounds</code>仍然相同,但是<code>Frame</code>已经发生了更改。现在更容易看出<code>frame</code>和<code>bounds</code>之间的区别。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202209/20220919084040046.jpg" /></p>
<p>视图的框架被定义为该视图相对于其父坐标系的最小边界框,包括应用于该视图的任何变换。在这里,可以看到边界大小和帧大小完全不同。这一点非常重要:视图的框架是相对于其父级坐标系的位置和大小。视图的边界是相对于其自身坐标系的位置和大小。图中两个不同坐标系(黑色和蓝色的)可以帮我们更好地理解。</p>
<blockquote><p>文档里说:Note: When modifying the transform property of your view, all transformations are performed relative to the center point of the view.,修改<code>transform</code>视图的属性时,所有转换都是相对于视图的中心点执行的。</p></blockquote>
<p>也就是说,我们进行<code>transform</code>后,再去修改视图位置最好使用<code>center</code>属性来修改。</p>
<p>到目前为止,Bounds原点是一直停留在 (0, 0)的,不过也不一定是这样的。如果我们的视图有一个很大的子视图,它太大而无法一次显示呢?</p>
<div class="jb51code"><pre class="brush:cpp;">UIView *view2 = [ initWithFrame:CGRectMake(150, 100, 120, 200)];
;
view2.clipsToBounds = YES;
//    view2.bounds = CGRectMake(50, 0, 120, 200);
UIImageView *imageView2 = [ initWithFrame:CGRectMake(-50, 50, 200, 200)];
;
];
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202209/20220919084040047.jpg" /></p>
<p>相当于下图效果:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202209/20220919084040048.jpg" /></p>
<p>此时bounds的原点为(0, 0)。倘若我们现在改变bounds的原点,会发生什么呢?</p>
<div class="jb51code"><pre class="brush:cpp;">view2.bounds = CGRectMake(50, 0, 120, 200);
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202209/20220919084040049.jpg" /></p>
<p>相当于:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202209/20220919084040050.jpg" /></p>
<p>从原坐标原点相对于大子视图的位置,再进行相对的移动。视图在父视图中没有移动,但是视图里面的内容发生了变化。这其实和我们常用的<code>UIScrollView</code>系列控件的思想是一样的。大的子视图相当于画布,改变<code>bounds</code>更改的是显示画布的区域。</p>
<p class="maodian"></p><h2>何时使用Frame,何时使用Bounds</h2>
<p>由于<code>frame</code>关联视图在其父视图中的位置,因此您在进行向外更改时会使用它,例如更改其宽度或查找视图与其父视图顶部之间的距离。</p>
<p>使用<code>bounds</code>时,你正在向内变化,就像画的东西或视图中安排子视图。如果您对它进行了一些转换,还可以使用<code>bounds</code>来获取视图的大小。</p>
<p>以上就是iOS开发frame和bounds使用示例详解的详细内容,更多关于iOS开发frame bounds的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>iOS开发创建frame实现window窗口view视图示例</li><li>Vue axios与Go Frame后端框架的Options请求跨域问题详解</li><li>ios设备使用iframe宽度超出屏幕的解决方法</li><li>iOS bounds学习笔记以及仿写UIScrollView部分功能详解</li><li>Android ReboundScrollView仿IOS拖拽回弹效果</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: iOS开发frame和bounds使用示例详解