我正在自定义UITableView
。我想隐藏最后一条线单元格 ...我可以这样做吗?
我知道我可以做,tableView.separatorStyle = UITableViewCellStyle.None
但是那会影响tableView的所有单元格。我希望它只影响我的最后一个单元格。
我正在自定义UITableView
。我想隐藏最后一条线单元格 ...我可以这样做吗?
我知道我可以做,tableView.separatorStyle = UITableViewCellStyle.None
但是那会影响tableView的所有单元格。我希望它只影响我的最后一个单元格。
Answers:
在中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
目标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或情节提要,请将“ 分隔符 ” 更改为“ 无 ”:
并在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];
这是一个结果示例,其中显示带有动态单元格的表视图(但只有一个包含内容的视图)。结果是只有一个分隔符,而不是所有“虚拟”的tableview自动添加以填充屏幕。
希望这可以帮助。
编辑:对于那些不总是阅读注释的人,实际上有一种更好的方法可以用几行代码来做到这一点:
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
在Swift 3,Swift 4和Swift 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的answer,但使用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];
}
如果使用此选项,请确保在第二个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);
}
对于动态单元格,使用哪种tableview方法都没关系,更改inset属性的单元格每次出列时始终始终会设置inset属性,这会导致大量的行分隔符丢失……直到您自己改变。
这样的事情对我有用:
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的Swift中:
/*
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)设置为none,然后手动创建(通过代码)并将线型视图添加到每个单元格。例如,请检查以下代码段:
/*
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分隔符,您无需考虑自动布局问题(即旋转设备)或设置分隔符插图的硬编码值。
在willdisplaycell
:
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
使用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
具有两个字符串属性的类型的对象,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);
}
}
您必须获取自定义单元格并添加Label并设置约束,例如label应该覆盖整个单元格区域。并在构造函数中编写以下行。
- (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
正如(许多)其他人所建议的那样,但问题是引用苹果的话(强调了):
“ ...您可以使用此属性在当前单元格的内容与表格的左右边缘之间添加空格。正的插入值将移动单元格的内容和单元格分隔符向内移动并远离表的边缘... ”
因此,如果您尝试通过将分隔符移到右侧以外的位置来“隐藏”分隔符,那么最终也可以缩进单元格的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
方法(与暴露分隔符IsHidden相对)。请注意,eparatorInset在重复使用的单元格中持续存在,因此,因为您不能“取消隐藏”,因此需要将这些隐藏的分隔器单元格隔离在各自的复用标识符中。
迅速:
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
}
目标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;
}
在iOS9上,我遇到了一个问题,即更改分隔符插图也会影响text-和detailLabel的位置。
我用这个解决了
override func layoutSubviews() {
super.layoutSubviews()
separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}