控制器的父子关系

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

],&numbers[] + ,*(&numbers[] + ));

三维数组分析

/*

* 三维数组

*/

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]是一个指向{11,22,33}一维数组的指针, +1指针跳转数组大小字节(12字节))

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

// numbers[0] 是{11,22,33}数组的地址,&numbers[0]等价与一个指向{11,22,33}数组的指针,+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个字节)

],&numbers[] + ,**(&numbers[]+ ));

总结

1、指针p的加减法运算

指针p + N

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

指针p - N

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

2、数组名

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

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

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

3、其他结论

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

iOS笔记057 - UI总结03的更多相关文章

  1. iOS笔记056 - UI总结02

    九宫格布局 UICollectionViewController 创建控制器一定要指定默认的布局样式. // 加载一个九宫格布局的控制器,必须指定布局样式 UICollectionViewFlowLa ...

  2. iOS笔记055 - UI总结01

      1.程序启动后的开始动画 程序启动后可以加载一个简单的动画界面来介绍程序或者用户信息. 可以使用一个xib来描述界面.并且如果想在程序加载完成后第一个加载这个xib文件,需要在Appdelegat ...

  3. 荼菜的iOS笔记--UIView的几个Block动画

    前言:我的第一篇文章荼菜的iOS笔记–Core Animation 核心动画算是比较详细讲了核心动画的用法,但是如你上篇看到的,有时我们只是想实现一些很小的动画,这时再用coreAnimation就会 ...

  4. 免费素材下载:iOS 8 矢量 UI 素材套件

    小伙伴们,苹果终于在今天凌晨推送了 iOS 8 的正式版.虽然该系统并未与 iPhone6 发布会同时亮相,但对于已经提前体验尝鲜过测试版的同学来说并不陌生.iOS 8 几乎每个图标都进行了重新设计, ...

  5. iOS之微博UI实例--拟物化设计(成功了90%)

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  6. IOS开发-UI学习-sqlite数据库的操作

    IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...

  7. 79.iOS 设备的UI规范和iOS各控件默认高度

    iOS设备的UI 规范 iPhone界面尺寸 iPhone图标尺寸 iPad的设计尺寸 iPad图标尺寸 iPhone设备尺寸分辨率比例 iPhone各设备 launch image iOS 各种控件 ...

  8. iOS 学习笔记 六 (2015.03.28)常见错误

    2015.03.28 1. property's synthesized getter follows Cocoa naming convention for returning 'owned' ob ...

  9. IOS 学习笔记之UI

    自定义控件,实现部分 - (id)initWithFrame:(CGRect)frame descriptionText:(NSArray *)inText/*需要输入两个字符串*/ { self = ...

随机推荐

  1. 【js基础修炼之路】— 我理解的原型链

    提起原型链,大家并不陌生,但是对于新人来说一提到原型方面的东西就会比较懵.在我自一次面试的时候,面试官也给我提了这样的问题,当时就按照我的理解说了一些,但是很肤浅,在此我希望给刚入门的前端小伙伴聊一下 ...

  2. python 网址

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034e ...

  3. iOS逆向命令集

    越狱命令行 破壳: 10.10.215.119 ssh root@10.10.215.119 ssh root@10.10.213.176 CCBMobileBank Fuqianlade-iPhon ...

  4. sqlserver 使用小技巧总结

    1.  在数据库 查询中  在表名后面 加    英文字母,可以方便 查询 select a.name ,b.hobbynamefrom student as a, hobby as bwhere a ...

  5. Eclipse Python插件 PyDev

    PyDev for Eclipse 是一个功能强大且易用的 Eclipse Python IDE 插件.本文将向读者介绍 PyDev 开源项目及其安装配置方法,并在此基础上详细介绍如何利用 PyDev ...

  6. 利用sysbench进行MySQL OLTP基准测试

      Preface       In order to know clearly about the real performance threshold of database server,we ...

  7. httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例

    httpd配置内容 httpd2.2 配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf 服务脚本: /etc/rc.d/init.d/ ...

  8. Linux 个人服务搭建脱坑实录

    环境:VMware.Centos7 64位.jdk1.7.Tomcat 7 说明:本是个人的爬坑经历所总结出来的,记录一下心得.也给有需要的人提供一些帮助.引用了一些大神的笔记,非常感谢,希望大神们不 ...

  9. php-5.6.26源代码 - opcode执行

    文件 php-5.6.26/Zend/zend_vm_execute.h ZEND_API void execute_ex(zend_execute_data *execute_data TSRMLS ...

  10. C语言结构体指针成员强制类型转换

    #include <stdio.h> #include <stdlib.h> typedef struct ListElmt_ { void *data; struct Lis ...