iOS开发的奇技淫巧

1.当你的UITableView为UITableViewStyleGrouped时,而此时设计需要header下拉是背景和header一样的颜色,这个时候不能轻易的改变tableView的backgroundColor属性,这回影响到分区的间隔颜色,如果直接添加分区的headerView或footerView也是可以的,但是改动会比较大,我的做法是在headerCell上添加一个超出屏幕1000的view,背景色设的和headerCell一样,这样下拉就背景色就会保持一致了。但是会出现另一个问题,就是tableView的分割线会在,所以就去思考怎么移除header上的分割线,我的做法也是通过重载来解决。

//复写cell里面的addSubview方法
-(void)addSubview:(UIView *)view{
    if (![view isKindOfClass:[NSClassFromString(@"_UITableViewCellSeparatorView") class]] && view)
    [super addSubview:view];
}

在这里说一下自己的看法,在使用tableview的时候,尽量不去使用UITableViewStyleGrouped类型,尽量不去操作调用headerView,当tableView为UITableViewStylePlain是headerView会有悬浮,这个时候尽量使用cell来替代headerView。在tableView添加headerView的时候,不能直接使用约束,可以先给headerView一个frame,然后里面的子视图再使用约束。

2.RACObserve键值观察的时候,只要以观察就会调用的问题,是因为RAC在添加观察者的时候将options属性设为了NSKeyValueObservingOptionInitial,所以为在键值初始化的时候就调用一次kvo的协议,一般我们自己使用kvo的时候将options属性设为NSKeyValueObservingOptionNew即可。

- (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath observer:(__weak NSObject *)observer {
 return [[[self
  rac_valuesAndChangesForKeyPath:keyPath options:NSKeyValueObservingOptionInitial observer:observer]
  map:^(RACTuple *value) {
   // -map: because it doesn't require the block trampoline that -reduceEach: uses
   return value[0];
  }]
  setNameWithFormat:@"RACObserve(%@, %@)", self.rac_description, keyPath];
}

3.当界面显示不下文字内容的时候,我们可以使用UITextView来解决,这样免去了计算label高度的麻烦,如果设计有特殊的需求,可以使用NSMutableAttributedString这个类来解决,记得在如果有特殊字体的话要注意系统适配,不然系统会在找不到字体的时候Crash.。

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self.textView.text];
    NSRange rangeOne;
    NSRange rangeTwo;
    NSDictionary  *attrDict = @{
                                NSForegroundColorAttributeName:[UIColor colorWithHexString:@"3c3c3c"],
                                NSFontAttributeName:[UIFont systemFontOfSize:18]
                                };
    rangeOne = [self.textView.text rangeOfString:@"TPO简介:"];
    rangeTwo = [self.textView.text rangeOfString:@"TPO 使用方法:"];
    NSMutableParagraphStyle *trastyle = [[NSMutableParagraphStyle alloc] init];
    [trastyle setLineSpacing:5];
    [attributedString addAttribute:NSParagraphStyleAttributeName
                             value:trastyle
                             range:NSMakeRange(0,self.textView.text.length)];
    [attributedString addAttribute:NSFontAttributeName
                             value:[UIFont systemFontOfSize:15]
                             range:NSMakeRange(0,self.textView.text.length)];
    [attributedString addAttributes:attrDict range:rangeOne];
    [attributedString addAttributes:attrDict range:rangeTwo];
    self.textView.attributedText = attributedString;

4.在遍历数组删除元素的时候,不能使用for-in或者正序遍历(正序的时候,删除完,i++也可以),这样会改变数组的结构,造成crash,删除的时候要倒序遍历。

  for(i=count-1; i>=0; i--){
}

5.在使用字典的时候,注意字典的allKeys和allValues得到的数组是无序的,这是因为为了使字典能够通过key-value快速的访问,使用散列排序的缘故。

6.圆角卡顿的问题,离屏渲染是因为GPU在当前屏幕缓冲区以外开辟一个缓冲区进行渲染操作.最为常见的解决方案如下:

        button.layer.shouldRasterize = YES;
        button.layer.rasterizationScale = [UIScreen mainScreen].scale;

7.不要频繁的调用view的drawRect:方法,会造成内存吃紧,引发闪退。

8.当数据需要跨层双向传输时,单凭delegate和block的话要写几层,在执行完delegate和block时候还需要操作delegate和blcok的制定者的时候,就比较麻烦,我们用了一个办法是抽出来一个header,声明一个blcok,然后通过通知将block传值,执行完操作时候回调blcok.

A:
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadAudio:) name:PlayUnExistAudioNotification object:nil];

- (void)downloadAudio:(NSNotification *)notify
{
    downAudioBlock = notify.object;
    }

B:
   [[NSNotificationCenter defaultCenter] postNotificationName:PlayUnExistAudioNotification object:self.downBlcok];

9.当我们给view打过tag值的话,调用superview或superview的superview时viewWithTag:方法时,都可以取到该view,因为view的遍历是深度遍历,所以view的tag要尽量不要一样,因为如果他们都在一个父view树形结构上,有可能会造成访问view不对。

补充中...

你可能感兴趣的:(iOS开发的奇技淫巧)