标签:
1 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 2 // Table View 在每次 reload data 时都会要所有 cell 的高度!这就是说你有一百行 cell,就像代理要100次每个cell 的高度,而不是当前屏幕显示的cell 的数量的高度! 3 // 结论: 4 // 1、对于cell的高度不一定一样的:应该把cell的高度缓存起来。将计算行高的时间提前到,从服务器搂回数据的时候,初始化model的时候就马上计算行高,再缓存起来。例如可以缓存到FrameModel里 5 // 2、对于cell的高度都一样的:不要重载这个代理方法,直接在初始化tableView的地方赋值给rowHeight属性,同理,各分区头或各分区尾高度一样的话,应用sectionFooterHeight和sectionHeaderHeight,而不用代理方法。 6 // 3、如果只是刷新某row就可以解决问题的话,尽量用reloadRowsAtIndexPaths:withRowAnimation\reloadSections:withRowAnimation,而非用reloadData 另外同理,尽量用insertRowsAtIndexPaths:withRowAnimation:deleteRowsAtIndexPaths:withRowAnimation:等,代替reloadData。 7 }
1 view.layer.cornerRadius = 5; 2 view.layer.maskToBounds = YES;
如果你的圆角视图不多,cell 不复杂,的确用上面两句就好。但实际工作中,多数是大量的cell,则性能的损耗是非常大的。
优化建议:
1、如果能够只用 cornerRadius 解决问题,就不用优化。
2、如果必须设置 masksToBounds ,可以参考圆角视图的数量,如果数量较少(一页只有几个)也可以考虑不用优化。
3、UIImageView 的圆角通过直接截取图片实现,其它视图的圆角可以通过 Core Graphics 画出圆角矩形实现。
1 extension UIImage { 2 func kt_drawRectWithRoundedCorner(radius radius: CGFloat, _ sizetoFit: CGSize) -> UIImage { 3 let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: sizetoFit) 4 5 UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.mainScreen().scale) 6 CGContextAddPath(UIGraphicsGetCurrentContext(), 7 UIBezierPath(roundedRect: rect, byRoundingCorners: UIRectCorner.AllCorners, 8 cornerRadii: CGSize(width: radius, height: radius)).CGPath) 9 CGContextClip(UIGraphicsGetCurrentContext()) 10 11 self.drawInRect(rect) 12 CGContextDrawPath(UIGraphicsGetCurrentContext(), .FillStroke) 13 let output = UIGraphicsGetImageFromCurrentImageContext(); 14 UIGraphicsEndImageContext(); 15 16 return output 17 } 18 }
1 extension UIImageView { 2 /** 3 / !!!只有当 imageView 不为nil 时,调用此方法才有效果 4 5 :param: radius 圆角半径 6 */ 7 override func kt_addCorner(radius radius: CGFloat) { 8 self.image = self.image?.kt_drawRectWithRoundedCorner(radius: radius, self.bounds.size) 9 } 10 }
标签:
原文地址:http://www.cnblogs.com/billios/p/5585180.html