如何在分组的uitableview的边框周围显示阴影?(在顶部,底部,边的所有边界以及部分的圆角周围)。
我需要与图片完全相同的效果:
alt http://img824.imageshack.us/img824/2826/tableviewwithshadow.png
注意边框附近的小阴影(灰色,蓝色是背景)
答案 0 :(得分:12)
- (void) layoutSubviews {
[super layoutSubviews];
const CGFloat PageCellBackgroundRadius = 6.0;
for(int i = 0; i < [self numberOfSections]; i++) {
NSInteger viewTag = i + 123456;
CGRect frameRect = [self shadowFrameForSection: i];
UIView* shadowBackgroundView = [self viewWithTag: viewTag];
if (shadowBackgroundView) {
if (!CGRectEqualToRect(frameRect, shadowBackgroundView.frame)) {
shadowBackgroundView.frame = frameRect;
CGPathRef shadowPath = [UIBezierPath bezierPathWithRoundedRect: shadowBackgroundView.bounds
byRoundingCorners: UIRectCornerAllCorners
cornerRadii: CGSizeMake(PageCellBackgroundRadius, PageCellBackgroundRadius)].CGPath;
shadowBackgroundView.layer.shadowPath = shadowPath;
}
[self sendSubviewToBack: shadowBackgroundView];
} else {
shadowBackgroundView = [[[UIView alloc] initWithFrame: frameRect] autorelease];
shadowBackgroundView.tag = viewTag;
shadowBackgroundView.opaque = YES;
shadowBackgroundView.backgroundColor = [UIColor clearColor];
shadowBackgroundView.layer.shadowOpacity = 0.3;
shadowBackgroundView.layer.shadowRadius = 2;
shadowBackgroundView.layer.shadowColor = [[UIColor blackColor] CGColor];
shadowBackgroundView.layer.shadowOffset = CGSizeMake(0.0, 1.0);
CGPathRef shadowPath = [UIBezierPath bezierPathWithRoundedRect: shadowBackgroundView.bounds
byRoundingCorners: UIRectCornerAllCorners
cornerRadii: CGSizeMake(PageCellBackgroundRadius, PageCellBackgroundRadius)].CGPath;
shadowBackgroundView.layer.shadowPath = shadowPath;
shadowBackgroundView.layer.shouldRasterize = YES;
[self addSubview: shadowBackgroundView];
}
}
}
和一个小帮手方法:
- (CGRect) shadowFrameForSection: (NSInteger) section {
CGRect sectionFrame = [self rectForSection: section];
CGFloat sectionHeaderHeight = CGRectGetHeight([self rectForHeaderInSection: section]);
CGFloat sectionFooterHeight = CGRectGetHeight([self rectForFooterInSection: section]);
UIEdgeInsets contentInsets = UIEdgeInsetsMake(sectionHeaderHeight + 1, 10, sectionFooterHeight + 1, 10);
return UIEdgeInsetsInsetRect(sectionFrame, contentInsets);
}
我认为代码不言自明! 基本上它围绕将UIViews添加到UITableView作为子视图,为一个部分的计算框架,然后将投影阴影绘制到添加的UIView的图层。 UITableView提供 帧计算的一些方法:“rectForSection”等。
我对它不满意,因为在layoutSubviews方法中添加视图感觉不对! (这可以在其他地方完成=&gt;表视图委托?) 我也希望更多地与CALayers合作,但你无法标记它们!因为我的代码是通过 由于性能原因,缩小/扩展已经添加了uiviews。
在这种形式下,如果部分消失或部分被重新排序等,解决方案将不起作用。 如果您以动画方式向表视图等添加行,它也表现不佳。 但它对我认为的“静态”分组表视图非常有用!
我还没有测试性能影响,因此请自担风险使用!
所以也许这是一个很好的起点,可以更好地解决这个问题! : - )
答案 1 :(得分:2)
最简单的方法是在表格中为您的单元格添加阴影样式。请记住,您将有3种类型的样式 - 一种用于单元格的顶部,一种用于底部单元格,一种用于其他单元格。如果你开始编写代码,应该不会很困难。
答案 2 :(得分:0)
在cellForRowAtIndexPath:
函数中:
// drop shadow
cell.layer.shadowOpacity = 1.0;
cell.layer.shadowRadius = 1.7;
cell.layer.shadowColor = [UIColor blackColor].CGColor;
cell.layer.shadowOffset = CGSizeMake(0.0, 0.0);