所以我有一个UITableView,其中分隔符没有全宽。它在左侧前10像素结束。我在viewDidLoad
中玩这个代码self.tableView.layoutMargins = UIEdgeInsetsZero;
也可以在故事板中选择自定义或默认选择器。现在所有填充的单元格都没有全宽度选择器,但是空单元格具有全宽度。
我怎么能解决这个问题?
感谢所有帮助
答案 0 :(得分:205)
这适用于使用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
答案 1 :(得分:102)
好的,我找到了答案。不知道为什么我以前没有遇到这个帖子,但当然在你发布一个问题之后,突然之后,正确的帖子就会出现在你面前。我从这篇文章中得到了答案:iOS 8 UITableView separator inset 0 not working
只需在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];
}
}
答案 2 :(得分:89)
在UITableViewCell
转到Interface Builder中的Attributes Inspector,只需将“15”更改为0.对要更改的所有单元格执行此操作。
您可能需要将[cell setLayoutMargins:UIEdgeInsetsZero];
添加到tableViewCell
答案 3 :(得分:20)
对于Swift 3:
override func viewDidLoad() {
super.viewDidLoad()
tableView.separatorInset = .zero
tableView.layoutMargins = .zero
}
答案 4 :(得分:19)
我从UITableViewController
继承,并且willDisplayCell
中的两个插图设置还需要将preservesSuperviewLayoutMargins
设置为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
}
}
答案 5 :(得分:17)
答案 6 :(得分:9)
对于遇到iPad问题的人来说,这将使您处于与iPhone相同的状态。然后,您可以根据需要调整separatorInset。
tableView.cellLayoutMarginsFollowReadableWidth = false
答案 7 :(得分:8)
经测试适用于iOS 9.3& Swift 2.2。确保将代码放在显示单元格之前调用的willDisplayCell
中,而不是放在仅创建单元格的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) {
答案 8 :(得分:8)
适用于iOS 9 +中的swift
如果使用自定义UITableViewCell
:
override var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set(newVal) {}
}
然后是tableView
中的viewDidLoad
:
self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;
答案 9 :(得分:7)
答案 10 :(得分:6)
在cellForRowAtIndexPath
方法中使用它来配置单元格的分隔符规格,
它适用于iOS9.0 +
cell.separatorInset = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
答案 11 :(得分:5)
以上都没有在Swift 2.2和Xcode 7.3.1中为我工作
原来是最简单的解决方案。无需代码。只需在TableViewCell
检查器中更改UITableView
版面边距值:
答案 12 :(得分:4)
对于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
}
}
答案 13 :(得分:3)
swift 5,Xcode 11更新
将其放置在viewDidLoad()内
yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
对于边到边的分隔符,只需将left和right的值设置为0。
将“ yourTableView”更改为tableView出口名称。
答案 14 :(得分:0)
这些解决方案都不适用于iPad,但我提出了涵盖这两种设备的解决方案:
使用可重复使用的单元格:
- (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
的父类。 @Url.Action("Edit", "Account", new { Id = user.Id })
。
答案 15 :(得分:0)
在viewDidLoad
(测试iOS11 - swift 4.1)
尝试
tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)