一. UITextView
1. 有点像UILabel,但是可以换行、选择文字、编辑、滚动(scroll), 等等。
使用NSMutableAttributedString来设置文本及其属性。
使用属性:
@property (nonatomic, readonly) NSTextStorage *textStorage;
来获取UITextView中的NSMutableAttributedString,
NSTextStorage是NSMutableAttributedString的子类。
在ios7中,你可以简单的修改这个属性,UITextView会自动更新。
2.设置字体(font)
在UITextView中,每个字符的字体可以不一样。但是也有个属性用来指定一个全局的字体。
@property (nonatomic, strong) UIFont *font;
修改字符的字体不会重置其他属性(e.g. color, underline, etc.).
3.在UITextView中使用TextKit实现高级布局:
以下属性定义在UITextView中,哪里可以放置文字:
@property (readonly) NSTextContainer *textContainer;
以下对象将从textStorage中读取字符并把字符排放到textContainer中:
@property (readonly) NSLayoutManager *layoutManager;
这些对象非常强大,比如说textContainer可以指定不规则区域,如环绕图片排版。
你可以自己去查看你感兴趣的功能。
二. 视图控制器生命周期(View Controller LifeCycle)
1. 视图控制器有一个生命周期,在其生命周期中将有一系列的消息发送给它处理。
通常通过重写类方法来处理具体的消息。
生命周期的开始:创建视图控制器
在ios MVC模型中,MVC通常是通过故事板(storyboard)实例化的。
也有在代码中实例化的情况, 但是比较少。
接下来:
Outlet 设置;
显示和消失;
图形变化;
低内存;
在每个阶段,iOS会触发一个或一组控制器的方法。
2.在实例化并且设置了Outlet后,viewDidLoad将被调用,这是初始化的好时机:
但是请小心,这个时候视图的图形(边框)还没有设置,还不知道你的程序是运行在多大的屏幕上,是iPhone 5还是iPad? 所以这个时候不要初始化依赖图形的部分。3. 在视图出现在屏幕上之前,你会得到通知:-(void)viewWillAppear:(BOOL)animated;你会得到一次"loaded"类的消息一次,但是可能"appear"和"disapper"很多次。所以不要把需要放到viewDidLoad中的东西放到这个方法中,否则你的代码会做很多不需要的、重复的动作。4.在视图将要消失在屏幕上时,你也会得到通知:这里可以做一些清理工作:
5.显示和消失方法还有"did"版本:
-(void)viewDidApper:(BOOL)animated;
-(void)viewDidDisapper:(BOOL)animated;
6.图形变化?
大部分时候这个会被AutoLayout自动处理:
-(void)view{Will,Did}LayoutSubviews;
这个函数会在视图的frame变化时被调用,然后视图的孩子将会被重新布局(re-layed out).
7.自动旋转(autorotate)
当设备旋转后,如果满足以下条件,顶层view controller 将会重新设置边界:
A. view controller 的shouldAutorotate函数返回YES.
B. view controller 的supportedInterfaceOrientations函数返回新的orientation.
C. 应用(application)允许旋转到这个方向(在Info.plist文件中定义).
通常在MVCs中支持旋转是不错的选择。
8.在低内存的情况下,didReceiveMemoryWarning将会被调用。
这种情况很少发生,但是好的代码设计应该预料到这种情况,如处理图片和声音时。
任何占用较大内存的对象,会被重复创建的对象,都应该释放(set strong pointer to nil).
9.awakeFromNib
这个方法会发送给任何从storyboard中出来的对象。
这个方法会在outlet设置之前被调用(i.e. 在MVC 加载之前).
如果可以的话,尽量不要把代码放到这里(e.g viewDidLoad or viewWillApper).
任何在你的控制器的init方法中放置的代码也必须放置到awakeFromNib,
因为从storyboard中出来的对象不会调用init方法。
10.总结
实例化(从storyboard中).
awakeFromNib
设置outlet
viewDidLoad
(当图形形状已经定下来了)
viewWillLayoutSubviews: and viewDidLayoutSubviews:
(下一组函数将会重复调用,如果你的MVC经常出现和消失在屏幕上)
viewWillAppear and viewDidAppear;
(在任何可视的时候,图形形状发生变化,如device ratation)
viewWillLayoutSubviews: and viewDidLayoutSubviews:
(如果是autorotation,你会收到will/didRatateTo/From message,虽然很少使用).
viewWillDisappear; and viewDidDisappear:
(如果出现低内存情况)
didReceiveMemoryWarning
(已经没有unload方法,以上就是全部的生命周期)
1. 有点像UILabel,但是可以换行、选择文字、编辑、滚动(scroll), 等等。
使用NSMutableAttributedString来设置文本及其属性。
使用属性:
@property (nonatomic, readonly) NSTextStorage *textStorage;
来获取UITextView中的NSMutableAttributedString,
NSTextStorage是NSMutableAttributedString的子类。
在ios7中,你可以简单的修改这个属性,UITextView会自动更新。
2.设置字体(font)
在UITextView中,每个字符的字体可以不一样。但是也有个属性用来指定一个全局的字体。
@property (nonatomic, strong) UIFont *font;
修改字符的字体不会重置其他属性(e.g. color, underline, etc.).
3.在UITextView中使用TextKit实现高级布局:
以下属性定义在UITextView中,哪里可以放置文字:
@property (readonly) NSTextContainer *textContainer;
以下对象将从textStorage中读取字符并把字符排放到textContainer中:
@property (readonly) NSLayoutManager *layoutManager;
这些对象非常强大,比如说textContainer可以指定不规则区域,如环绕图片排版。
你可以自己去查看你感兴趣的功能。
二. 视图控制器生命周期(View Controller LifeCycle)
1. 视图控制器有一个生命周期,在其生命周期中将有一系列的消息发送给它处理。
通常通过重写类方法来处理具体的消息。
生命周期的开始:创建视图控制器
在ios MVC模型中,MVC通常是通过故事板(storyboard)实例化的。
也有在代码中实例化的情况, 但是比较少。
接下来:
Outlet 设置;
显示和消失;
图形变化;
低内存;
在每个阶段,iOS会触发一个或一组控制器的方法。
2.在实例化并且设置了Outlet后,viewDidLoad将被调用,这是初始化的好时机:
<pre name="code" class="html">- (void)viewDidLoad
{
[super viewDidLoad]; // always let super have a chance in lifecycle methods
// do some setup of my MVC
}
但是请小心,这个时候视图的图形(边框)还没有设置,还不知道你的程序是运行在多大的屏幕上,是iPhone 5还是iPad? 所以这个时候不要初始化依赖图形的部分。3. 在视图出现在屏幕上之前,你会得到通知:-(void)viewWillAppear:(BOOL)animated;你会得到一次"loaded"类的消息一次,但是可能"appear"和"disapper"很多次。所以不要把需要放到viewDidLoad中的东西放到这个方法中,否则你的代码会做很多不需要的、重复的动作。4.在视图将要消失在屏幕上时,你也会得到通知:这里可以做一些清理工作:
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisapper:animated];
[self rememberScrollPosition];
[self saveDataToPermanentStore];
}
5.显示和消失方法还有"did"版本:
-(void)viewDidApper:(BOOL)animated;
-(void)viewDidDisapper:(BOOL)animated;
6.图形变化?
大部分时候这个会被AutoLayout自动处理:
-(void)view{Will,Did}LayoutSubviews;
这个函数会在视图的frame变化时被调用,然后视图的孩子将会被重新布局(re-layed out).
7.自动旋转(autorotate)
当设备旋转后,如果满足以下条件,顶层view controller 将会重新设置边界:
A. view controller 的shouldAutorotate函数返回YES.
B. view controller 的supportedInterfaceOrientations函数返回新的orientation.
C. 应用(application)允许旋转到这个方向(在Info.plist文件中定义).
通常在MVCs中支持旋转是不错的选择。
8.在低内存的情况下,didReceiveMemoryWarning将会被调用。
这种情况很少发生,但是好的代码设计应该预料到这种情况,如处理图片和声音时。
任何占用较大内存的对象,会被重复创建的对象,都应该释放(set strong pointer to nil).
9.awakeFromNib
这个方法会发送给任何从storyboard中出来的对象。
这个方法会在outlet设置之前被调用(i.e. 在MVC 加载之前).
如果可以的话,尽量不要把代码放到这里(e.g viewDidLoad or viewWillApper).
任何在你的控制器的init方法中放置的代码也必须放置到awakeFromNib,
因为从storyboard中出来的对象不会调用init方法。
-(void)setup{};//do something which can't wait until viewDidLoad
-(void)awakeFromNib { [self setup]; };
//UIViewController的指定initializer是initWithNibName:bundle:
-(instancetype)initWithNibName:(NSString *)name bundle:(NSBundle *)bundle
{
self = [super initWithNibName:name bundle:bundle];
[self setup];
return self;
}
一般情况下,我们用不到awakeFromNib这个函数。
10.总结
实例化(从storyboard中).
awakeFromNib
设置outlet
viewDidLoad
(当图形形状已经定下来了)
viewWillLayoutSubviews: and viewDidLayoutSubviews:
(下一组函数将会重复调用,如果你的MVC经常出现和消失在屏幕上)
viewWillAppear and viewDidAppear;
(在任何可视的时候,图形形状发生变化,如device ratation)
viewWillLayoutSubviews: and viewDidLayoutSubviews:
(如果是autorotation,你会收到will/didRatateTo/From message,虽然很少使用).
viewWillDisappear; and viewDidDisappear:
(如果出现低内存情况)
didReceiveMemoryWarning
(已经没有unload方法,以上就是全部的生命周期)