下面有几个比较重要的关于view的大小以及位置的属性
UIScreen.mainScreen.bounds
全屏大小
UIScreen.mainScreen.applicationFrame
不包括状态栏的大小(由于状态栏高度为20,所以height也就比bounds小20了),当状态栏隐藏时,也就跟bounds一样了。
UIView的大小与位置,
大小有本UIVIew.bounds.size来控制
位置由本UIVIew.center来控制
本UIView.center的数值是本UIView相对于父UIView的坐标系远点的距离
本UIView.center在本UIView中的位置由layer.anchorPoint来控制(不要想当然的认为center就是正中心)
从结果上来看UIView.frame.x,UIView.frame.y是UIView左上角相对于父UIView的坐标原点的距离,UIView.frame.width =UIVIew.bounds.width,UIView.frame.height=UIVIew.bounds.height
所以可以理解为UIView.frame只是设定UIView大小和位置后的属性体现,然而由于他们之间的可逆计算关系,也可以通过设定frame来改变,UIView的大小和位置,也算是屁股决定脑袋吧。
下面是他们的对应关系
UIView.frame.x = UIView.center.x - UIView.bounds.width * UIView.layer.anchorPoint.x
UIView.frame.y = UIView.center.y - UIView.bounds.width * UIView.layer.anchorPoint.y
可以看出center在UIView的点位置实际上是由anchorPoint决定的,如果anchorPoint是[0,0],那么center的位置就是在UIView的左上角,如果anchorPoint是[1,1],那么center就是在UIView的右下角
UIView.center.x = UIView.frame.x + UIView.frame.width * UIView.layer.anchorPoint.x
UIView.center.y = UIView.frame.y + UIView.frame.width * UIView.layer.anchorPoint.y
因为UIView.frame.width==UIView.bounds.width,UIView.frame.width==UIView.bounds.width,所以上面的关系很明确
1.想让子UIView统一变更一下屏幕位置,可以调整一下本UIVIew的bounds.origin大小,这个值代表本UIView在自己坐标系的位置(说起来有点儿绕),改变bounds.origin后,本UIView本身是没什么位置变化的,那么相对的等于其坐标系向着相反方向移动了,因为子视图是跟着父视图的坐标系走的,那么就相当于子视图也都跟着向着相反方向移动。
例如视图viewA的子视图ViewB,默认viewA.bounds.origin =(0, 0),如果设置为viewA.bounds.origin =(5, 5),说明viewA相对于其坐标系向右下方分别移动了5个点,viewA在屏幕上的位置没变,那么相当于viewA的坐标系向左上方分别移动了5个点,也就是视图viewB在屏幕上的位置向左上方分别移动了5个点。
大家都用过UIScrollView,其实它本身就是简单的UIView,通过添加一些方法,来控制其bounds.origin属性,然后整体移动其子视图大小,从而起到滚动子视图的效果。
详细可以参照这片文章
改变UIView.center在本UIView坐标系的位置,可以调整layer.anchorPoint,当对本UIVIew按比例扩大缩小,或者旋转时,都是以这个layer.anchorPoint为基准的。注意单独设定layer.anchorPoint后,UIView.frame.x和y也会跟着变,而UIView.center的数值不会变。(从这点儿也可以看出决定UIView位置的是center和anchorPoint,而frame只是一个结果属性)
关于视图坐标的转换
视图的坐标都是相对于其父视图坐标系的
那么视图在其它视图的坐标系中的位置,就需要进行位置转换。
有两个函数专门进行这种转换
func convertRect(_
rect
: CGRect,toView view
: UIView?) -> CGRectfunc convertRect(_
rect
: CGRect,fromView view
: UIView?) -> CGRect
这两个方法是等价的,主要看是对象哪个视图来调用了。
比如
viewA.convertRect(rect, toView:viewB)
意思就是在视图viewA里的一个矩形框(包括坐标和宽高)在viewB坐标系的位置
等价的另外一种写法
viewB.convertRect(rect, fromView:viewA)
根据文档要求ViewA和ViewB都必须在同一个UIWindow系统里。
所以猜想,其实都是先转换到UIWindow坐标系,然后再转换到对象View的坐标的。
如果是这样的写法
viewA.convertRect(ViewC.frame, toView:viewB)
这通常指的是viewC是viewA的直接子视图,得出ViewC如果是在ViewB坐标系的位置,viewC和viewB只要在同一个UIWindow就可以了,他俩之间可以有也可以没有所属关系。
相关推荐
`ViewChangeDemo`这个示例项目很可能包含了一个演示如何动态改变View大小的代码实例。通常,它会展示如何在特定条件下(如点击事件、动画效果)调整View的大小,并可能包括了自定义View的实现。 总的来说,理解并...
1. **View的位置和大小**: - **Rect对象**:在Android中,通常使用Rect对象来表示View的边界。Rect包含四个值——left, top, right, bottom,分别表示矩形左上角和右下角的坐标。 - **getLeft()和getTop()**:这...
在使用QGraphicsView过程中,有时候我们需要对view进行缩放,但是对于一般正常的加入view中的item都会随着view的大小变化而变化,但是如果我们想让某些item不随view的缩放进行改变怎么办呢?详情见博客:...
在Android开发中,创建一个能够随声音大小变化的自定义View是一种常见的需求,尤其是在音乐播放器或者音频相关的应用中。这个自定义View可以是长方形或圆柱形,旨在模仿音频波形或音量指示器的效果。下面我们将深入...
在这种情况下,开发者需要管理这些子视图的布局和大小,可能使用 `addView()` 添加子视图,并通过 `LayoutParams` 设置它们的位置和尺寸。 标签 "View" 强调了这个话题的核心是围绕 `View` 进行的。在Android开发中...
在Android开发中,理解和操作View的尺寸与位置是至关重要的技能。这涉及到对View的测量、布局以及动态调整。在本文中,我们将深入探讨如何测量一个View的宽度和高度,以及如何动态地设置View的位置。 首先,我们来...
1. **鼠标按下**:在`mousePressEvent`中记录鼠标点击位置,并设置拖动模式为`QGraphicsView::RubberBandDrag`,以便选择区域。 2. **鼠标移动**:在`mouseMoveEvent`中计算鼠标的相对位移,并使用`translate`函数...
2. 利用书签功能标记重要位置,方便快速返回。 3. 可以调整显示颜色,以便于区分不同类型的字节。 总的来说,HexView是一款强大的十六进制编辑器,无论你是普通用户还是开发人员,都能从中受益。熟练掌握它的使用,...
1. **onMeasure()**:测量所有子View的大小,并确定ViewGroup自身的大小。这是布局的基础,必须正确地计算每个子View的尺寸,以便它们能够在屏幕上正确显示。 ```java @Override protected void onMeasure(int ...
绘制或导入的QGraphicsItem可能会很大或很小,我们想要根据现实窗口的大小自适应显示item,基于个人对QGraphics Scene、Graphics Item、Graphics View关系[^1]的理解,发现一种方法使用可以解决需求。
最近在项目里有个需求要求一个View 的尺寸大小变化的时候要求有一个过度的动画(view.getLayoutParams().height 100--->400)查看了一些资料后成功搞定,下面跟大家一起分享 解决的方法主要是继承Animation重写里面...
当一个View需要更新时,例如大小改变或内容改变,Android会调用`requestLayout()`触发布局过程,然后调用`onMeasure()`来测量View的大小,接着调用`onLayout()`确定View的位置,最后调用`onDraw()`绘制View的内容。...
Quick View Folder Size是一款专为Windows用户设计的实用工具,旨在帮助用户快速、直观地查看文件夹的大小。这款软件的V3.0汉化特别版是针对中文用户优化的版本,确保用户在使用过程中能够轻松理解和操作。 在日常...
本篇文章将详细讲解如何灵活设置PopupWindow的大小、位置以及弹窗方向,帮助开发者实现更加丰富的用户体验。 首先,了解PopupWindow的基本用法。创建PopupWindow需要三个基本元素:一个视图(View)、一个宽度(int...
我们可以通过设置QGraphicsView的视口大小来定义窗口的显示范围,并通过setScene函数将QGraphicsScene添加到QGraphicsView中。 在实现窗口滑动时,我们通常会关注QGraphicsView的滚动功能。这可以通过重写QGraphics...
灵感来自于查看微信公众账号所发的文章,设置该文章字体大小时所需要的View控件 (大熊)灵感来自于查看微信公众账号所发的文章,设置该文章字体大小时所需要的View控件。
JsonView是一款非常实用的工具,主要用于查看和解析JSON(JavaScript Object Notation)格式的数据。JSON是一种轻量级的数据交换格式,被广泛应用于Web服务和应用程序之间的数据通信。它以其简洁明了的结构,易于人...
首先创建一个与View大小相同的Bitmap,然后创建一个与Bitmap关联的Canvas,最后调用View的`draw(Canvas)`方法将View的内容绘制到Canvas上。以下是一个简单的示例代码: ```java View view = findViewById(R.id....
1. **onMeasure()**: 这是测量View大小的关键方法。在这里,我们需要测量每个子View的尺寸,并计算出容器的总尺寸。我们可以使用`MeasureSpec`来获取父布局对当前View的测量要求,并以此来计算自身和子View的尺寸。 ...