实现iOS7以前的TableViewGroupStyle的方法。

原创 2015年11月18日 14:52:03

iOS7以前的TableViewGroupStyle 是每个section 都是圆角的形式展现的。以后的版本实现这个样式。代码来源:stackoverflow
OC代码:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(tintColor)]) {
        if (tableView == self.tableView) {
            CGFloat cornerRadius = 5.f;
            cell.backgroundColor = UIColor.clearColor;
            CAShapeLayer *layer = [[CAShapeLayer alloc] init];
            CGMutablePathRef pathRef = CGPathCreateMutable();
            CGRect bounds = CGRectInset(cell.bounds, 10, 0);
            BOOL addLine = NO;
            if (indexPath.row == 0 && indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
                CGPathAddRoundedRect(pathRef, nil, bounds, cornerRadius, cornerRadius);
            } else if (indexPath.row == 0) {
                CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds), CGRectGetMidX(bounds), CGRectGetMinY(bounds), cornerRadius);
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
                CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds));
                addLine = YES;
            } else if (indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
                CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds), CGRectGetMidX(bounds), CGRectGetMaxY(bounds), cornerRadius);
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
                CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds));
            } else {
                CGPathAddRect(pathRef, nil, bounds);
                addLine = YES;
            }
            layer.path = pathRef;
            CFRelease(pathRef);
            layer.fillColor = [UIColor colorWithWhite:1.f alpha:0.8f].CGColor;

            if (addLine == YES) {
                CALayer *lineLayer = [[CALayer alloc] init];
                CGFloat lineHeight = (1.f / [UIScreen mainScreen].scale);
                lineLayer.frame = CGRectMake(CGRectGetMinX(bounds)+10, bounds.size.height-lineHeight, bounds.size.width-10, lineHeight);
                lineLayer.backgroundColor = tableView.separatorColor.CGColor;
                [layer addSublayer:lineLayer];
            }
            UIView *testView = [[UIView alloc] initWithFrame:bounds];
            [testView.layer insertSublayer:layer atIndex:0];
            testView.backgroundColor = UIColor.clearColor;
            cell.backgroundView = testView;
        }
    }
}

swift 代码:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if (cell.respondsToSelector(Selector("tintColor"))){
        if (tableView == self.tableView) {
            let cornerRadius : CGFloat = 12.0
            cell.backgroundColor = UIColor.clearColor()
            var layer: CAShapeLayer = CAShapeLayer()
            var pathRef:CGMutablePathRef = CGPathCreateMutable()
            var bounds: CGRect = CGRectInset(cell.bounds, 25, 0)
            var addLine: Bool = false

            if (indexPath.row == 0 && indexPath.row == tableView.numberOfRowsInSection(indexPath.section)-1) {
                CGPathAddRoundedRect(pathRef, nil, bounds, cornerRadius, cornerRadius)
            } else if (indexPath.row == 0) {
                CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds))
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds), CGRectGetMidX(bounds), CGRectGetMinY(bounds), cornerRadius)
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius)
                CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds))
                addLine = true
            } else if (indexPath.row == tableView.numberOfRowsInSection(indexPath.section)-1) {
                CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds))
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds), CGRectGetMidX(bounds), CGRectGetMaxY(bounds), cornerRadius)
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius)
                CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds))
            } else {
                CGPathAddRect(pathRef, nil, bounds)
                addLine = true
            }

            layer.path = pathRef
            layer.fillColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 0.8).CGColor

            if (addLine == true) {
                var lineLayer: CALayer = CALayer()
                var lineHeight: CGFloat = (1.0 / UIScreen.mainScreen().scale)
                lineLayer.frame = CGRectMake(CGRectGetMinX(bounds)+10, bounds.size.height-lineHeight, bounds.size.width-10, lineHeight)
                lineLayer.backgroundColor = tableView.separatorColor.CGColor
                layer.addSublayer(lineLayer)
            }
            var testView: UIView = UIView(frame: bounds)
            testView.layer.insertSublayer(layer, atIndex: 0)
            testView.backgroundColor = UIColor.clearColor()
            cell.backgroundView = testView
        }
    }
}

这样无论是系统的表格还是自定义的表格,每个section的样式都是圆角的。但是有一个问题是:千万不要在定义cell 的时候设置cell.backgroundColor 和cell.contentView.backgroundColor 。以上代码没有任何效果~。~!

(七十五)CoreLocation(一)在iOS7和iOS8设备上获取授权

苹果在iOS8上更新了CoreLocation的授权获取方式,在原来的基础上,不仅需要调用授权函数,还需要对info.plist进行相应的配置。 在iOS上获取经纬度使用的是CoreLocationM...
  • xyt8023y
  • xyt8023y
  • 2015年07月19日 15:42
  • 736

Xcode8 支持 iOS7及以下版本

Xcode8 支持 iOS7及以下版本
  • skylin19840101
  • skylin19840101
  • 2016年10月17日 18:22
  • 3107

iOS7适配问题总结

一、状态栏(statusBar) 在iOS7中view默认是全屏模式,状态栏的高度也加在了view的高度上,例如iOS7之前iphone5中self.view.frame.siz...
  • lianbaixue
  • lianbaixue
  • 2014年02月12日 15:51
  • 10533

很好用的ios7开源项目

http://www.cocoachina.com/industry/20130701/6515.html zhe'g
  • shijikl
  • shijikl
  • 2014年09月30日 09:15
  • 1032

iOS7适配——导航栏问题

这几天在适配iOS7时,导航栏出现了问题。问题是iOS7后状态栏透明了,导航栏的高度变成了64,而本来的图片只有47,在ios6上没问题在ios7上出现了平铺效果,中间多了一条显眼的黑线,如 后来查...
  • lcg0412
  • lcg0412
  • 2013年11月20日 14:50
  • 3531

IOS7设计师笔记(原创)【ios7设计的尺寸】

图标尺寸 IOS7推出后,图标尺寸规范略有调整,为了得到更加精准的显示效果,大家可以参考参考下。 下表列出了图标的标准尺寸,按照此规范zuo作图,可以使图标能在搭载IOS7的多种设备中正确显示显示...
  • wangxiaohui6687
  • wangxiaohui6687
  • 2013年10月14日 10:04
  • 12472

iOS7 新后台及下载SDK介绍

在iOS7以前的系统中,App默认是不能后台运行的,如果要后台运行,可以采用以下两类方法:   (1)使用beginBackgroundTaskWithExpirationHandler函数,向...
  • chun799
  • chun799
  • 2014年06月08日 17:04
  • 7224

xcode6 如何下载ios7模拟器

1. 如何下载ios7模拟器
  • lengxue789
  • lengxue789
  • 2014年11月16日 20:02
  • 28954

《iOS开发指南》第二版 iOS7版-源码-样章-目录,感谢大家一直以来的支持

《iOS开发指南-从0基础到AppStore上线》第二版 iOS7版正式出版了 感谢大家一直以来的支持! 改版后采用全新的ios 7 api,详细介绍了最新的ios 7 开发相关的知识点,全部案例...
  • tonny_guan
  • tonny_guan
  • 2014年03月20日 17:01
  • 5764

IOS7 及以后的后台运行机制

iOS7前所支持的后台机制: (1)使用beginBackgroundTaskWithExpirationHandler函数,向系统申请一段时间来执行需要后台运行的操作,这种方法的缺点是,后台操...
  • q281494714
  • q281494714
  • 2015年03月31日 09:25
  • 514
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现iOS7以前的TableViewGroupStyle的方法。
举报原因:
原因补充:

(最多只允许输入30个字)