をカスタマイズしていUITableView
ます。最後のセルで区切られている行を非表示にしたい...これを行うことはできますか?
できることはわかっていますtableView.separatorStyle = UITableViewCellStyle.None
が、それはtableViewのすべてのセルに影響します。最後の細胞にのみ影響を与えたい。
をカスタマイズしていUITableView
ます。最後のセルで区切られている行を非表示にしたい...これを行うことはできますか?
できることはわかっていますtableView.separatorStyle = UITableViewCellStyle.None
が、それはtableViewのすべてのセルに影響します。最後の細胞にのみ影響を与えたい。
回答:
でviewDidLoad
、次の行を追加します。
self.tableView.separatorColor = [UIColor clearColor];
そしてでcellForRowAtIndexPath
:
iOSの下位バージョン
if(indexPath.row != self.newCarArray.count-1){
UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
line.backgroundColor = [UIColor redColor];
[cell addSubview:line];
}
iOS 7の上位バージョン(iOS 8を含む)
if (indexPath.row == self.newCarArray.count-1) {
cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
[cell.contentView addSubview:line]
代わりに使用してください[cell addSubview:line]
cellForRowAtIndexPath
。セルは再利用されることに注意してください。このセルを再利用するたびに、別の区切り線ビューを追加します。大きなリストでは、これはスクロールのパフォーマンスに影響する場合があります。そしてそれはそれを行う正しい方法ではありません。
次のコードを使用できます。
スウィフト:
if indexPath.row == {your row number} {
cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}
または:
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)
デフォルトのマージン:
cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)
セパレータをエンドツーエンドで表示する
cell.separatorInset = .zero
Objective-C:
if (indexPath.row == {your row number}) {
cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
UITableView
承認された回答は機能しますが、グループ化されたには機能しません。
self.tableView.separatorColor = [UIColor clearColor];
。修正しました。
cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);
。cell.layoutMargins.leftの値を減算しない場合、区切り線は左の境界から左の余白に(ある場合)描画されます。
textLabel
画面外に移動します。
Hirenの回答をフォローアップする。
中のviewDidLoadと、次の行:
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
または、XIBまたはストーリーボードを使用している場合は、 " separator "を " none "に変更します。
そしてCellForRowAtIndexPathにこれを追加します:
CGFloat separatorInset; // Separator x position
CGFloat separatorHeight;
CGFloat separatorWidth;
CGFloat separatorY;
UIImageView *separator;
UIColor *separatorBGColor;
separatorY = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale); // This assures you to have a 1px line height whatever the screen resolution
separatorWidth = cell.frame.size.width;
separatorInset = 15.0f;
separatorBGColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];
separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];
これは、動的セルを含むテーブルビューを表示した結果の例です(ただし、コンテンツを含むテーブルビューは1つしかありません)。その結果、その1つだけにセパレータがあり、すべての「ダミー」のテーブルビューが自動的に画面いっぱいに追加されるわけではありません。
お役に立てれば。
編集:コメントを常に読むわけではない人のために、実際には数行のコードでそれを行うより良い方法があります:
override func viewDidLoad() {
super.viewDidLoad()
tableView.tableFooterView = UIView()
}
セパレータを自分で描画したくない場合は、これを使用します。
// Hide the cell separator by moving it to the far right
cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
ただし、このAPIはiOS 7以降でのみ使用できます。
separatorInset
セルの内容とセパレーターを挿入するようで、補正するために別のハックが必要です:cell.IndentationWidth = -10000;
separatorInset
、上、左、下に0 を設定し、右にセルの幅を設定することです。 cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width);
これにより、他のセルプロパティを調整する必要がなくなります。
私の開発環境は
上記の答えは私にとって十分に機能しません
試した後、最終的に機能する解決策は次のとおりです。
let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000
separatorInset.right = .greatestFiniteMagnitude
あなたのセルに設定します。
awakeFromNib
すると、画面全体が点滅する可能性がありますapplicationDidBecomeActive
でスウィフト3、スウィフト4とスウィフト5、あなたはこのようなのUITableViewCellの拡張を書き込むことができます。
extension UITableViewCell {
func separator(hide: Bool) {
separatorInset.left = hide ? bounds.size.width : 0
}
}
次に、これを以下のように使用できます(セルがセルインスタンスの場合)。
cell.separator(hide: false) // Shows separator
cell.separator(hide: true) // Hides separator
乱数を割り当てるよりも、テーブルビューのセルの幅を左インセットとして割り当てる方が実際に優れています。画面の大きさによっては、現在ではないかもしれませんが、乱数が十分でない可能性があるため、今後もセパレータが表示される可能性があるためです。また、iPadを横長モードにすると、セパレーターが常に非表示になることを保証できません。
iOS 7および8向けの優れたソリューション
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
DLog(@"");
if (cell && indexPath.row == 0 && indexPath.section == 0) {
DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
}
}
アプリが回転可能な場合—左インセット定数に3000.0fを使用するか、その場で計算します。右インセットを設定しようとすると、iOS 8のセルの左側にセパレーターの一部が表示されます。
iOS 7では、UITableViewのグループ化されたスタイルのセルセパレーターは少し異なります。次のようになります。
私はこれを行うことについてKemenaranの答えを試しました:
cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
しかし、それは私にはうまくいかないようです。理由はわかりません。そこで、Hirenの回答を使用することにしましたが、のUIView
代わりにを使用UIImageView
して、iOS 7スタイルで線を描画します。
UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];
//First cell in a section
if (indexPath.row == 0) {
UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
line.backgroundColor = iOS7LineColor;
[cell addSubview:line];
[cell bringSubviewToFront:line];
} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {
UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
line.backgroundColor = iOS7LineColor;
[cell addSubview:line];
[cell bringSubviewToFront:line];
UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
lineBottom.backgroundColor = iOS7LineColor;
[cell addSubview:lineBottom];
[cell bringSubviewToFront:lineBottom];
} else {
//Last cell in the table view
UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
line.backgroundColor = iOS7LineColor;
[cell addSubview:line];
[cell bringSubviewToFront:line];
}
これを使用する場合は、2番目のifステートメントで正しいテーブルビューの高さを接続してください。これが誰かに役立つことを願っています。
UITableViewCellサブクラスで、layoutSubviewsをオーバーライドし、_UITableViewCellSeparatorViewを非表示にします。iOS 10で動作します。
override func layoutSubviews() {
super.layoutSubviews()
subviews.forEach { (view) in
if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
view.hidden = true
}
}
}
このアプローチが動的セルを使用する状況でうまくいくとは思いません...
if (indexPath.row == self.newCarArray.count-1) {
cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
ダイナミックセルに対してどのテーブルビューメソッドを実行するかは関係ありません。インセットプロパティを変更したセルには、デキューされるたびに常にインセットプロパティが設定されます。これにより、行セパレーターが欠落します。自分で変更してください。
このようなものが私にとってうまくいきました:
if indexPath.row == franchises.count - 1 {
cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}
そうすれば、ロードごとにデータ構造の状態を更新できます
でスウィフト使用のiOS 8.4を:
/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath)
{
if indexPath.row == 3 {
// Hiding separator line for only one specific UITableViewCell
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
}
}
注:上記のスニペットは、動的セルを使用してUITableViewで機能します。発生する可能性がある唯一の問題は、静的セルをカテゴリ、なしとは異なるセパレータタイプ、およびテーブルビューのグループ化されたスタイルで使用する場合です。実際、この特定のケースでは、各カテゴリの最後のセルを非表示にしません。それを克服するために私が見つけた解決策は、セルセパレーターを(IBを介して)なしに設定し、手動で(コードを介して)ラインビューを作成して各セルに追加することでした。例として、以下のスニペットを確認してください:
/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath)
{
// Row 2 at Section 2
if indexPath.row == 1 && indexPath.section == 1 {
// Hiding separator line for one specific UITableViewCell
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
// Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
let additionalSeparatorThickness = CGFloat(1)
let additionalSeparator = UIView(frame: CGRectMake(0,
cell.frame.size.height - additionalSeparatorThickness,
cell.frame.size.width,
additionalSeparatorThickness))
additionalSeparator.backgroundColor = UIColor.redColor()
cell.addSubview(additionalSeparator)
}
}
このサブクラスを使用してください。セットseparatorInset
はiOS 9.2.1では機能しません。コンテンツが圧縮されます。
@interface NSPZeroMarginCell : UITableViewCell
@property (nonatomic, assign) BOOL separatorHidden;
@end
@implementation NSPZeroMarginCell
- (void) layoutSubviews {
[super layoutSubviews];
for (UIView *view in self.subviews) {
if (![view isKindOfClass:[UIControl class]]) {
if (CGRectGetHeight(view.frame) < 3) {
view.hidden = self.separatorHidden;
}
}
}
}
@end
より簡単で論理的な方法は、次のようにすることです。
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [[UIView alloc] initWithFrame:CGRectZero];
}
ほとんどの場合、最後のtableCiewCellセパレータのみを表示する必要はありません。また、このアプローチでは最後のtableViewCellセパレーターのみが削除されるため、セパレーターインセットを設定するために、自動レイアウトの問題(デバイスの回転など)やハードコード値について考慮する必要はありません。
Swift 3を使用し、最速のハッキング方法を採用すると、拡張機能を使用してコードを改善できます。
extension UITableViewCell {
var isSeparatorHidden: Bool {
get {
return self.separatorInset.right != 0
}
set {
if newValue {
self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
} else {
self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
}
}
}
}
次に、セルを構成するとき:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
switch indexPath.row {
case 3:
cell.isSeparatorHidden = true
default:
cell.isSeparatorHidden = false
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)
if cell.isSeparatorHidden {
// do stuff
}
}
これを実現する最良の方法は、デフォルトの行区切りをオフにサブクラスすることであるUITableViewCell
とのサブビューとしてカスタムラインセパレーターを追加しcontentView
た型のオブジェクト提示するために使用されるカスタムセルの下に表示さ- SNStock
2つの文字列の特性を有し、ticker
かつname
:
import UIKit
private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1
class SNStockCell: UITableViewCell {
private let primaryTextColor: UIColor
private let secondaryTextColor: UIColor
private let customLineSeparatorView: UIView
var showsCustomLineSeparator: Bool {
get {
return !customLineSeparatorView.hidden
}
set(showsCustomLineSeparator) {
customLineSeparatorView.hidden = !showsCustomLineSeparator
}
}
var customLineSeparatorColor: UIColor? {
get {
return customLineSeparatorView.backgroundColor
}
set(customLineSeparatorColor) {
customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
}
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
self.primaryTextColor = primaryTextColor
self.secondaryTextColor = secondaryTextColor
self.customLineSeparatorView = UIView(frame:CGRectZero)
super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
selectionStyle = UITableViewCellSelectionStyle.None
backgroundColor = UIColor.clearColor()
contentView.addSubview(customLineSeparatorView)
customLineSeparatorView.hidden = true
}
override func prepareForReuse() {
super.prepareForReuse()
self.showsCustomLineSeparator = false
}
// MARK: Layout
override func layoutSubviews() {
super.layoutSubviews()
layoutCustomLineSeparator()
}
private func layoutCustomLineSeparator() {
let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
customLineSeparatorView.frame = CGRectMake(horizontalPadding,
kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
lineSeparatorWidth,
kSNStockCellCellLineSeparatorHeight)
}
// MARK: Public Class API
class func cellHeight() -> CGFloat {
return kSNStockCellCellHeight
}
// MARK: Public API
func configureWithStock(stock: SNStock) {
textLabel!.text = stock.ticker as String
textLabel!.textColor = primaryTextColor
detailTextLabel!.text = stock.name as String
detailTextLabel!.textColor = secondaryTextColor
setNeedsLayout()
}
}
デフォルトの行区切り文字を無効にするには、を使用しますtableView.separatorStyle = UITableViewCellSeparatorStyle.None;
。消費者側は比較的単純です。以下の例を参照してください。
private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
if (cell == nil) {
cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
}
cell!.configureWithStock(stockAtIndexPath(indexPath))
cell!.showsCustomLineSeparator = true
cell!.customLineSeparatorColor = tintColor
return cell!
}
以下のコードを試してください、あなたの問題を解決するのに役立つかもしれません
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString* reuseIdentifier = @"Contact Cell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (nil == cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];
} else {
cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];
}
}
return cell;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellId = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;
if (row == lastRowIndexInSection) {
CGFloat halfWidthOfCell = cell.frame.size.width / 2;
cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
}
}
カスタムセルを取得してラベルを追加し、ラベルがセル領域全体をカバーするように制約を設定する必要があります。そして、コンストラクタに以下の行を書きます。
- (void)awakeFromNib {
// Initialization code
self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
//self.layoutMargins = UIEdgeInsetsZero;
[self setBackgroundColor:[UIColor clearColor]];
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
}
また、UITableViewレイアウトのマージンを次のように設定します
tblSignup.layoutMargins = UIEdgeInsetsZero;
他の人が指摘したように、UITableView自体全体でオフにするだけで、すべての UITableViewCellセパレーターを簡単に非表示にできます。例えばあなたのUITableViewController
- (void)viewDidLoad {
...
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
...
}
残念ながら、それはあなたが本当に求めていることである、セルごとに行うべき本当のPITA です。
個人的には、cell.separatorInset.left
(多くの)他の人が示唆しているように、を変更するための多数の順列を試しましたが、問題はAppleを引用することです(強調を追加):
" ...このプロパティを使用して、現在のセルのコンテンツとテーブルの左端および右端の間にスペースを追加できます。正のインセット値は、セルのコンテンツとセルセパレータを表の端から内側および外側に移動します... "
そのため、セパレータを画面の外に向かって右に移動して「非表示」にしようとすると、セルのcontentViewもインデントされる可能性があります。crifanによって提案されているように、設定cell.indentationWidth
してcell.indentationLevel
適切にすべてを戻すことにより、この厄介な副作用を補おうとすることができますが、これも信頼できないことがわかりました(コンテンツがまだインデントされています...)。
私が見つけた最も信頼できる方法layoutSubviews
は、シンプルなUITableViewCellサブクラスをオーバーライドし、右インセットが左インセットに当たるように設定し、セパレーターの幅を0にして非表示にすることです。これは、layoutSubviewsで自動的に回転の処理]。これをオンにするために、サブクラスに簡易メソッドも追加します。
@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end
@implementation MyTableViewCellSubclass
- (void)hideSeparator
{
_separatorIsHidden = YES;
}
- (void)layoutSubviews
{
[super layoutSubviews];
if (_separatorIsHidden) {
UIEdgeInsets inset = self.separatorInset;
inset.right = self.bounds.size.width - inset.left;
self.separatorInset = inset;
}
}
@end
警告:元の正しいインセットを復元する信頼できる方法はないので、セパレーターを「再表示」することはできません。そのため、私は不可逆性を使用していますhideSeparator
メソッド(vs separatorIsHiddenを公開しているのに対して)。separatorInsetは再利用されたセル全体に持続することに注意してください。「非表示を解除」することはできないため、これらの非表示のセパレーターセルを独自のreloadIdentifierで分離しておく必要があります。
迅速:
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
// remove separator for last cell
cell.separatorInset = indexPath.row < numberOfRowsInSection-1
? tableView.separatorInset
: UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)
return cell
}
Objective-C:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
// remove separator for last cell
cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
? tableView.separatorInset
: UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);
return cell;
}
テーブルビューセルクラス内。これらのコード行を入れて
separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
iOS9では、セパレーターインセットを変更すると、text-およびdetailLabelの配置にも影響するという問題がありました。
これで解決しました
override func layoutSubviews() {
super.layoutSubviews()
separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}