分享

[apple文档]UIView 编程指南

 panny_92 2014-12-31

一.了解view的构成

1.view都有layer

2.每个程序都有个UIWindow,每个view都可以相互添加

3.subview是子视图,superview是父视图

4.view的绘制循环,在需要的时候才会绘制,ios会根据部署的view做一个截图,然后在可能的情况下都复用这个截图。你可以显示的调用setNeedsDisplay或者setNeedsDisplayInRect方法来强制执行绘制。

5.修改一个view的几何形状不会自动使得view进行重绘,view的contentMode决定了重绘的方式,绝大部分的模式只是拉伸或者重新定位了截图而已,而不会重新创建一个新的view

6.修改frame,bounds;设置一个新的transform属性都会触发绘制循环。contentMode的属性详见"UIViewContentMode"。

7.拉伸视图:contentStretch属性,注意contentStretch和contentMode是针对layer.content进行缩放的,并不是针对view的subview,所以要明确

  1. UIView* view=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 120, 40)];  
  2. view.contentStretch= CGRectMake(0.1,0.1, 0.9, 0.9);  
  3. //不起作用  
  4. //view.backgroundColor=[[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"jiben_c"]];  
  5. view.layer.contents=(id )[UIImage imageNamed:@"jiben_c"].CGImage;  
  6. view.frame=CGRectMake(0, 0, 200, 40);  

8.内置动画

属性大致可以分为

形变:frame,bounds,center,transform

颜色:backgroundColor,alpha

内容拉伸:contentStretch

9.frame,bounds,center之间的关系

10.clipsToBounds参数

11.drawRect中可以通过CGContextGetCTM方法获得CTM(current transformation matrix),使用Core Graphics方法来实行变换

12.view的transform如果不是identity的话,请忘记frame参数吧,用center和bound来定位以及确定大小

13.View的交互运行周期

a)用户点击

b)通知UIKit framework

c)UIKit framework把touch事件包装成UIEvent发送给能歌响应的view

d)你的view可能做如下事情:修改view的参数改变其几何形状位置; 你调用setNeedsLayout方法去告诉系统你的view或者subviews需要布局的变换;调用setNeedsDisplay或者setNeedsDisplayInRect:方法去告诉系统需要重绘;提醒controller修改某些数据

e)如果view发生了几何变形,按照如下规则变换。如果设置了自动变换规则,UIKit会根据规则进行调整。如果实现了layoutSubviews的话,这会调用该方法。

f)如果view被标记为需要重绘,则会调用实现了drawRect的方法

g)所有显示的view都会被硬件所绘制

14.自定义view一些常用方法:

touchesBegan:withEvent: ;touchesMoved:withEvent: ; touchesEnded:withEvent: ; touchesCancelled:withEvent: ;

layoutSubview ; drawRect;

可以选择性的实现一些方法,比如说你自己实现了手势辨认,则不需要去覆盖touch相关事件;如果你不会更改view的几何形状,则不用去覆盖layoutSubview方法。

15.高效使用view的小贴士

a)不用每个view都配一个controller

b)最小化的使用自定义绘制

c)利用content mode

e)opaque为true

f)滚动时候绘制的优化,滚动时用缩略图替代,滚动停止再绘制精细的大图

g)避免在已有的control中增加subviews,因为可能影响原来的功能


二.Windows

window比较少用,本文涉及的是一些window的基础知识,用到的时候可以看下;比方说多屏幕编程,跟踪Window的变化


三.Views

1.contentScaleFactor:相关介绍是在Drawing and Printing Guide for iOS 的"Supporting High-Resolution Screens"中,主要是绘图时候的比例,因为绘图的时候这个参数直接影响绘图的大小。

2.exclusiveTouch:这个声明是当view作为响应链第一响应者时,接收touch时间时,则在任何手指离开屏幕时不会响应其他任何view的响应,但是如果作为响应链一部分的话,则没有效果,此外还发现,如果view1设置了这个属性,view2没有设置,先手指放在view2,然后另外一个手指放在view1,则view1不响应点击,换句话说,这个属性决定了view只能作为第一个响应点击的view。

3.如何创建view(从nib创建,编程方式创建);修改subview的位置(addSubview,insertSubview,bringSubviewToFront,sendSubviewToBack,exchangeSubviewAtIndexWithSubviewAtIndex,removeFromSuperview)

4.添加一个subview到另一个view,父view和子view会调用如下方法,如果你自定义view中实现了相应方法

willMoveToSuperview,willMoveToWindow,willRemveSubview,didAddSubview,didMoveToSuperview,didMoveToWindow

5.window属性是作为root view的父view,它的superview属性为nil

6.坐标转换的方法(convertPoint:fromView:,convertRect:fromView:系列方法)

7.layout布局的触发条件

a)view的bounds发生变化

b)设备发生旋转,通常是root view的bounds发生变化

c)view对应的layer发生变化

d)view 调用setNeedsLayout或者layoutIfNeeded

e)view的layer调用setNeedsLayout

8.自动布局:autoresizesSubviews为YES;autoresizingMask设置常量值;自动调整完后,还会调用layoutSubviews方法来使你有进一步的调整subview的机会。通常用来添加删除view或者layer;对子类调用setNeedsDisplay,setNeesDisplayInRect方法,重绘subview.简单举例,比方说一个很大的scrollview中有个很大的图片,往往不会一下加载,而是裁剪成很多小块显示,scrollView滑动时候,主动调用setNeedsDisplay,scrollview实现layoutSubview,并且在其中将超出屏幕的部分remove掉而绘制在屏幕部分的小图片。

9.提高绘制代码(drawRect),clearsContextBeforeDrawing设YES,opaque设YES

10.动画相关可以看下我关于动画的文章。




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多