我有一个UITableView
分隔符没有完整宽度的地方。它结束于左侧之前的10像素。我在中使用此代码viewDidLoad()
。
self.tableView.layoutMargins = UIEdgeInsetsZero;
同样在情节提要中,您可以选择自定义或默认选择器。现在,所有填充的单元格都没有全角选择器,但空单元格则具有全角选择器。
我怎样才能解决这个问题?
我有一个UITableView
分隔符没有完整宽度的地方。它结束于左侧之前的10像素。我在中使用此代码viewDidLoad()
。
self.tableView.layoutMargins = UIEdgeInsetsZero;
同样在情节提要中,您可以选择自定义或默认选择器。现在,所有填充的单元格都没有全角选择器,但空单元格则具有全角选择器。
我怎样才能解决这个问题?
Answers:
这在使用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 5更新:
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
我从这篇文章中得到了答案:iOS 8 UITableView分隔符插入0不起作用
只需将此代码添加到您的 UITableViewController
-(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];
}
}
viewDidLayoutSubviews
不是必需的
在你的 UITableViewCell
转到Interface Builder中的Attributes Inspector,只需将“ 15”更改为0。对要更改的所有单元格执行此操作。
您可能需要添加[cell setLayoutMargins:UIEdgeInsetsZero];
到tableViewCell
我继承UITableViewController
了这两个inset设置,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
}
}
preservesSuperviewLayoutMargins = false
因为默认值已经为false
UITableViewCell
left
和/或right
字段。(默认情况下left: 15
,right: 0
)看一下它是如何工作的(使用left: 100
):
结果:
对于iOS 9+中的Swift
如果使用自定义UITableViewCell
:
override var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set(newVal) {}
}
然后在您UITableView
的viewDidLoad
:
self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;
对于iPad遇到问题的人–这将使您处于与iPhone相同的状态。然后,您可以separatorInset
根据需要进行调整。
tableView.cellLayoutMarginsFollowReadableWidth = false
经过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) {
对于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
}
}
这些解决方案都无法在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
。
UITableView
有财产separatorInset
。将UITableView
行分隔符的插入设置为零。您也可以改变separatorInset
从故事板