Ich passe eine UITableView
an. Ich möchte die Trennlinie in der last Zelle verbergen ... kann ich das tun?
Ich weiß, dass ich tableView.separatorStyle = UITableViewCellStyle.None
tun kann, aber das würde all die Zellen der tableView beeinflussen. Ich möchte, dass es nur meine letzte Zelle betrifft.
fügen Sie in viewDidLoad
diese Zeile hinzu:
self.tableView.separatorColor = [UIColor clearColor];
und in cellForRowAtIndexPath
:
für iOS niedrigere Versionen
if(indexPath.row != self.newCarArray.count-1){
UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
line.backgroundColor = [UIColor redColor];
[cell addSubview:line];
}
für iOS 7 obere Versionen (einschließlich iOS 8)
if (indexPath.row == self.newCarArray.count-1) {
cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
Sie können den folgenden Code verwenden:
Schnell:
if indexPath.row == {your row number} {
cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}
oder :
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)
für Standard Margin:
cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)
trennzeichen Ende bis Ende anzeigen
cell.separatorInset = .zero
Ziel c:
if (indexPath.row == {your row number}) {
cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
Folgen Sie der Antwort von Hiren.
in ViewDidLoad und folgende Zeile:
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
Wenn Sie XIBs oder Storyboards verwenden, ändern Sie " separator " in " none ":
Und in CellForRowAtIndexPath fügen Sie Folgendes hinzu:
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];
Hier ist ein Beispiel für das Ergebnis, bei dem ich eine Tabellenansicht mit dynamischen Zellen (aber nur eine einzige mit Inhalt) zeige. Das Ergebnis ist, dass nur derjenige ein Trennzeichen hat und nicht alle "Dummy" -Tabellen automatisch hinzugefügt werden, um den Bildschirm auszufüllen.
Hoffe das hilft.
EDIT: Für diejenigen, die die Kommentare nicht immer lesen, gibt es eine bessere Möglichkeit, dies mit ein paar Zeilen Code zu tun:
override func viewDidLoad() {
super.viewDidLoad()
tableView.tableFooterView = UIView()
}
Wenn Sie das Trennzeichen nicht selbst zeichnen möchten, verwenden Sie Folgendes:
// Hide the cell separator by moving it to the far right
cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
Diese API ist jedoch nur ab iOS 7 verfügbar.
meine entwicklungsumgebung ist
antworten oben funktionieren für mich nicht voll
nach dem Versuch ist meine endgültig funktionierende Lösung:
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
Bessere Lösung für iOS 7 und 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);
}
}
Wenn Ihre App drehbar ist - verwenden Sie 3000.0f für die linke Einfügungskonstante oder berechnen Sie sie im laufenden Betrieb. Wenn Sie versuchen, die rechte Einfügung festzulegen, haben Sie auf iOS 8 einen Teil des Trennzeichens auf der linken Seite der Zelle sichtbar.
In Swift 3 und Swift 4 können Sie eine Erweiterung für UITableViewCell wie folgt schreiben:
extension UITableViewCell {
func hideSeparator() {
self.separatorInset = UIEdgeInsets(top: 0, left: self.bounds.size.width, bottom: 0, right: 0)
}
func showSeparator() {
self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
}
Dann können Sie dies wie folgt verwenden (wenn cell Ihre Zellinstanz ist):
cell.hideSeparator()
cell.showSeparator()
Es ist wirklich besser, die Breite der Tabellenzellenzelle als linken Einzug zuzuweisen, statt einer Zufallszahl. In einigen Bildschirmabmessungen sind die Trennzeichen in Zukunft möglicherweise noch nicht sichtbar, da die Zufallszahl möglicherweise nicht ausreicht. Beim iPad im Querformatmodus können Sie auch nicht garantieren, dass Ihre Trennzeichen immer unsichtbar sind.
In iOS 7 sieht das in UITableView gruppierte Zelltrennzeichen etwas anders aus. Es sieht ein bisschen so aus:
Ich habe versucht, Kemenarans Antwort zu tun:
cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
Das scheint aber bei mir nicht zu funktionieren. Ich bin mir nicht sicher warum. Also entschied ich mich für Hirens answer , aber UIView
anstelle von UIImageView
und zeichnet die Linie im iOS 7-Stil:
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];
}
Wenn Sie dies verwenden, stellen Sie sicher, dass Sie die richtige Höhe der Tabellensicht in die zweite if-Anweisung einfügen. Ich hoffe das ist nützlich für jemanden.
Überschreiben Sie in Ihrer UITableViewCell-Unterklasse layoutSubviews und verbergen Sie die _UITableViewCellSeparatorView. Funktioniert unter iOS 10.
override func layoutSubviews() {
super.layoutSubviews()
subviews.forEach { (view) in
if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
view.hidden = true
}
}
}
Verwenden Sie diese Unterklasse, und setzen Sie separatorInset
für iOS 9.2.1 nicht. Der Inhalt würde quetschen.
@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
Ich glaube nicht, dass dieser Ansatz unter allen Umständen mit dynamischen Zellen funktionieren wird ...
if (indexPath.row == self.newCarArray.count-1) {
cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
Es spielt keine Rolle, in welcher Tableview-Methode Sie für dynamische Zellen die Zelle, für die Sie die Einfügungseigenschaft geändert haben, immer bei jeder Dequeu-Einstellung für die Einfügungseigenschaft festgelegt hat, was zu einem Ansturm fehlender Trennzeichen führt ändere es selbst.
So etwas funktionierte für mich:
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)
}
Auf diese Weise aktualisieren Sie den Status Ihrer Datenstruktur bei jeder Last
Das ist viel einfacher und logischer:
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [[UIView alloc] initWithFrame:CGRectZero];
}
In den meisten Fällen möchten Sie nicht nur den letzten tableCiewCell-Separator sehen. Bei diesem Ansatz wird nur das letzte separater tableViewCell-Trennzeichen entfernt, und Sie müssen nicht über Probleme mit dem automatischen Layout (d. H. Rotierende Geräte) oder Hardcodewerte nachdenken, um Trennzeichen-Insets einzurichten.
In Swift Verwenden von 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)
}
}
Hinweis: Dieses Snippet oben funktioniert mit dynamischen Zellen in UITableView. Das einzige Problem, auf das Sie stoßen können, ist, wenn Sie statische Zellen mit Kategorien verwenden, einen Trenner-Typ, der sich von none unterscheidet, und einen gruppierten Stil für die Tabellenansicht. In diesem speziellen Fall wird die letzte Zelle jeder Kategorie nicht ausgeblendet. Um dies zu überwinden, bestand die Lösung, die ich fand, darin, den Zellseparator (über IB) auf none zu setzen und dann die Linienansicht manuell zu erstellen und über jede Zeile in die Zelle einzufügen. Ein Beispiel finden Sie in dem folgenden Snippet:
/*
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)
}
}
Mit Swift 3 und der schnellsten Hacking-Methode können Sie Code mit extensions verbessern:
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)
}
}
}
}
Dann, wenn Sie die Zelle konfigurieren:
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
}
}
wenn die akzeptierte Antwort nicht funktioniert, können Sie Folgendes versuchen:
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 0.01f; }
Es ist toll ;)
Schnell:
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
}
Ziel 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;
}
In willdisplaycell
:
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
if([_data count] == 0 ){
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];// [self tableView].=YES;
} else {
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];//// [self tableView].hidden=NO;
}
füge folgende Zeile zu viewDidLoad()
hinzu:
tableView.separatorColor = UIColor.clearColor()
- (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);
}
}
Ich konnte das Trennzeichen in einer bestimmten Zelle nur mit der folgenden Problemumgehung ausblenden
- (void)layoutSubviews {
[super layoutSubviews];
[self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
for (UIView *view in self.subviews) {
if (![view isKindOfClass:[UIControl class]]) {
[view removeFromSuperview];
}
}
}
Sie müssen eine benutzerdefinierte Zelle nehmen und Label hinzufügen und eine Einschränkung festlegen, z. B. sollte Label den gesamten Zellenbereich abdecken. Und die folgende Zeile in den Konstruktor schreiben.
- (void)awakeFromNib {
// Initialization code
self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
//self.layoutMargins = UIEdgeInsetsZero;
[self setBackgroundColor:[UIColor clearColor]];
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
}
Legen Sie auch den UITableView Layout-Rand wie folgt fest
tblSignup.layoutMargins = UIEdgeInsetsZero;
Probieren Sie den folgenden Code aus, um das Problem möglicherweise zu lösen
- (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;
}
Ich wollte das Trennzeichen zwischen der 4. und 5. Zelle verstecken. Ich habe es durch erreicht
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.row == 3)
{
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
}
}
Dies erreichen Sie am besten durch Deaktivieren der Standardzeilentrennzeichen, der Unterklasse UITableViewCell
und Hinzufügen eines benutzerdefinierten Linientrennzeichens als Unteransicht der contentView
- siehe unten eine benutzerdefinierte Zelle, in der ein Objekt vom Typ SNStock
mit zwei Zeichenfolgeeigenschaften angezeigt wird ticker
und 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()
}
}
Um das Standardseiltrennzeichen zu deaktivieren, verwenden Sie tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
. Die Verbraucherseite ist relativ einfach, siehe Beispiel unten:
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!
}
Für iOS7 und höher ist die sauberere Methode die Verwendung von INFINITY anstelle von fest codierten Werten. Sie müssen sich nicht um die Aktualisierung der Zelle kümmern, wenn sich der Bildschirm dreht.
if (indexPath.row == <row number>) {
cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
Wie (viele) andere darauf hingewiesen haben, können Sie die UITableViewCell-Separatoren all ganz einfach ausblenden, indem Sie sie für die gesamte UITableView selbst deaktivieren. zB in Ihrem UITableViewController
- (void)viewDidLoad {
...
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
...
}
Leider ist es eine echte PITA auf per-cell -Basis, was Sie wirklich fragen.
Ich persönlich habe bereits zahlreiche Permutationen ausprobiert, um den cell.separatorInset.left
zu ändern, wie (viele) andere vorgeschlagen haben, aber das Problem ist, Apple zu zitieren (Hervorhebung hinzugefügt):
"... Sie können diese Eigenschaft verwenden, um Leerzeichen zwischen der aktuellen Zelle Inhalt und dem linken und rechten Rand der Tabelle hinzuzufügen. Positive Einfügewerte verschieben den Zellinhalt und das Zellseparator nach innen und weg von den Tischkanten ... "
Wenn Sie also versuchen, das Trennzeichen durch Verschieben des Trennzeichens nach rechts "auszublenden", können Sie am Ende auch die Inhaltsansicht Ihrer Zelle einrücken. Wie von crifan vorgeschlagen, können Sie dann versuchen, diesen unangenehmen Nebeneffekt zu kompensieren, indem Sie cell.indentationWidth
und cell.indentationLevel
entsprechend einstellen, um alles zurück zu verschieben. Ich habe jedoch festgestellt, dass dies ebenfalls unzuverlässig ist (der Inhalt wird immer noch eingerückt ...).
Die zuverlässigste Methode, die ich gefunden habe, ist, layoutSubviews
in einer einfachen UITableViewCell-Unterklasse zu überschreiben und den right -Einzug so zu setzen, dass er auf den linken Einschub trifft, sodass das Trennzeichen 0 Breite hat und daher unsichtbar ist gemacht in layoutSubviews zur automatischen Bearbeitung von Rotationen]. Ich füge meiner Unterklasse auch eine bequeme Methode hinzu, um dies zu aktivieren.
@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
Vorbehalt: Es gibt keine zuverlässige Methode zum Wiederherstellen der rechten Einfügung von original. Sie können also das Trennzeichen nicht "ausblenden". Daher verwende ich eine irreversible hideSeparator
-Methode (im Vergleich zu separatorIsHidden). Beachten Sie, dass separatorInset über wiederverwendete Zellen bestehen bleibt. Sie können diese ausgeblendeten Separator-Zellen daher in ihrem eigenen reuseIdentifier isoliert lassen, da Sie sie nicht "ausblenden können".
Es funktioniert für mich, wenn ich die Erweiterung benutze und innerhalb von layoutSubviews () sofort die Layout-Ansichten aktualisiert.
extension UITableViewCell {
func removeSeparator() {
separatorInset = UIEdgeInsetsMake(0, bounds.size.width, 0, 0)
}
}
override func layoutSubviews() {
super.layoutSubviews()
removeSeparator()
}
Durch den Code, den alle Antworten haben, werden die Zellen anstelle des Standardwerts auf Null gesetzt. Ich habe das Problem in iOS 11 iPad Pro 12 '' gesehen.
Aber ich habe eine Lösung ("dirty hack"), die einen leeren Abschnitt machen soll, der die Trennlinie zum Ausblenden macht.
Hier ist der Code, den ich verwendet habe:
typedef enum PXSettingsTableSections {
PXSettingSectionInvite = 0,
PXSettingSectionAccount,
PXSettingSectionPrivacy,
PXSettingSectionCreation,
PXSettingSectionTest,
PXSettingSectionAboutHide, // invisble section just to hide separator Line
PXSettingSectionFooterHide, // invisble section just to hide separator Line
PXSettingSectionNumItems,
} PXSettingsTableSectionsType;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return PXSettingSectionNumItems;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case PXSettingSectionInvite: return 1;
case PXSettingSectionAccount:return (isSocialLogin) ? 1 : 2;
case PXSettingSectionPrivacy: return 1;
case PXSettingSectionCreation: return 2;
case PXSettingSectionTest: return 3;
case PXSettingSectionAboutHide: return 3;
default: return 0;
}
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch(section)
{
case PXSettingSectionInvite: return nil;
case PXSettingSectionAccount: return @"Account";
case PXSettingSectionPrivacy: return @"Privacy";
case PXSettingSectionCreation: return @"Someting";
case PXSettingSectionTest: return @"Test";
case PXSettingSectionAboutHide: return @" ";
case PXSettingSectionFooterHide: return @" ";
}
return nil;
}
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
if (section == PXSettingSectionFooterHide || section == PXSettingSectionAboutHide) {
// [UIColor clearColor] will not work
[header.contentView setBackgroundColor:[UIColor whiteColor]];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
// You can control here the size of one specific section
if(section == PXSettingSectionAboutHide){
return 0.0000001; //make it real small
}
return 45.0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
switch(indexPath.section)
{
case PXSettingSectionInvite:
return self.inviteCell;
case PXSettingSectionAccount:
if (isSocialLogin) {
return self.myWalletCell;
}
switch(indexPath.row)
{
case 0: return self.changePasswordCell;
case 1: return self.myWalletCell;
}
case PXSettingSectionPrivacy:
switch(indexPath.row)
{
case 0: return self.privateAccountCell;
}
case PXSettingSectionCreation:
switch(indexPath.row)
{
case 0: return self.videoResolutionCell;
case 1: return self.selfieMirrorCell;
}
case PXSettingSectionTest:
switch(indexPath.row)
{
case 0: return self.termsOfUseImageCell;
case 1: return self.attributionCell;
case 2: return self.aboutCell;
}
case PXSettingSectionAboutHide:{
switch(indexPath.row)
{
case 0: return self.clearCacheCell;
case 1: return self.feedbackCell;
case 2: return self.logoutCell;
}
}
}
return self.emptyCell;
}
Innerhalb der Tableview-Zellklasse. Setzen Sie diese Codezeile
separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
Unter iOS9 hatte ich das Problem, dass das Ändern der Trenneinlagen auch die Positionierung des Text- und Detaillabels beeinflusst.
Ich habe es damit gelöst
override func layoutSubviews() {
super.layoutSubviews()
separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}
Legen Sie separatorInset.right = .greatestFiniteMagnitude
in Ihrer Zelle fest.