По моему мнению, я придумал довольно "хакерское" решение, так что я не совсем доволен им, но в любом случае!тем самым достигается базовая функциональность рисования тени вокруг группы ячеек в разделе.поэтому я создал подкласс 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);
}
код не требует пояснений, я думаю!в основном он вращается вокруг добавления UIViews к UITableView в качестве подпредставлений для вычисляемого кадра сечения, а затем отрисовки тени на слой добавленного UIView.UITableView предоставляет несколько методов для вычисления фрейма: "rectForSection" и т. Д.
Я не доволен этим, потому что он чувствует себя неправильно, добавляя представления в метод layoutSubviews!(это может быть сделано где-то еще => делегат табличного представления?) Мне также хотелось бы больше работать с CALayers, но вы не можете пометить их!потому что мой код работает за счет сокращения / расширения уже добавленных uiviews по соображениям производительности.
в этой форме решение не будет работать, если разделы исчезнут, или разделы переупорядочены и т. д., он также ведет себя не очень хорошо, если выдобавление строк в анимированном виде в табличное представление и т. д., но я думаю, что это очень полезно для «статических» сгруппированных табличных представлений!
я также не проверял на производительность, поэтому используйте на свой страх и риск!
так что, возможно, это хорошая отправная точка для, возможно, лучшего решения этой проблемы!: -)