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不对。
补充中...