控制器的父子关系

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. April 7 2017 Week 14 Friday

    A good heart is better than all the brains in the world. 聪明绝顶,不如宅心仁厚. A good heart can be useful to ...

  2. 使用ABAP代码创建S/4HANA里的Sales Order

    下图是使用ABAP代码创建的S/4HANA的Sales Order的截图: 其中红色区域的值是我代码里硬编码的,而蓝色是函数SD_SALESDOCUMENT_CREATE自己创建的. 来看下代码: D ...

  3. MSD_radix_sort

    一.这次是在上一次尝试基础上进行的,预期是达到上次性能的9倍. MSD的基本手法就是不断切片.每一步都是把整体数据切割成256片,如上图所示,实际情况切片未必均匀,有的slice内可能一个元素也没有. ...

  4. 计算多项式Poj(1996)

    题目链接:http://poj.org/problem?id=1996 思路: 刚开始打了个二维表,调了一个小时,爆内存了. #include <stdio.h> #include < ...

  5. 【转】startActivityForResult和setResult详解

    startActivityForResult与startActivity的不同之处在于:1.startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startAct ...

  6. EF Database first 中,实现 多个表对应一个 实体的 查询

    1.首先 创建好 数据 库. hobby表 major 表 student 表 外键 关系如下 2. 实现将 数据库 映射到EDM中 视图如下 在VS中 生成了 3个实体类  ,对应的是 数据库中的3 ...

  7. mysql常用命令添加外键主键约束存储过程索引

    数据库连接 mysql -u root -p123456 查看表 show databases 创建数据库设置编码 create table books character set utf8; 创建用 ...

  8. putty乱码问题

    1.将linux系统编码设置为utf-8 #vi /etc/sysconfig/i18n #设置为如下内容: LANG="en_US.UTF-8" SYSFONT="la ...

  9. Linux驱动学习(编写一个最简单的模块)

    在Linux中想做驱动开发,那么一定要先熟悉module的使用和编写 一.什么是module 从名字上看就是模块的意思,我个人的理解就是一个一个的小程序,可以进行动态的安装和卸载,而在这里面就实现一些 ...

  10. 第38章 I2S—音频播放与录音输入—零死角玩转STM32-F429系列

    第38章     I2S—音频播放与录音输入 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...