問題は、テーブル/セクションの最後のセルにセパレータを表示する最も右の方法は何ですか。
基本的にこれは私が望んでいることです。
これはネイティブの音楽アプリからのもので、UITableView
だけで達成できるはずだと思うようになりますが、セルセパレータにプライベートAPIを使用することはないでしょうか?
実際のセパレータを使用しなくても、セルの下部に1ピクセルの行を追加することで逃げることができます。しかし、私はこのアプローチのファンではありません
また、UITableViewリファレンスには、私が欲しいものを簡単に取得する方法があると思うようにするものがあります:
IOS 7以降では、セルセパレーターはテーブルビューの端まで拡張されません。このプロパティは、rowHeightがセルのデフォルトの高さを設定するのと同様に、テーブル内のすべてのセルのデフォルトのインセットを設定します。 プレーンスタイルテーブルの下部に描画される「余分な」セパレータの管理にも使用されます。
プレーンスタイルのテーブルの下部に描かれたこれらの「余分な」セパレータを正確に使用する方法を誰かが知っていますか?これはまさに私が必要なものだからです。 separatorInset
ではなくUITableView
にUITableViewCell
を割り当てるとうまくいくと思いましたが、最後のセルにはまだセパレータがありません。
今のところ、最後のセルのセパレーターを模倣するカスタムセクションフッターを使用するという1つのオプションしかありません。また、これは、tableView:titleForFooterInSection:
メソッドを使用して実際のセクションフッターを作成する場合は特に良くありません。
これは、最後のセルにセパレータを追加するために完璧に機能しました。楽しんで!
self.tableView.tableFooterView = [[UIView alloc] init];
HeaderViewまたはfooterViewをTableViewに追加すると、最後の区切り線が消えます。
次の例では、最後のセルにセパレータを表示するための回避策を作成できます。さらに実装する必要があるのは、セルを選択した後にこのセパレータを非表示にすることだけです。したがって、動作は他のセルと同じです。
Swift 4.
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let result = UIView()
// recreate insets from existing ones in the table view
let insets = tableView.separatorInset
let width = tableView.bounds.width - insets.left - insets.right
let sepFrame = CGRect(x: insets.left, y: -0.5, width: width, height: 0.5)
// create layer with separator, setting color
let sep = CALayer()
sep.frame = sepFrame
sep.backgroundColor = tableView.separatorColor?.cgColor
result.layer.addSublayer(sep)
return result
}
自分に合ったものを見つけました。いくつかの言葉で:ITableViewにtableFooterViewを与え、フレームの高さを0に設定します。これにより、実際のセパレーターが正しいインセットで表示されます。
詳細:ストーリーボードを使用している場合、UIViewをテーブルビューの下部(左側のツリービュー)にドラッグして、同じ階層レベルでテーブルビューセルのすぐ下に表示されるようにします。これにより、tableFooterViewが作成されます。もちろん、これはプログラムで行うこともできます。
次に、UITableViewControllerの実装で:
UIView *footerView = self.tableView.tableFooterView;
CGRect footerFrame = footerView.frame;
footerFrame.size.height = 0;
[footerView setFrame:footerFrame];
それがあなたのために働くかどうか私に知らせてください!代わりにtableHeaderViewを使用する場合、最初のセパレーターでも機能する可能性がありますが、試していません。
セクションを使用していない場合は、次のようなことができます。
- (void)viewDidLoad
{
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(insetLeftSide, 0, width - insetRightSide, 1)];
}
セクションを使用している場合は、各セクションのフッターをメソッドの1ポイントビューとして実装します
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
}
これにより、実際にはセパレータではない最後のセルにセパレータを設定できるようになります
これは、行がセルの幅全体を占める場合でも、必要なことを正確に行います。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
で
self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
self.tableView.separatorColor = [UIColor redColor];
self.tableView.separatorInset = UIEdgeInsetsZero;
Swift 4の非常にシンプルなソリューションがあります:
override func viewDidLoad(){}
内で、次のコード行を実装しました。
self.tableView.tableFooterView = UIView(frame: .zero)
したがって、最後のセルのみがセパレーターインセットを取得するようにします。
これは私にとって完璧に機能しました。あなたにも役立つことを願っています!
同様の問題があり、回避策が見つかりました。 Appleは、最後のuitableviewcellセパレーターを非表示にし、セルを選択した場合、またはそのセルでselectおよびdeselectを呼び出した場合に表示します。
だから私は最高が- (void)layoutSubviews
にあると教えました。区切りビューは_separatorView
そしてそれは私有財産です。セルの選択/強調表示された状態を使用すると、次のようなものを思いつくことができます。
- (void)layoutSubviews
{
// Call super so the OS can do it's layout first
[super layoutSubviews];
// Get the separator view
UIView *separatorView = [self valueForKey:@"_separatorView"];
// Make the custom inset
CGRect newFrame = CGRectMake(0.0, 0.0, self.bounds.size.width, separatorView.frame.size.height);
newFrame = CGRectInset(newFrame, 15.0, 0.0);
[separatorView setFrame:newFrame];
// Show or hide the bar based on cell state
if (!self.selected) {
separatorView.hidden = NO;
}
if (self.isHighlighted) {
separatorView.hidden = YES;
}
}
このようなもの。
IOS 8では、プレーンスタイルのUITableViewがあり、フッターを追加すると、最後の区切り記号がなくなります。ただし、フッターにカスタムセパレータービューを追加することで、簡単に再作成できます。
この例は、Today Widget separatorスタイルを正確に模倣しています。
override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
//create footer view
let result = UIView()
result.frame.size.height = tableView.rowHeight
//recreate last cell separator, which gets hidden by footer
let sepFrame = CGRectMake(15, -0.5, tableView.frame.width, 0.5);
let vibrancyEffectView = UIVisualEffectView.init(effect: UIVibrancyEffect.notificationCenterVibrancyEffect())
vibrancyEffectView.frame = sepFrame
vibrancyEffectView.contentView.backgroundColor = tableView.separatorColor
result.addSubview(vibrancyEffectView)
return result
}
空のフッターを追加すると、tableviewは残りのすべての行セパレーター(存在しないセルの場合)を削除しますが、最後のセルのセパレーターは引き続き含まれます。
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [UIView new];
}
IOS 7.xおよび8.xで動作します(cellForRowAtIndexPathに入れてください):
(PSは「データソースの最大要素」を配列データソースの数に置き換えます)
if (row == <max elements of your datasource>-1) {
UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height-1, self.view.frame.size.width, 1)];/// change size as you need.
separatorLineView.tag = 666;
separatorLineView.backgroundColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];
UIView *separator = [cell.contentView viewWithTag:666];
// case of orientation changed..
if (separator.frame.size.width != cell.contentView.frame.size.width) {
[[cell.contentView viewWithTag:666] removeFromSuperview];
separator = nil;
}
if (separator==nil) [cell.contentView addSubview:separatorLineView];
}
これは間違いなく助けです。ワーキング。ただし、属性インスペクタからセパレータ「なし」を設定します。 cellForRowAtIndexPathメソッドで次のコードを記述します
if(indexPath.row==arrData.count-1){
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,
cell.contentView.frame.size.height - 1.0,
cell.contentView.frame.size.width, 1)];
lineView.backgroundColor = [UIColor blackColor];
[cell.contentView addSubview:lineView];
}
以下のコードは私のために働いた:
UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 0.35)];
footerView.backgroundColor = [UIColor whiteColor];
CGRect frame = footerView.frame;
frame.Origin.x = 15;
frame.size.width = frame.size.width - 15;
UIView *blackView = [[UIView alloc] initWithFrame:frame];
[blackView setBackgroundColor:[UIColor blackColor]];
blackView.alpha = 0.25;
[footerView addSubview:blackView];
tableView.tableFooterView = footerView;
それがあなたにも役立つことを願っています。