私のアプリでは、UITableView
を使用しています。私の問題は、UITableView
の最後のセルの最後の境界線を削除することです。
次の画像を確認してください。
9/14/15に更新されました。私の最初の答えは時代遅れになりましたが、それはすべてのiOSバージョンのための普遍的なソリューションです。
tableView
の標準の区切り線を非表示にし、各セルの上部にカスタム行を追加できます。カスタムセパレーターを追加する最も簡単な方法は、高さ1pxの単純なUIView
を追加することです。
UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.bounds.size.width, 1)];
separatorLineView.backgroundColor = [UIColor grayColor];
[cell.contentView addSubview:separatorLineView];
これまで、私は 別の方法 をサブスクライブして、セルの下に余分なセパレータを隠しました(iOS 6.1以降で動作します):
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
最適なソリューションは、フッタービューを追加することです。次のコードは、最後のセルの行を完全に非表示にします。
Objective-C
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];
Swift 4.
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1))
IOS 7では、より簡単なソリューションがあります。セルが最後のセルであると仮定します。
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
これは、iOS 7および8で機能します。
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(tableView.bounds));
注:tableView.bounds
の使用には注意してください。呼び出しのタイミングによっては間違った値が報告されることがあります。 ランドスケープモードでの誤った境界のレポート を参照してください
このコード行をviewDidLoad()
に追加します。
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))
これにより、最後のセパレータが置き換えられ、置き換えられた(非表示の)フッタービューが余分な高さを占有しないようにします。フッタービューの幅はUITableView
によって管理されるため、0に設定できます。
私の短いバージョン:
self.tblView.tableFooterView = [UIView new];
ここに私が現在使用している治療法があります。それは最善のアプローチではないかもしれませんが、うまくいきます。
SeparatorColorとsetSeparatorStyleを削除してカスタムセパレーターを作成する
- (void)viewDidLoad
{
[super viewDidLoad];
...
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[self.tableView setSeparatorColor:[UIColor clearColor]];
}
テーブルビューの背景を持つ各セルにカスタムセパレーターを追加します
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
...
UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.frame.size.height-1, 320, 1)];
separatorLineView.backgroundColor = self.tableView.backgroundColor;
[cell.contentView addSubview:separatorLineView];
return cell;
}
いいえ、できません。これらのセパレーターはきれいで乾燥しており、スタイルと色はそれだけです。ただし、別の解決策は、セパレータをすべてオフにし、最後のセルを除くすべてのセルの下部に水平線を付けた背景画像を設定することです。
E.X:
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
if (indexPath.row == [myArray count] - 1) {
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
[cell setBackgroundView:imageView];
}
Swift 4、iOS 12でテスト済み)の拡張ベースのソリューション
height = 1
の空のビューを設定すると、最後に表示されるセルのセパレータも削除されることに気付きましたが、height = 0
を設定すると、空のセルのセパレータが削除されるだけです。
extension UITableView {
func removeSeparatorsOfEmptyCells() {
tableFooterView = UIView(frame: .zero)
}
func removeSeparatorsOfEmptyCellsAndLastCell() {
tableFooterView = UIView(frame: CGRect(Origin: .zero, size: CGSize(width: 0, height: 1)))
}
}
IOS 7以降の場合
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
BOOL bIsLastRow = NO;
//Add logic to check last row for your data source
NSDictionary *dict = [_arrDataSource objectAtIndex:indexPath.section];
if([_arrDataSource lastObject] == dict)
{
bIsLastRow = YES;
}
//Set last row separate inset left value large, so it will go outside of view
if ([cell respondsToSelector:@selector(setSeparatorInset:)])
{
[cell setSeparatorInset:UIEdgeInsetsMake(0, bIsLastRow ? 1000 :0, 0, 0)];
}
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) { cell.separatorInset.right = cell.bounds.size.width } }
In Swift単純に:
tableView.tableFooterView = UIView()
別のオプションは、UITableView
をサブクラス化することです。
@synthesize hideLastSeparator = _hideLastSeparator;
@synthesize hideLastSeparatorView = _hideLastSeparatorView;
-(void)setHideLastSeparator:(BOOL)hideLastSeparator {
if (_hideLastSeparator == hideLastSeparator) {
return;
}
_hideLastSeparator = hideLastSeparator;
if (_hideLastSeparator) {
_hideLastSeparatorView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentSize.height, self.bounds.size.width, 0.5f)];
_hideLastSeparatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
_hideLastSeparatorView.backgroundColor = self.backgroundColor;
[self addSubview:_hideLastSeparatorView];
[self hideSeparator];
}
else {
[_hideLastSeparatorView removeFromSuperview];
_hideLastSeparatorView = nil;
}
}
-(void)setContentSize:(CGSize)contentSize {
[super setContentSize:contentSize];
if (_hideLastSeparator) {
[self hideSeparator];
}
}
-(void)hideSeparator {
CGRect frame = _hideLastSeparatorView.frame;
frame.Origin.y = self.contentSize.height - frame.size.height;
_hideLastSeparatorView.frame = frame;
}
.hには、hideLastSeparator
およびhideLastSeparatorView
のプロパティ宣言のみを含める必要があります。
セパレータを非表示にする場合は、新しいクラスを使用してmyTableView.hideLastSeparator = YES
。
これが機能する方法は、新しいビューを追加することで最後のセパレーターを遮ることです。
私の意見では、これはやや簡単です(カスタムセパレーターを使用するか、最後のセルの最後のseparatorInsetを設定するよりも)tableFooterView
を設定する方法が時々引き起こす(たとえば行中に)奇妙なアニメーション挿入/削除またはその他のテーブルアニメーション)。
cellForRow
デリゲートの最後のセルインデックスを見つけ、以下のコード行を配置します。
cell.separatorInset = UIEdgeInsetsMake(
0.f,
40.0f,
0.f,
self.view.frame.size.width-40.0f
);
_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
Swift 4.2
最後のセルで左から右に向かうセパレーターを取得するには、これを_UITableViewDataSource's
_ tableView(_:cellForRowAt:)
実装に追加します。
_if tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row {
cell.separatorInset = .zero
}
_
特定のセルに区切り文字が必要ない場合は、独自の区切り文字を描画して_tableView.separatorStyle = .none
_を設定することを検討してください。