去除字符串中的空格
去除首尾空格
OC:
NSString *str = [NSString stringWithFormat:@" sda sda "];
str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSLog(@"%@", str);
Swift:
var str = " sda sad "
str = str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
print(str)
去除所有空格(包括首尾)
OC:
NSString *str = [NSString stringWithFormat:@" 你 好 嘛 , 跟谁 俩 呢 ! "];
str = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"%@", str);
Swift:
var str = " 你 好 嘛 , 跟谁 俩 呢 ! "
str = str.stringByReplacingOccurrencesOfString(" ", withString: "")
print(str)
--------------------------------------------
UINavigationBar设置透明和不透明
UINavigationBar有一个translucent(半透明)属性,在iOS6以前是默认为NO,在iOS7以后也就是现在默认为YES,但是在有些场景需要导航栏完全透明或者完全不透明。
完全透明
// 第一行代码能使导航栏完全透明
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
// 导航栏完全透明后还会留有一条分割线,第二行代码是为了隐藏分割线
[self.navigationController.navigationBar setShadowImage:[UIImage new]];
完全不透明
// 最简单的设置不透明的方法,但是这个方法可能会伴随一些副作用,后面单独讲
[self.navigationController.navigationBar setTranslucent:NO];
个人建议:所有控制器对导航栏的改变都放在viewWillAppear中,并且在viewWillDisappear中还原对导航栏的改变,这样能形成统一的标准,不容易产生各种奇怪的导航栏问题
UINavigationBar setTranslucent:NO的副作用
当你为了将导航栏设置为完全不透明而使用[self.navigationController.navigationBar setTranslucent:NO]这个方法时,你可能会发现当你切换到别的页面时,别的页面的内容会整体下降一个navigationBar的高度(即64),目前具体原因不详,知道原因的人可以告诉我。
解决方法
- 在内容下降的页面设置[self.navigationController.navigationBar setTranslucent:YES],最好是在viewWillAppear里。
- 将内容下降的页面的view的Y值-64,比如原来的Y值为0,则改为-64。
建议使用insertSublayer代替addSublayer
我看到有一篇博客还建议用insertSubview完全代替addSubview,我倒觉得大不可必完全代替,虽然这样确实是会让视图之间的层级关系变得清晰,但是更多时候我们添加subview都是添加在顶层,而如果使用insertSubview意味着我每次都要思考index是多少,甚至需要特地去计算,这是十分低效的。
那为什么建议使用insertSublayer代替addSublayer呢,因为对于添加sublayer,通常情况下我们并不是直接添加到顶层,比如添加渐变的layer,如果直接添加到顶层将会遮挡住其它想要显示的内容,所以需要添加到最底层,因此便需要用到insertSublayer。
--------------------------------------------
禁用右滑返回
我从一个界面跳转到另一个界面,由于某种原因我不希望用户再回到上个界面,因此我隐藏了导航栏的返回键,结果忘记了还可以右滑返回,所以特地记录一下。
在你希望禁用的页面的viewDidAppear设置interactivePopGestureRecognizer的代理为self
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
然后接interactivePopGestureRecognizer的代理方法 -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
// 这个代理方法实际是检测当前页面所有的手势操作,当前页面可能还有别的手势操作、点击事件等,所以应该要判断当前手势操作是否为右滑返回
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (self.isBackHidden && [gestureRecognizer isEqual:self.navigationController.interactivePopGestureRecognizer]) {
return NO;
} else {
return YES;
}
}