zoukankan      html  css  js  c++  java
  • 14-UIKit(拖拽手势、布局)

    目录:

    1.手势创建的拖拽方式

    2.frame,bounds,transform,center区别

    3.触控(touch)

    4.布局

    5.代码布局

    回到顶部

    1.手势创建的拖拽方式

    创建手势对象,修改手势对象属性,加入指定视图,这三件事都可以不用写代码,而用拖拽的方式完成。

    设置拖拽方式手势代理的方法是:在第六个检查器里拖拽delegate到ViewController

    设置拖拽方式手势触发调用的方法是:按住ctrl直接拖拽到.m文件里

    回到顶部

    2.frame,bounds,transform,center区别

    2.1 类型

    frame,bounds是CGRect{origin{x,y},size{width,height}}

    transform是CGAffineTransform{a,b,c,d,dx,dy}

    center是CGPoint{x,y}

    label.font = [UIFont boldSystemFontOfSize:24];// 粗体

    label.shadowOffset = CGSizeMake(0, 0.5); // 阴影偏移

    label.shadowColor = [UIColor greenColor]; // 阴影颜色

    2.2 属于谁

          属于视图对象的属性

    2.3 frame

          1>描述该视图在父视图中的位置,和占用的空间大小。

          2>经常如何使用frame属性,当此视图处在父视图下,想做以下事时,需要使用:

               * 初始化此视图(子视图)的坐标信息(位置)

               * 在不使用transform以及autolayout的前提下,修改坐标信息

          3>当直接修改了视图的frame之后,会导致:

               * .size -> bounds.size会发生变化,transform导致的frame改变不会导致bounds改变,

               * .center属性会变

               * 会导致transform变化,如果一个view的transform被主动修改后,该view的frame就不应该在直接修改

          4>当一个视图没有进行transform时,该视图的.frame.size和bounds.size是一致的

    2.4 bounds

          1>描述此视图自己本身的坐标系的大小和父视图没任何关系

          2>.bounds.origin中的x,y永远为0,由于和父视图无关,所以此值永远为0

          3>在什么情况下用.bounds:

               * 取值:当需要计算此视图中子视图的位置和大小时,取得此视图的宽高要用.bounds.size,不能用.frame.size

               * 设置此属性的值:当视图的大小不由此视图,而由外部决定时,比如在自定义的cell中放一个视图,这个视图的大小由内容计算出,当计算出数据后,应该修改此视图的bounds属性

               * 修改bounds属性会导致:

                     .frame.size会被改变

                     .center会被改变

    2.5 transform

          1>是视图在frame的基础上的变形

          2>一般很少用,使用的前提:

               * 没有使用autolayout技术

               * 需要增加一些特效(缩放,旋转)

     

          3>修改transf属性会导致:

               * .frame属性会发生变化

               * .center会发生变化

               * 特别注意:transform不会导致bounds发生任何变化

    2.6 center

          1>是视图中心点坐标

          2>需要移动视图时,可以不使用transform而做到位移

          3>center改变会导致:

               * .frame.origin改变

    2.7 frame和bounds的区别

          1>frame中有视图的位置信息,而bounds中没有

          2>一般情况下(没有发生transform),frame中的size和boudns中的size是一致的

          3>直接修改frame,bounds会跟着变化,修改bounds,frame也跟着变

          4>但是,当transform改变了,frame会变,而boudns不会变,所有此时会导致frame.size和bounds.size不同

    - (IBAction)doubleClickTap:(UITapGestureRecognizer *)sender {
    
    //    [self relocate:nil];
    
        CGPoint p1= [sender locationInView:self.view];
    
        CGPoint p2= [sender locationInView:self.imageView];
    
        NSLog(@"self.view(%f,%f)",p1.x,p1.y);
    
        NSLog(@"self.imageView(%f,%f)",p2.x,p2.y);
    
       
    
        UILabel *label = [[UILabel alloc] init];
    
        label.text = @"O";
    
        label.textColor = [UIColor redColor];
    
        label.font = [UIFont systemFontOfSize:40];
    
        CGRect frame = CGRectZero;
    
        frame.origin = CGPointMake(p2.x - 17, p2.y - 23);
    
        frame.size = CGSizeMake(40, 40);
    
        label.frame = frame;
    
        [self.imageView addSubview:label];
    
    }

    回到顶部

    3.触控(touch)

    3.1 用户接触屏幕时产生touch对象,UITouch类型

    3.2 获取用户的touch对象,有什么用:绘图、涂鸦、手写

    3.3 如何获取touch对象,覆盖视图对象方法UIView中定义的三个方法,Began,Moved,Ended

    // 用户touch时会调用此方法
    
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    
        UITouch *touch = [touches anyObject];
    
        CGPoint point = [touch locationInView:self];
    
        NSLog(@"touch start:%f,%f",point.x,point.y);
    
    }
    
    // 用户不停的划时不停的调用此方法
    
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    
        UITouch *touch = [touches anyObject];
    
        CGPoint point = [touch locationInView:self];
    
        NSLog(@"touch moved:%f,%f",point.x,point.y);
    
    }
    
    // 用户touch结束时调用此方法
    
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    
        UITouch *touch = [touches anyObject];
    
        CGPoint point = [touch locationInView:self];
    
        NSLog(@"touch ended:%f,%f",point.x,point.y);
    
    }

    回到顶部

    4.布局

    4.1 摆放子视图或控件到父视图中

    4.2 目的:屏幕的大小经常会发生变化,当屏幕大小改变后,为了让界面看起来没问题,需要多子视图的frame进行一些改变。

    4.3 导致需要重新布局的原因

          1>设备不同

          2>屏幕的方向

          3>状态栏

               * 在ios7中不再挤占VC的控件,占20点的空间,默认是显示的,

    // 隐藏状态栏

    -(BOOL)prefersStatusBarHidden{

        return YES;

    }

               * 来电话时,挤占空间

          4>各种bar

               navigationbar     占用44

               toolbar               占用44

               tabbar                占用49

          5>键盘,情况复杂

    4.4 如何进行布局

          1>纯代码方式,代码中进行计算,功能强大,代码量大

          2>autoresizing技术,可以用代码或storyboard

          3>autolayout自动布局,storyboard,代码

    回到顶部

    5.代码布局

    5.1在哪儿写布局代码,VC或view,如果在VC中写,覆盖一个方法:viewDidLayoutSubviews

    作业:绘图板,支持多根线

    MXDrawLineView

          -NSMutableArray *lines;

               -[item];MXLine线

               -UIColor*currentColor

               -CGFloat lineWidth;

    MXLine

          -NSMutableArray *points;

               -[item]:MXPoint;

          -UIColor *color;

          -CGFloat width;

    MXPoint

          -x

          -y

    1)先画出一条线

    2)画多条线

    3)能调线宽,用slider调

    4)能设置颜色,用几个按钮表示颜色

    5)增加一个橡皮(画比较宽的白线)

     

    注意:

    手势和变形

    1.手势即可以由视图对象来响应,也可以由视图控制器来响应

    2.transform变形

    缩放(scale)旋转(rotation)位移(translation),位移经常被center属性的修改代替

    CGAffineTransform是结构体类型6个值,修改视图的transform属性是通过它的6个值完成的,而修改6个值是通过系统提供的C的API来做到:

    CGAffineTransformScale/Rotation/...

    CGAffineTransformMakeScale/Rotation/...

  • 相关阅读:
    swap函数的例子
    实现类似shared_ptr的引用计数
    使用new分配内存的类需要自己定义拷贝构造函数
    练习13.14 13.15 13.16
    查询单词,综合例子。
    无序容器
    关联容器操作
    关联容器概述
    文本查询程序
    shared_ptr与weak_ptr的例子
  • 原文地址:https://www.cnblogs.com/yangmx/p/3532883.html
Copyright © 2011-2022 走看看