`
weiqingfei
  • 浏览: 315352 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

view的大小,位置

    博客分类:
  • IOS
 
阅读更多

下面有几个比较重要的关于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属性,然后整体移动其子视图大小,从而起到滚动子视图的效果。

详细可以参照这片文章

理解 Scroll Views

 

改变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就可以了,他俩之间可以有也可以没有所属关系。

 

 

 

分享到:
评论

相关推荐

    代码动态改变View大小

    `ViewChangeDemo`这个示例项目很可能包含了一个演示如何动态改变View大小的代码实例。通常,它会展示如何在特定条件下(如点击事件、动画效果)调整View的大小,并可能包括了自定义View的实现。 总的来说,理解并...

    View坐标位置XY轴详解

    1. **View的位置和大小**: - **Rect对象**:在Android中,通常使用Rect对象来表示View的边界。Rect包含四个值——left, top, right, bottom,分别表示矩形左上角和右下角的坐标。 - **getLeft()和getTop()**:这...

    如何使QGraphicsItem不随QGraphicsView放大缩小而改变大小

    在使用QGraphicsView过程中,有时候我们需要对view进行缩放,但是对于一般正常的加入view中的item都会随着view的大小变化而变化,但是如果我们想让某些item不随view的缩放进行改变怎么办呢?详情见博客:...

    android开发随声音大小变化的自定义view

    在Android开发中,创建一个能够随声音大小变化的自定义View是一种常见的需求,尤其是在音乐播放器或者音频相关的应用中。这个自定义View可以是长方形或圆柱形,旨在模仿音频波形或音量指示器的效果。下面我们将深入...

    自动调整大小的View

    在这种情况下,开发者需要管理这些子视图的布局和大小,可能使用 `addView()` 添加子视图,并通过 `LayoutParams` 设置它们的位置和尺寸。 标签 "View" 强调了这个话题的核心是围绕 `View` 进行的。在Android开发中...

    测量view的宽高 以及 动态设置View的位置

    在Android开发中,理解和操作View的尺寸与位置是至关重要的技能。这涉及到对View的测量、布局以及动态调整。在本文中,我们将深入探讨如何测量一个View的宽度和高度,以及如何动态地设置View的位置。 首先,我们来...

    QGraphicsView以鼠标点实现放大缩小、拖拽

    1. **鼠标按下**:在`mousePressEvent`中记录鼠标点击位置,并设置拖动模式为`QGraphicsView::RubberBandDrag`,以便选择区域。 2. **鼠标移动**:在`mouseMoveEvent`中计算鼠标的相对位移,并使用`translate`函数...

    HexView_hexview如何使用_hexview教程_hexviewdll_hexBIN浏览_hexview.zip

    2. 利用书签功能标记重要位置,方便快速返回。 3. 可以调整显示颜色,以便于区分不同类型的字节。 总的来说,HexView是一款强大的十六进制编辑器,无论你是普通用户还是开发人员,都能从中受益。熟练掌握它的使用,...

    自定义ViewGroup---子View可对换位置

    1. **onMeasure()**:测量所有子View的大小,并确定ViewGroup自身的大小。这是布局的基础,必须正确地计算每个子View的尺寸,以便它们能够在屏幕上正确显示。 ```java @Override protected void onMeasure(int ...

    Android View 的尺寸大小变化的时候要求有一个过度的动画

    最近在项目里有个需求要求一个View 的尺寸大小变化的时候要求有一个过度的动画(view.getLayoutParams().height 100--->400)查看了一些资料后成功搞定,下面跟大家一起分享 解决的方法主要是继承Animation重写里面...

    截取View转为图片

    当一个View需要更新时,例如大小改变或内容改变,Android会调用`requestLayout()`触发布局过程,然后调用`onMeasure()`来测量View的大小,接着调用`onLayout()`确定View的位置,最后调用`onDraw()`绘制View的内容。...

    QGraphicsView QGraphics 窗口自适应

    绘制或导入的QGraphicsItem可能会很大或很小,我们想要根据现实窗口的大小自适应显示item,基于个人对QGraphics Scene、Graphics Item、Graphics View关系[^1]的理解,发现一种方法使用可以解决需求。

    popupWindow 大小 位置

    本篇文章将详细讲解如何灵活设置PopupWindow的大小、位置以及弹窗方向,帮助开发者实现更加丰富的用户体验。 首先,了解PopupWindow的基本用法。创建PopupWindow需要三个基本元素:一个视图(View)、一个宽度(int...

    QT中QGraphicsView窗口滑动

    我们可以通过设置QGraphicsView的视口大小来定义窗口的显示范围,并通过setScene函数将QGraphicsScene添加到QGraphicsView中。 在实现窗口滑动时,我们通常会关注QGraphicsView的滚动功能。这可以通过重写QGraphics...

    Android-Android设置该文章字体大小时所需要的View控件

    灵感来自于查看微信公众账号所发的文章,设置该文章字体大小时所需要的View控件 (大熊)灵感来自于查看微信公众账号所发的文章,设置该文章字体大小时所需要的View控件。

    Android 实现View的排列自动换行

    1. **onMeasure()**: 这是测量View大小的关键方法。在这里,我们需要测量每个子View的尺寸,并计算出容器的总尺寸。我们可以使用`MeasureSpec`来获取父布局对当前View的测量要求,并以此来计算自身和子View的尺寸。 ...

    android 获取界面部分view,view截图,生成bitmap图片

    首先创建一个与View大小相同的Bitmap,然后创建一个与Bitmap关联的Canvas,最后调用View的`draw(Canvas)`方法将View的内容绘制到Canvas上。以下是一个简单的示例代码: ```java View view = findViewById(R.id....

    PDFView显示pdf文件

    同时,考虑到PDF文件的大小和复杂性,优化加载速度和内存使用也是使用PDFView时需要考虑的关键因素。 此外,需要注意的是,虽然PDFView提供了基本的PDF查看功能,但可能不包含高级特性,如注释、搜索或编辑PDF。...

    PopupWindow 例子 只适应大小 位置

    这个例子主要关注如何让PopupWindow仅适应大小和位置,以便更好地与用户界面融合。 首先,理解PopupWindow的基本概念。PopupWindow是一个可以显示在Activity上的浮动窗口,它不是Android系统的原生对话框,但提供了...

Global site tag (gtag.js) - Google Analytics