iOS开发笔记(2)

477 阅读3分钟

去除字符串中的空格

去除首尾空格

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),目前具体原因不详,知道原因的人可以告诉我。

解决方法

  1. 在内容下降的页面设置[self.navigationController.navigationBar setTranslucent:YES],最好是在viewWillAppear里。
  2. 将内容下降的页面的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;
   }
}