分页、NSTimer、屏幕适配、Autolayout、VFL

2016-09-18  本文已影响37人  Hevin_Chen

分页

- 只要将UIScrollView的pageEnabled属性设置为YES,UIScrollView会被分割成多个独立页面,里面的内容就能进行分页展示

- 一般会配合UIPageControl增强分页效果,UIPageControl常用属性如下

// 一共有多少页

@property(nonatomic) NSInteger numberOfPages;

// 当前显示的页码

@property(nonatomic) NSInteger currentPage;

// 只有一页时,是否需要隐藏页码指示器

@property(nonatomic) BOOL hidesForSinglePage;

//  其他页码指示器的颜色

@property(nonatomic,retain) UIColor *pageIndicatorTintColor;

//  当前页码指示器的颜色

@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;

NSTimer

- NSTimer叫做“定时器”,它的作用如下

- 在指定的时间执行指定的任务

- 每隔一段时间执行指定的任务

调用下面的方法就会开启一个定时任务

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget

selector:(SEL)aSelector

userInfo:(id)userInfo

repeats:(BOOL)yesOrNo;

每隔ti秒,调用一次aTarget的aSelector方法,yesOrNo决定了是否重复执行这个任务

通过invalidate方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。只能再创建一个新的定时器才能执行新的任务

- (void)invalidate;

- 解决定时器在主线程不工作的问题

NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(next) userInfo:nil repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

屏幕适配的发展历史

- iPhone3GS\iPhone4

      - 没有屏幕适配可言

      - 全部用frame、bounds、center进行布局

      - 很多这样的现象:坐标值、宽度高度值全部写死

UIButton *btn1 = [[UIButton alloc] init];

btn1.frame = CGRectMake(0, 0, 320 - b, 480 - c);

- iPad出现、iPhone横屏

       - 出现Autoresizing技术

             - 让横竖屏适配相对简单

             - 让子控件可以跟随父控件的行为自动发生相应的变化

             - 前提是:关闭Autolayout功能

             - 局限性

                     - 只能解决子控件跟父控件的相对关系问题

                     - 不能解决兄弟控件的相对关系问题

- iOS 6.0(Xcode4)开始

     - 出现了Autolayout技术

    - 从Xcode5.0(iOS 7.0)开始,开始流行Autolayout

设备分辨率

什么是Autolayout

- Autolayout是一种“自动布局”技术,专门用来布局UI界面的

- Autolayout自iOS 6开始引入,由于Xcode 4的不给力,当时并没有得到很大推广

- 自iOS 7(Xcode5)开始,Autolayout的开发效率得到很大的提升

- 苹果官方也推荐开发者尽量使用Autolayout来布局UI界面

- Autolayout能很轻松地解决屏幕适配的问题

代码实现Autolayout

- 代码实现Autolayout的步骤

     - 利用NSLayoutConstraint类创建具体的约束对象

     - 添加约束对象到相应的view上

- (void)addConstraint:(NSLayoutConstraint *)constraint;

- (void)addConstraints:(NSArray *)constraints;

- 代码实现Autolayout的注意点

   - 要先禁止autoresizing功能,设置view的下面属性为NO

   - view.translatesAutoresizingMaskIntoConstraints = NO;

   - 添加约束之前,一定要保证相关控件都已经在各自的父控件上

   - 不用再给view设置frame

NSLayoutConstraint

- 一个NSLayoutConstraint对象就代表一个约束

- 创建约束对象的常用方法

+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

- view1 :要约束的控件

- attr1 :约束的类型(做怎样的约束)

- relation :与参照控件之间的关系

- view2 :参照的控件

- attr2 :约束的类型(做怎样的约束)

- multiplier :乘数

- c :常量

添加约束

- (void)addConstraint:(NSLayoutConstraint *)constraint;

- (void)addConstraints:(NSArray *)constraints;

- 注意

- 一定要在拥有父控件之后再添加约束

- 关闭Autoresizing功能

view.translatesAutoresizingMaskIntoConstraints = NO;


使用代码实现Autolayout的方法2 - VFL

- 使用VFL创建约束数组

+ (NSArray *)constraintsWithVisualFormat:(NSString *)format

options:(NSLayoutFormatOptions)opts

metrics:(NSDictionary *)metrics

views:(NSDictionary *)views;

* format :VFL语句

* opts :约束类型

* metrics :VFL语句中用到的具体数值

* views :VFL语句中用到的控件

- 使用下面的宏来自动生成views和metrics参数

NSDictionaryOfVariableBindings(...)


 使用代码实现Autolayout的方法3 - Masonry

- 使用步骤

- 添加Masonry文件夹的所有源代码到项目中

- 添加2个宏、导入主头文件

// 只要添加了这个宏,就不用带mas_前缀

#define MAS_SHORTHAND

// 只要添加了这个宏,equalTo就等价于mas_equalTo

#define MAS_SHORTHAND_GLOBALS

// 这个头文件一定要放在上面两个宏的后面

#import "Masonry.h"

- 添加约束的方法

// 这个方法只会添加新的约束

[view makeConstraints:^(MASConstraintMaker *make) {

}];

// 这个方法会将以前的所有约束删掉,添加新的约束

[view remakeConstraints:^(MASConstraintMaker *make) {

}];

// 这个方法将会覆盖以前的某些特定的约束

[view updateConstraints:^(MASConstraintMaker *make) {

}];

- 约束的类型

1.尺寸:width\height\size

2.边界:left\leading\right\trailing\top\bottom

3.中心点:center\centerX\centerY

4.边界:edges

自动布局的核心计算公式

- 自动布局的核心计算公式

obj1.property1 =(obj2.property2 * multiplier)+ constant value

VFL示例

- H:[cancelButton(72)]-12-[acceptButton(50)]canelButton宽72,acceptButton宽50,它们之间间距12

- H:[wideView(>=60@700)]wideView宽度大于等于60point,该约束条件优先级为700(优先级最大值为1000,优先级越高的约束越先被满足)

- V:[redBox][yellowBox(==redBox)]竖直方向上,先有一个redBox,其下方紧接一个高度等于redBox高度的yellowBox

- H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|水平方向上,Find距离父view左边缘默认间隔宽度,之后是FindNext距离Find间隔默认宽度;再之后是宽度不小于20的FindField,它和FindNext以及父view右边缘的间距都是默认宽度。(竖线“|” 表示superview的边缘

VFL的使用

- 使用VFL来创建约束数组

+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;

- format :VFL语句

- opts :约束类型

- metrics :VFL语句中用到的具体数值

- views :VFL语句中用到的控件

- 创建一个字典(内部包含VFL语句中用到的控件)的快捷宏定义

NSDictionaryOfVariableBindings(...)

上一篇下一篇

猜你喜欢

热点阅读