iOS笔记057 - UI总结03
控制器的父子关系
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 = # // 修饰的是*p,所以直接通过*p修改数据不允许
// int const *p = # // 修饰的也是*p,所以直接通过*p修改数据不允许
// 指针常量 --- 是一个常量,由一个可变指针指向一个常量
//int * const p = # // 修饰的是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的更多相关文章
- iOS笔记056 - UI总结02
九宫格布局 UICollectionViewController 创建控制器一定要指定默认的布局样式. // 加载一个九宫格布局的控制器,必须指定布局样式 UICollectionViewFlowLa ...
- iOS笔记055 - UI总结01
1.程序启动后的开始动画 程序启动后可以加载一个简单的动画界面来介绍程序或者用户信息. 可以使用一个xib来描述界面.并且如果想在程序加载完成后第一个加载这个xib文件,需要在Appdelegat ...
- 荼菜的iOS笔记--UIView的几个Block动画
前言:我的第一篇文章荼菜的iOS笔记–Core Animation 核心动画算是比较详细讲了核心动画的用法,但是如你上篇看到的,有时我们只是想实现一些很小的动画,这时再用coreAnimation就会 ...
- 免费素材下载:iOS 8 矢量 UI 素材套件
小伙伴们,苹果终于在今天凌晨推送了 iOS 8 的正式版.虽然该系统并未与 iPhone6 发布会同时亮相,但对于已经提前体验尝鲜过测试版的同学来说并不陌生.iOS 8 几乎每个图标都进行了重新设计, ...
- iOS之微博UI实例--拟物化设计(成功了90%)
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- IOS开发-UI学习-sqlite数据库的操作
IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...
- 79.iOS 设备的UI规范和iOS各控件默认高度
iOS设备的UI 规范 iPhone界面尺寸 iPhone图标尺寸 iPad的设计尺寸 iPad图标尺寸 iPhone设备尺寸分辨率比例 iPhone各设备 launch image iOS 各种控件 ...
- iOS 学习笔记 六 (2015.03.28)常见错误
2015.03.28 1. property's synthesized getter follows Cocoa naming convention for returning 'owned' ob ...
- IOS 学习笔记之UI
自定义控件,实现部分 - (id)initWithFrame:(CGRect)frame descriptionText:(NSArray *)inText/*需要输入两个字符串*/ { self = ...
随机推荐
- MySQL入门很简单: 10 mysql运算符
1. 算术运算符 例子: 将t1表中字段a的值进行加法,减法和乘法 2. 比较运算符 注:LIKE经常和通配符"_"和"%"一起使用,"_" ...
- 【JavaScript 封装库】BETA 4.0 测试版发布!
/* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...
- java对字符串进行加密和解密(以下是来自其他博主)
背景:需要对读取数据库配置的文件进行加密,防止他人拿到数据,而对自己的代码,有要实现进行解密,网上给的加密方式,什么MD5,base64,还有等等,都太复杂,而且有些是单向的,只加密不解密,以下代码, ...
- Uva 11582 巨大的斐波那契数 模运算
题目链接:https://vjudge.net/contest/156903#problem/A 题意:计算 f(a^b)%n 分析: 1.斐波那契数列是 f(i+2) = f(i+1) + f(i) ...
- C语言中%p,%u,%lu都有什么用处
%p表示输出这个指针, %d表示后面的输出类型为有符号的10进制整形, %u表示无符号10进制整型, %lu表示输出无符号长整型整数 (long unsigned)
- 【JS-Java-EL】JavaScript和Java(EL表达式)引发的 Uncaught SyntaxError: Unexpected token ILLEGAL
2018.10.14 BUG原因: 在较早期的代码中,容易出现 JS 拼接 HTML 代码字符串的情况.如 // 页面 test.jsp 内部的 JS 代码 // ${} JSP中EL语法,内部为Ja ...
- java乱码问题
我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...
- POJ1286 Necklace of Beads(Polya定理)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9359 Accepted: 3862 Description Beads ...
- MappingException:class com.zsn.crm.Model.user not found whie looking for property user id
之前好好地运行 什么东西都没动过 再次运行突然报异常*****MappingException:class com.zsn.crm.Model.user not found whie looking ...
- Ubuntu安装MySQL及使用Xshell连接MySQL出现的问题(2003-Can't connect to MySql server及1045错误)
不管在什么地方,什么时候,学习是快速提升自己的能力的一种体现!!!!!!!!!!! 以下所有的命令都是在root用户下操作(如果还没有设置root密码)如下: 安装好Ubuntu系统之后,打开终端先设 ...
