如何在UITableView中设置分隔符的全宽
所以我有一个UITableView分隔符没有完整的宽度。 它在左侧之前像10个像素结束。 我在viewDidLoad中玩这个代码
self.tableView.layoutMargins = UIEdgeInsetsZero;
也可以在故事板中select自定义或默认select器。 现在,所有填充的单元格都不具有全宽select器,但空单元格具有全宽度。
我怎么能解决这个问题?
感谢所有的帮助
这对我使用Xcode 6.4和Swift 1.2的iOS 8.4 – 9.0设备有效:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = UITableViewCell() cell.preservesSuperviewLayoutMargins = false cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero return cell }
Swift 3.0更新
cell.preservesSuperviewLayoutMargins = false cell.separatorInset = UIEdgeInsets.zero cell.layoutMargins = UIEdgeInsets.zero
好吧,我find了答案。 不知道为什么我以前没有遇到过这个post,当然,当你发布一个问题之后,突然间右边的post出现在你的面前。 我从这个post得到的答案: iOS 8的UITableView分隔符插入0不工作
只需将此代码添加到您的TableViewController
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZero]; } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } } -(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:UIEdgeInsetsZero]; } if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) { [self.tableView setLayoutMargins:UIEdgeInsetsZero]; } }
在你的UITableViewCell中
转到Interface Builder中的属性检查器,只需将“15”更改为0.对所有希望更改的单元执行此操作。
你可能需要添加[cell setLayoutMargins:UIEdgeInsetsZero]; 到你的tableviewcell
我从UITableViewController
inheritance,并需要额外的willDisplayCell
的两个插入设置,以设置preservesSuperviewLayoutMargins
willDisplayCell
为false。 在Swift中,它看起来像这样:
override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if cell.respondsToSelector("setSeparatorInset:") { cell.separatorInset = UIEdgeInsetsZero } if cell.respondsToSelector("setLayoutMargins:") { cell.layoutMargins = UIEdgeInsetsZero } if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") { cell.preservesSuperviewLayoutMargins = false } }
对于Swift 3:
override func viewDidLoad() { super.viewDidLoad() tableView.separatorInset = .zero tableView.layoutMargins = .zero }
- select你的
UITableViewCell
- 去Atributes督察
- 转到分隔符并将其更改为“自定义插入”
- 设置
left
和/或right
字段。 (默认left: 15
,right: 0
)
看看它是如何工作的(使用left: 100
):
结果:
testing了iOS 9.3和Swift 2.2。 请确保将代码放在willDisplayCell
,该代码在显示单元格之前调用,而不是在仅在单元格中创build单元格的cellForRowAtIndexPath
中。
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero }
添加override
的UITableViewController的函数,如下所示: override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
对于有iPad问题的人 – 这会让你处于与iPhone相同的状态。 然后可以根据需要调整separatorInset。
tableView.cellLayoutMarginsFollowReadableWidth = false
以上都不是在Swift 2.2和Xcode 7.3.1中为我工作的
原来是所有的最简单的解决scheme。 没有需要的代码。 只需更改UITableView检查器中的TableView单元布局边距值:
适用于iOS 9或更高版本
如果使用自定义的UITableViewCell:
override var layoutMargins: UIEdgeInsets { get { return UIEdgeInsetsZero } set(newVal) {} }
然后在viewDidLoad中为你的tableview:
self.tableView?.separatorInset = UIEdgeInsetsZero; self.tableView?.layoutMargins = UIEdgeInsetsZero;
在cellForRowAtIndexPath方法中使用它来configuration单元格的分隔符规格,
它适用于iOS9.0 +
cell.separatorInset = UIEdgeInsetsZero; cell.layoutMargins = UIEdgeInsetsZero; cell.preservesSuperviewLayoutMargins = NO;
对于Swift 3:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) { cell.separatorInset = UIEdgeInsets.zero } if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) { cell.layoutMargins = UIEdgeInsets.zero } if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) { cell.preservesSuperviewLayoutMargins = false } }
这些解决scheme都不能在iPad上运行,但是我想出了一个覆盖这两种设备的解决scheme:
使用可重复使用的单元格:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; ...[other code]... [cell setLayoutMargins:UIEdgeInsetsZero]; [cell setSeparatorInset:UIEdgeInsetsZero]; return cell; }
使用不可重复使用的单元格:
- (void)removeSeparatorInset:(UITableView*)tableView{ NSArray *cells = [tableView visibleCells]; for (UITableViewCell *cell in cells){ [cell setLayoutMargins:UIEdgeInsetsZero]; [cell setSeparatorInset:UIEdgeInsetsZero]; } } -(void) viewDidLayoutSubviews{ [super viewDidLayoutSubviews]; [self removeSeparatorInset:self.tableView]; }
只是为了扩大这个方法:
@property(nonatomic) UIEdgeInsets separatorInset; @property(nonatomic) UIEdgeInsets layoutMargins;
这两个属性都可以被UITableView&UITableViewCell使用。 后者实际上是UIView的一个属性,它是UITableView和UITableViewCell的父类。