gpt4 book ai didi

iphone - 带阴影的分组 uitableview

转载 作者:太空狗 更新时间:2023-10-30 03:57:16 25 4
gpt4 key购买 nike

关于如何在分组的 uitableview 的边框周围显示阴影的任何想法?(围绕顶部、底部、侧面的所有边框以及部分的圆角周围)。

我需要与图片上完全相同的效果:

alt

注意边框附近的小阴影(灰色的,蓝色的是背景)

最佳答案

在我看来,我想出了一个相当“hackish”的解决方案,所以我对此并不完全满意,但无论如何!围绕一个部分中的一组单元格绘制投影的基本功能由此完成。因此我将 UITableView 子类化并实现了 layoutSubviews 方法,如下所示:

- (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);
}

我认为代码是不言自明的!基本上它围绕着将 UIView 作为 subview 添加到 UITableView,计算一个部分的框架,然后将投影绘制到添加的 UIView 的层。 UITableView 提供框架计算的一些方法:“rectForSection”等。

我对此并不满意,因为在 layoutSubviews 方法中添加 View 感觉不对! (这可以在其他地方完成 => TableView 委托(delegate)?)我也希望更多地使用 CALayers,但你不能标记它们!因为我的代码通过出于性能原因收缩/扩展已添加的 uiview。

在这种形式下,如果部分消失或部分被重新排序等,解决方案将不起作用。如果您以动画方式向表格 View 等添加行,它也表现不佳。但我认为它对于“静态”分组 TableView 非常有用!

我也没有测试性能影响,所以使用风险自负!

所以也许这是一个可能更好的解决方案的良好起点! :-)

关于iphone - 带阴影的分组 uitableview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6912904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com