標準のグループ化されたUITableView
スタイルでは、各セクションの上部と下部に丸い角を付けてUITableViewCell
sを描画できます。これはどのように達成されますか?セルは、セクション内の自身の位置をどのように認識し、丸みを帯びたエッジをいつ変更するかをどのように認識しますか?
自分で丸みを帯びたセルを作りたいのですが、使用する画像がありますが、どの画像をいつ表示するかわかりません
注: UITableViewがどのように機能するかはすでに知っており、その使用方法も知っています。 UITableViewは正しい場所に丸みを帯びた角を自動的に描画できるので、データソースやデリゲートに何も追加しなくてもできるはずだと思っただけです。
必要なものを示す整数を返すsectionLocation
のUITableViewCell
メソッドがあります。
2010年以降、いくつかの本番アプリでこれを使用しても問題はありませんでした。
PDATE: 'sectionLocation'プロパティを使用していたため、最近(2018年末)にバイナリの1つが自動的に拒否されたため、これは適切なオプションではなくなりました。
このようなものをヘッダーファイルに追加すると、次のように使用できます。
typedef NS_ENUM(NSInteger, MMMTableViewCellLocation) {
MMMTableViewCellLocationUndefined = 0,
MMMTableViewCellLocationMiddle = 1,
MMMTableViewCellLocationTop = 2,
MMMTableViewCellLocationBottom = 3,
MMMTableViewCellLocationSingle = 4
};
@interface UITableViewCell ()
/** Undocumented method of UITableViewCell which allows to know where within section the cell is located,
* so the cell can draw its borders properly. */
- (MMMTableViewCellLocation)sectionLocation;
/** Override this one to know when the value of sectionLocation changes. */
- (void)setSectionLocation:(MMMTableViewCellLocation)sectionLocation animated:(BOOL)animated;
@end
NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];
int rows = [(UITableView *)self.superview numberOfRowsInSection:indexPath.section];
if (indexPath.row == 0 && rows == 1) {
// the one and only cell in the section
}
else if (indexPath.row == 0) {
//top
}
else if (indexPath.row != rows - 1) {
//middle
}
else {
//bottom
}
とても簡単です。セルがオブジェクトであり、その位置が検出されるとします。
UITableView* table = (UITableView *)[cell superview];
NSIndexPath* pathOfTheCell = [table indexPathForCell:cell];
NSInteger sectionOfTheCell = [pathOfTheCell section];
NSInteger rowOfTheCell = [pathOfTheCell row];
使用できます
- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell
この問題のために。私の例では、これを使用してセル(カスタムコンテンツを含む)をビューの上部にスクロールしています。
より堅牢で一般的なものが必要な場合は、 http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html をご覧ください-Matt Gallagherが、必要なものを示しています。効果的に。彼は基本的にUIViewControllerからUITableViewControllerを再作成し、独自のカスタムグラフィックを使用する機能を追加します。私はこれを私のプロジェクトの1つに適用することに取り組んでいますが、これまでのところ、それでうまくいくようです。
残念ながら、この問題の解決策は見つかりませんでした。UITableViewControllerとUITableViewCellを、必要に応じて拡張できる汎用ソリューションにサブクラス化することにしました。
誰が何を描画するかを知ることなく、cellForRowAtIndexPath内のセクションの最後のセルがどのセルであるかを簡単に知ることができます。
提供する必要のあるセルのindexPathが渡されますよね? tableViewも渡されます。
[tableView numberofRowsInSection:indexPath.section]を呼び出し、それが==([indexPath.row] -1)の場合、そのセクションの最後のセルを指定するように求められていることがわかります。
CellForRowAtIndexPathが呼び出されているとき、セルは渡されたindexPathにあることが保証されます。
ダレンの答え(私が最も有用だと思った、ダレンに感謝します!)を拡張するために、親UITableViewが見つかるまで、すべてのスーパービューを反復処理することができます。ビューの固定階層に依存しないため、これは将来の証拠となるはずです。
UITableViewが見つかった場合はUITableViewを返し、見つからなかった場合はnilを返す再帰メソッドを使用します。
- (UITableView *)parentTableViewOf:(UIView *)view {
Class class = [view.superview class];
NSLog(@"Class : %@", NSStringFromClass(class));
if([view.superview isKindOfClass:[UITableView class]]) {
return (UITableView *)view.superview;
} else {
return [self parentTableViewOf:view.superview];
}
return nil;
}
これまで私はこれを使用しましたが、問題なく動作しているようです。それが役に立てば幸い! :)
あなたはセルでこれをしません。丸みを帯びた角は、[tableViewviewForHeaderInSection]とviewForFooterInSectionに描画されます。
私のやり方は、プレーンテーブルビュースタイルを使用してから、これら2つのビューを丸みに使用することです。セルは通常であり、丸みはありません。