zoukankan      html  css  js  c++  java
  • iOS笔记057

     控制器的父子关系

    1、控制器父子关系的建立原则
            如果2个控制器的view是父子关系(不管是直接还是间接的父子关系),那么这2个控制器也应该为父子关系

    [self.view addSubview:view];

    [self addChildViewController:viewController];

    2、获得所有的子控制器

    @property(nonatomic,readonly) NSArray *childViewControllers;

    3、添加一个子控制器

    // ViewController成为了self的子控制器

    // self成为了ViewController的父控制器

    // 通过addChildViewController添加的控制器都会存在于childViewControllers数组中

    [selfaddChildViewController:[[ViewControlleralloc] init]];

    4、获得父控制器

    @property(nonatomic,readonly) UIViewController *parentViewController;

    5、将一个控制器从它的父控制器中移除

    // 控制器a从它的父控制器中移除

    [selfremoveFromParentViewController];

    6、添加控件到主控件后调用

    - (void)didMoveToParentViewController:(UIViewController *)parent

    {  

    }

    UIScrollView使用注意

     

    UIScrollView内部子控件添加约束的注意点

    1、子控件的尺寸不能通过UIScrollView来计算,可以考虑通过以下方式计算

            可以设置固定值(width==100,height==300)

            可以相对于UIScrollView以外的其他控件来计算尺寸

    2、UIScrollView的frame应该通过`子控件以外的其他控件来计算

    3、UIScrollView的contentSize通过子控件来计算

            根据子控件的尺寸以及子控件与UIScrollView之间的间距

    窗口悬停

    不使用自动布局,使用frame

            添加几个子控件(UIScrollView -> UIImageView,UIView),直接设置frame确定尺寸
    1、分析
            这个UIView在达到窗口顶部时一直显示在窗口顶部,但是UIScrollView可以继续向上滚动
            监视UIScrollView的偏移量,当view达到顶部时,将view 从UIScrollView中移除,添加到self.view,向下滑动时,到这个原来view 的位置时再把view添加到UIScrollView,再向下拖动就方法图片
            实现时要用一个属性来记录view 在UIScrollView中得位置
            注意,这里通过storyboard添加的子控件,没有使用自动布局,所以要把自动布局完毕关闭,不然会出现莫名其妙的问题
    2、实现
            主要是在滚动scrollView时进行判断

    - (void)viewDidLoad {

        [superviewDidLoad];

       // 设置scrollView的尺寸

        _blueScrollView.contentSize = CGSizeMake(0, 1000);

        // 记录redView旧值

        _oldRect = self.redView.frame;

    }

     

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView

    {

        // 滚动过程中判断红色view 的位置,如果位于最顶部,就从UIScrollView脱离,添加到self.view,否则就添加到UIScrollView

        // 当前view距离顶部的距离

        CGFloat height = scrollView.contentOffset.y - self.imageView.bounds.size.height;

     

        if (height >= 0) {

     

            CGRect temp = _oldRect;

            temp.origin.y = 0; // 设置新的位置

            self.redView.frame = temp;

            [self.view addSubview:self.redView];

        }

        else

        {

            self.redView.frame = _oldRect; // 还原

            [self.blueScrollViewaddSubview:self.redView];

        }

        // 缩放图片

        CGFloat scale = (1 - scrollView.contentOffset.y/70);

        NSLog(@"%f",scale);

        scale = scale >= 1 ? scale : 1;

        self.imageView.transform = CGAffineTransformMakeScale(scale, scale);

    }

    自动布局实现

            自动布局实现貌似又复杂了,使用自动布局的话,不能直接修改frame,否则会出问题,所以这里新建一个大小一致的view,显示到self.view,
            首先要重新生成一个UIView,最好就是克隆一个和redView一样的view,然后设置在原始位置,滚动到顶部时显示,向下滚动时隐藏。
            代码如下:

    - (void)viewDidLoad {

        [superviewDidLoad];

        // 新建一个view,大小和redView一样,显示在顶部

        _stopView = [[UIView alloc ]init];

        _stopView.frame = self.redView.bounds;

        _stopView.backgroundColor = self.redView.backgroundColor;

    }

     

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView

    {

        // 滚动过程中判断红色view 的位置,如果位于最顶部,就从UIScrollView脱离,添加到self.view,否则就添加到UIScrollView

        // 使用自动布局的话,不能直接修改frame,否则会出问题,所以这里新建一个大小一致的view,显示到self.view

     

        // 当前view距离顶部的距离

        CGFloat height = self.imageView.bounds.size.height - scrollView.contentOffset.y;

     

        if (height <= 0) {

            // 显示

            _stopView.hidden = NO;

            [self.view addSubview:_stopView];

        }else

        {

            // 隐藏

            _stopView.hidden = YES;

            [self.blueScrollViewaddSubview:self.redView];

        }

        

        // 缩放图片

        CGFloat scale = (1 - scrollView.contentOffset.y/70);

        scale = scale >= 1 ? scale : 1;

        self.imageView.transform = CGAffineTransformMakeScale(scale, scale);

    }

    const和指针以及数组

     指针与const

    void pointAndConst()

    {

        int num  = 10;

        int bad = 20;

        const int *p1 ;

        int const *p2 ;

        int *const p3 ;

        

        // 常量指针 --- 是一个指针,由一个不可变指针指向一个变量

        constint *p = &num; // 修饰的是*p,所以直接通过*p修改数据不允许

        // int const *p = &num; // 修饰的也是*p,所以直接通过*p修改数据不允许

        // 指针常量 --- 是一个常量,由一个可变指针指向一个常量

        //int * const p = &num; // 修饰的是p,所以直接通过p修改数据不允许

        // 总结:const右边修饰的是神马,那这个就不可变

        NSLog(@"%d--%p",num,&num);

        //        *p += 10;

        //        num += 10;

        NSLog(@"%d--%p",*p,p);

        

        p = &bad; //

        NSLog(@"%d--%p",*p,p);

    }

    总结:const右边修饰的是神马,那这个神马就不可变(p,*p)

    指针和数组

    一维数组分析

    /*

     * 一维数组

     */

    int numbers[4] = {11,21,31,41};

    // numbers 是数组的地址,&number等价与一个指向数组的指针,如果进行+1的话,指针跳转的时整个数组的长度(16个字节)

    // 0x7fff5fbff780--0x7fff5fbff790

    NSLog(@"%p--%p",&numbers,&numbers + 1);

    // numbers 是数组的地址,等价于首元素的地址number[0],首元素是一个int类型的指针,故+1,跳转4个字节

     NSLog(@"%p--%p",numbers,numbers + 1);

    // numbers[0] 是数组的首元素,&numbers[0]等价一个int类型的数据,+1的话跳转一个int类型大小(4个字节)

    // 0x7fff5fbff780--0x7fff5fbff784

    NSLog(@"%p--%p--%d",&numbers[0],&numbers[0] + 3,*(&numbers[0] + 3));

    三维数组分析

    /*

    * 三维数组

    */

    int numbers[3][3] = {

        {11,12,13}, // numbers[0]

        {33,34,35}, // numbers[1]

        {55,56,57// numbers[2]

    };

    // numbers 是数组的地址,&number等价与一个指向数组的指针,如果进行+1的话,指针跳转的时整个数组的长度(36个字节)

    // 0x7fff5fbff770--0x7fff5fbff794

    NSLog(@"%p--%p--%d",&numbers,&numbers + 1,***(&numbers + 1)); // 数组越界

     

    // numbers 是数组的地址,等价与number[0],numbers[0]是一个指向{112233}一维数组的指针, +1指针跳转数组大小字节(12字节))

    NSLog(@"%p--%p--%d",numbers,numbers + 1,**(numbers + 1));

     

    // numbers[0] {112233}数组的地址,&numbers[0]等价与一个指向{112233}数组的指针,+1的话,指针跳转数组大小字节(12字节)

    // 0x7fff5fbff770--0x7fff5fbff77c

    // numbers[0] 是数组{11,22,33}的地址,等价于numbers[0][0],+1的话跳转一个int类型大小(4个字节)

    NSLog(@"%p--%p--%d",numbers[0],numbers[0] + 1,*(numbers[0] + 1));

    NSLog(@"---------------");

     

    // &numbers[0] 等价与指向一维数组{11,22,33}的指针,+1的话跳转数组大小(12个字节)

    NSLog(@"%p--%p--%d",&numbers[0],&numbers[0] + 1,**(&numbers[0] + 1));

     

    // &numbers[0][0] 等价与一个指向int类型的指针,+1跳转4个字节

     NSLog(@"%p--%p--%d",&numbers[0][0],&numbers[0][0] + 3,*(&numbers[0][0] + 3));

     

    // &numbers[1] 等价与指向一维数组{33,34,35}的指针,+1的话跳转数组大小(12个字节)

    NSLog(@"%p--%p--%d",&numbers[1],&numbers[1] + 1,**(&numbers[1]+ 2));

    总结

    1、指针p的加减法运算

     指针p + N

         p里面存储的地址值 + N * 指针所指向类型的占用字节数

     指针p - N

         p里面存储的地址值 - N * 指针所指向类型的占用字节数

    2、数组名

     存储的是数组首元素的地址

     等价于:一个指向数组首元素的指针

     数组名 + 1 的跨度:数组首元素的占用字节数

    3、其他结论

      &num + 1的跨度:num的占用字节数

  • 相关阅读:
    DNN 4.9补丁
    15款经典图表软件推荐 创建最漂亮的图表
    在.NET使用JSON作为数据交换格式
    JQuery 动态删除
    在ASP.NET中使用Highcharts js图表
    一个比较好的工具网站
    DataTable与实体类互相转换
    第一次写JQuery页面
    一个代码查询网址
    NioEventLoop
  • 原文地址:https://www.cnblogs.com/songliquan/p/4633138.html
Copyright © 2011-2022 走看看