• 【IOS开发—视图】


    一、UIWindow对象

    每一个app都有一个UIWindow对象,它像一个容器一样,用来包含应用中的所有视图,应用会在启动时创建并设置UIWindow对象。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        
        //添加ViewController
        ViewController *controller = [[ViewController alloc] init];
         
       ……………………
    self.window.rootViewController
    = controller; [self.window setBackgroundColor:[UIColor whiteColor]]; [self.window makeKeyAndVisible]; return YES; }

    加入窗口的视图会成为窗口的子视图,子视图还可以包含自己的子视图,这是一个类似Android View的一个层级关系。

    二、UIView

    1)每一个UIView都有一个layer属性,对应一个CALayer类的对象。然后所有的Layer组合成一幅图像,绘制在屏幕上。

    2)UIView的frame属性保存的是视图的大小及相对父视图的位置,用CGRect来描述(它是一个结构体 struct)

    3)frame和bounds的区别:frame用于确定与其他视图层次结构中其他视图的相对位置;而bounds用于确定绘制区域,避免绘制到图层边界外面。

    三、Core Graphics

      Core Graphics是一套提供2D绘图功能的C语言的API,Core Graphics中最重要的“对象”是图形上下文(graphics context),图形上下文是CGContextRef的“对象”,负责存储绘图状态(例如画笔颜色和线条粗细)和绘图内容所处的内存空间。

    - (void)drawRect:(CGRect)rect
    {
        
        //获取绘图的Context
        CGContextRef currentContext = UIGraphicsGetCurrentContext();
        
        //保存当前的上下文
        CGContextSaveGState(currentContext);
        
        //目前只能通过 Core Graphics设置阴影
        CGContextSetShadow(currentContext, CGSizeMake(4, 7), 3);
        //这里绘制的图形有阴影效果
        
        //恢复之前的上下文
        CGContextRestoreGState(currentContext);
        
        //这里绘制的图像没有阴影效果。
    }

    其中图形的上下文context 在drawRect之前就已经创建了。

    四、用UIBezierPath画一个三角形

        //定义渐变的path
        UIBezierPath *myPath = [[UIBezierPath alloc] init];
        //用myPath化一个三角形
        [myPath moveToPoint:CGPointMake(160, 142)];
        [myPath addLineToPoint:CGPointMake(260, 446)];
        [myPath addLineToPoint:CGPointMake(60, 446)];
        [myPath addLineToPoint:CGPointMake(160, 142)];
        [myPath setLineWidth:10];
        //设置填充颜色
        [[UIColor redColor]setFill];
        [[UIColor redColor] setStroke];
        
        [myPath fill];
        [myPath stroke];

    注意画三角形的方式:寻找一个点,然后以这一点为起点画三条线。

     五、运行循环和重绘视图

      IOS应用启动时会开始一个运行循环(run loop),循环的工作是为了监听事件,比如:触摸事件。当在View中监听到对应的事件时,程序会首先执行对应事件的处理逻辑(比如点击屏幕时,改变屏幕某个元素的背景色),直到这些逻辑都执行完,才将控制权交给运行循环。

      运行循环在得到控制权时会首先检查是否有等待重绘的View(这需要View手动去设置setNeedsDisplay),然后会向需要重绘的视图发送drawRect消息,从而将新的视图显示在屏幕上。重绘肯定是比较耗时的,IOS做了两方面的优化:

    1)不重绘那些内容没有发生变化的视图

    2)在每次事件处理周期中只发生一次drawRect消息,也就是说无论事件周期里视图发生多少变化,只会在最后执行一次drawRect。

      另外setNeedsDisplayInRect是为了指定只重绘某一区域。通常情况下我们并不指定区域。

    PS:碰到一个问题,在UIView的子类中,监听触摸的事件并没有执行。

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

    然后只是在APPDelegate中修改了代码的顺序,问题就解决了,我也没想明白为什么会这样:

      
        self.window.rootViewController = controller;
        [self.window setBackgroundColor:[UIColor whiteColor]];
        
        [self.window makeKeyAndVisible];
        [self.window addSubview:BNRView];

    就是将 [self.window addSubview:BNRView]放到 [self.window makeKeyAndVisible]后面。

     六、UIScrollView

      UIScrollView有几个属性和方法注意下:

    1)contentSize 决定了UIScrollView能显示多大面积的View(打个比方,UIScrollView像照相机一样,而contentSize就决定了能显示多达面积)。

    2)pagingEnable 的作用是比如有两页数据,在滑动到第二页时,松开手指能自动定位到第二页。这种效果在移动端是很常见的。原理是:UIScrollView会根据其bounds的尺寸,将contentSize分割为尺寸相同的多个区域,拖动结束后,UIScrollView会自动滚动并只显示其中的一个区域。

    下面的代码是在一个UIScrollView中有两个大小一样的视图:

        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        
        //添加ViewController
        ViewController *controller = [[ViewController alloc] init];
        
        //创建两个CGRect结构作为UIScrollView和BNRHypnosisView对象的frame
        CGRect screenRect = self.window.bounds;
        CGRect bigRect = screenRect;
    //    bigRect.size.height *=2.0;
        bigRect.size.width  *=2.0;
        
        //创建一个UIScrollView对象,将其尺寸设置为窗口大小
        UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:screenRect];
        [scrollView setPagingEnabled:YES];
        
        //创建一个超大尺寸的BNRHypnosisView(修改创建一个与屏幕等宽的View)
        BNRHyponsisViewTwo *hyponsisView = [[BNRHyponsisViewTwo alloc] initWithFrame:screenRect];
        [scrollView addSubview:hyponsisView];
        
        screenRect.origin.x += screenRect.size.width;
        BNRHyponsisViewTwo *antherView = [[BNRHyponsisViewTwo alloc] initWithFrame:screenRect];
        [scrollView addSubview:antherView];
        
        //设置scrollView的取景范围
        scrollView.contentSize = bigRect.size;
        
        self.window.rootViewController = controller;
        [self.window setBackgroundColor:[UIColor whiteColor]];
        
        [self.window makeKeyAndVisible];
    //    [self.window addSubview:BNRView];
        [self.window addSubview:scrollView];
  • 相关阅读:
    新的一年,来看看大数据与AI的未来展望
    看过上百部片子的这个人教你视频标签算法解析
    让老板虎躯一震的前端技术,KPI杀手
    如何用RSS订阅?
    说说不知道的Golang中参数传递
    我也要谈谈大型网站架构之系列(3)——死了都要说的缓存
    我也要谈谈大型网站架构之系列(2)——纵观历史演变(下)
    我也要谈谈大型网站架构之系列(1)——纵观历史演变(上)
    抛弃NVelocity,来玩玩Razor
    挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim
  • 原文地址:https://www.cnblogs.com/zhouliweiblog/p/4970517.html
Copyright © 2020-2023  润新知