前言
在日常工作中,我常常遇到一些小坑和容易忘记的知识点,在此做一系列的记录,希望也能帮到你,不定期更新!
1. 多使用 CGRectGet 系列的函数
在使用 frame 对 UI 元素进行布局时,使用 CGRectGet 系列方法会使布局变得更加简单易懂,例如获取一个视图水平方向的中点:
CGFloat midX = CGRectGetMidX(testView.frame);
如果直接利用视图的几何属性计算的话,你得这样写:
CGFloat midX = testView.frame.origin.x + testView.frame.size.width / 2;
虽然底层实现上并没有太大区别,但是使用 CGRectGet 系列函数会使代码更加简洁,而且在代码维护或审查时,开发人员看函数名就知道这个表达式的含义。
下面用一张图描述 CGRectGet 系列函数的意义:
CGRectGet释义图.jpeg
2. 考虑好在何处添加观察者
当你需要监听某条通知 (NSNotification) ,或者观察对象的某个属性 (KVO) 变化时,就需要考虑好是在 UIViewController 的 -viewDidLoad 方法还是在 -viewWillAppear 里面进行。
假设一个场景,某个页面底部有一个输入框,你需要根据键盘的出现和消失调整输入框的位置。
那么,当页面不在屏幕上时,输入框的位置已经无关紧要。也就是说,当页面出现时,添加对键盘出现通知的监听;页面消失时,移除监听。代码如下:
// 添加
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleKeyboardWillShow)
name:UIKeyboardWillHideNotification
object:nil];
}
// 移除
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
然而,在有些情况下,即使页面不在屏幕上显示,也仍需要处理某一些通知。例如,我需要在APP进入非活跃状态时,执行一些特定的操作,监听代码如下:
// 添加
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleAppWillResignActive)
name:UIApplicationWillResignActiveNotification
object:nil];
}
// 移除
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
因此,在使用 NSNotificationCenter 或 KVO 时,建议:
当页面不在屏幕上时
- 仍需响应通知,那么就在 -viewDidLoad 中监听,在 -dealloc 中移除;
- 不需要响应通知,那么就在 -viewWillAppear 中监听,在 -viewDidDisappear 中移除;