0000_0000_0000_0011 frame and bounce

0000 0000 0000 0011

写于2015.04.05 19:23

1.frame bounce

这两天被UIScroll View 搞的晕头转向,主要还是几个问题没有完全搞懂,总在以为搞定它们时候,又被一个demo否定。目前可能对frame 和 bounce还算理解吧。因此特地写下来记录下。

首先它们的存储都是(x,y,width,height),要分为两个部分看(x,y)和(width,height)。前者是origin,后者是size,分别表示点和尺寸。

1-1.frame

frame,从层级关系上来说就是,视图View在父视图SuperView上的位置。

决定子视图(subView)在父视图(superView)上的位置有两个条件,分别是origin(一个点)size(视图的尺寸)。我这么想,面前有一块画布,画个矩形,总得有个起笔的地方,那是origin;画多少大,即宽多少,高多少,就绝对了最后在画图中怎么呈现那个矩形。

灰色视图的bounce(0,0,400,600)。注意不是frame,后面会谈到为什么是bounce 而且点取(0,0)和取别的点有啥不同。

现在我要在灰色视图上绘制我的绿色View,前面说过,我要定一个起始点和尺寸。这里点为(100,60),大小是100 * 100,有了点(point)还不行,在灰色视图中我得有个参考坐标系,否则我怎么知道哪个点是(100,60)。这时候bounce中的(0,0)起了关键性作用,它表示视图最左上角代表(0,0)(已在图中标出这里很重要,我说的是灰色View的左上角那个点表示(0,0))。横向向右是x轴正方向,纵向向下是y轴正方向。

如此我就知道点(100,60)在哪个位置,定下点后画多少大多少高就是一个简单的问题。

写到这,基本和用百度 谷歌搜到的东西差不多。

假如我修改绿色视图的frame(200,200,50,50),由于改变了点(point)的位置,那么相应起笔的位置也不同了,绿色视图最后向右下角移动。

到目前为止,这些都是初学者都知道的。讲完frame 讲下bounce。

1-2.bounce

还是接着上面图片来讲,为什么我要强调灰色视图刚才的bounce中的orgin(0,0)。因为在scrollView中这个bounce会改变(当然这里我还不想涉及太多)。

要知道平常我们在使用视图的时候会顺手打印下bounce,一般origin都是(0,0),

你有想过这个点代表什么?改变它的值会怎么样?

现在给出另外一幅图:

画得粗糙了,以后以后自己回过头还能看懂orz。首先 白色视图(view1)是父视图,然后灰色视图(view2)add到上面,最后绿色视图(view3)add到灰色视图上。至于蓝色框框,请暂时忽略。

主要还是灰色视图,首先灰色视图在白色视图位置是定的,然后修改灰色视图的bounce中的origin,正如图中所看到的,设为(10,20)。

正如你看到的,bounce的origin 就是视图左上角的点的坐标,换个通俗暴力的说话,我指定左上角那个点就是(10,20),也许下一刻我就指定它为(100,200)了,谁知道呢?

回到刚才话题,既然现在左上角那个点是(10,20)了,那么原来的原点坐标(0,0)在哪里?这就是我为什么要用蓝框标出来了,正如你所看到的图上的(0,0)。不过我们在屏幕中看到的仍然是灰色那块区域!

问题这会影响什么?

我在学习过程中看其他朋友的博客,基本可以概括为两句话:有一个视图ViewA,它的frame就是viewA在父视图的位置;它的bounce决定了在ViewA中的子视图布局位置。

而我目前理解是,在灰色视图中要绘制我的绿色视图,必然是要设置绿色视图的frame的起点(也就是绿色视图左上角箭头标注出的位置)。假如说现在我设置为(200,200),那么这个点是相对于原点(0,0)来说的,正如蓝色框框所标出的原点。 当然你也可以说根据左上角那个点(10,20),我也能知道(200,200)点在哪里。这也是ok的。

关键你要理解我们修改了灰色视图的bounce中的origin,就是在指定灰色视图左上角那个点表示多少!

2.当决定了子视图在父视图的位置,改变父视图的bounce

还是接着上图,不过这里可能需要我一点想象力。首先灰色视图bounce(0,0,320,568),在上面添加一个绿色子视图frame=(200,50,50,50)

现在重新设置bounce为(40,40,320,568)。正如上文所提到的灰色视图左上角那个坐标点为(40,40)。那么原点(0,0)应该在我们看不到的左上角 对吧(想象下)?那么绿色视图的(200,50)位置也要跟着改变,应该向左上角移动。

如果还不清楚,那么这么干:

首先灰色视图左上角点从(0,0)改为(40,40),你知道(200,50)这个点在灰色视图中的位置吗?

不知道?那么这么干

既然灰色视图左上角点坐标是(40,40),那么原点(0,0)在哪里?当你标注出原点之后,在标出(200,50)这个点。你会发现它的位置较原来向左上角移动了!

接下来还得整contentInset 和 contentOffset 。。。。。。

时间: 2024-10-05 07:55:37

0000_0000_0000_0011 frame and bounce的相关文章

AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203

[HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 int n,m,f[maxn],ch[maxn][2],rev[maxn],ki[maxn],sta[maxn],top,lit,size[maxn]; inline void in(int &now) { char Cget=getchar();now=0; while(Cget&

iOS开发UI基础—手写控件,frame,center和bounds属性

一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View Contollor和view的关系 2.注意点 在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力! 设置控件监听方法的示例代码如下: [btn addTarget:self action:@selector(click:) forContro

Selenium-Webdriver系列Python版教程(5)————如何定位 frame

在 web ui 自动化测试中,frame 一直是令人头痛的问题,就像上班必须挤公车坐地铁一般, frame 的问题总是令人气闷纠结为之黯然神伤. 以前在使用 Selenium1 的时候,frame 也是颇为棘手的一个问题.不但要照本宣科的进行 一系列的设置,而且在进行实际代码编写的过程中会遇到各种奇奇怪怪的问题. frame 就像 中国男足的后防线,问题多多难以解决. selenium webdriver 处理 frame 比较简单,这点比某些测试工具要先进一些,令人身心愉 悦. 以下面的 h

iOS 动态设置UILabel的frame(宽度和高度)

CGSize labelSize=[self.myDetailLabel.text boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width-20, 0) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: self.myDetailLabel.font} context:nil].size; self.

Packet 和 Frame

一般说来,数据链路层发出的数据包称为frame,地址是链路层的地址,如mac地址:网络层发出的数据包称为packet,地址是网络层地址,如ip地址:传输层发出的数据包称为segment,地址是传输层地址,如TCP的端口号. 数据的封装过程: 1.data 2.segment 3.packet 4.frame 5.bit 对应的协议: 1.application-session (Represen layer is in the middle) layer 2.transprot layer 3.

IOS 杂笔-12(类别de巧用 有便于Frame的操作)

在实际开发中很多时候我们都为了控件frame的操作焦头烂额. 例如:我们只想要获取view的width. 我们可以这么操作:view.frame.size.width 有时我们想要改变view的width然而我们不能直接改变->需要三部曲. 让人抓狂,为了解决这里烦恼我们可以通过改变类别来达到理想的效果. 下面是类别的.h文件: // // UIView+CXExtension.h //// // Created by ma c on 16/3/25. // Copyright ? 2016年

Data Frame的常用函数

1.DataFrame的常用函数: (1)np.abs(frame) 绝对值, (2)apply function, lambda f= lambda x: x.max()-x.min(),frame.apply(f); frame.apply(f,axis = 1) f(x), def f(x): return Series([x.min(),x.max()], index=['min','max']),frame.apply(f)(3) applymap format f= lambda x

Objective-C日记-Bounds和Frame

今天在学习有关UIView时,关于Bounds和Frame的问题困扰多时,今日研究了一翻,有所收获,遂记之. 一.问题来源 网上有关bounds和frames的比较的文章主要就是一篇:http://blog.csdn.net/mad1989/article/details/8711697,核心思想是bounds的坐标系是相对于自己而言,而frames的坐标系是相对于父视图,主要的演示代码如下: UIView *view1 = [[UIView alloc] initWithFrame:CGRec

Frame框架

框架 frameset    框架集    如果使用框架集,当前页面不能有body    cols="300,*" :左右拆分,左边宽300,右边宽剩余    rows="300,*" :上下拆,上边高300,下边高剩余    frameboder :边框    <frame>        src :框架要显示页面的地址  noresize:禁止窗口调整大小         scrolling:滚动条  scrolling="no"