我有一个应用,UITableView
的分隔符插入设置为自定义值 - 右0
,左0
。这在iOS 7.x
中完美有效,但在iOS 8.0
中我看到分隔符插入在右侧设置为默认值15
。即使在xib文件中它设置为0
,它仍然显示不正确。
如何删除UITableViewCell
分隔符边距?
答案 0 :(得分:1067)
iOS 8.0在单元格和表格视图中引入了layoutMargins属性。
此属性在iOS 7.0上不可用,因此您需要确保在分配之前进行检查!
此外,Apple已向您的单元格添加属性,这将阻止其继承您的表格视图的边距设置。设置此属性后,您的单元格可以独立于表视图配置自己的边距。把它想象成一个覆盖。
此属性称为preservesSuperviewLayoutMargins
,将其设置为NO
将允许单元格的layoutMargin
设置覆盖在TableView上设置的layoutMargin
。它既节省了时间(您不必修改表格视图的设置),而且更简洁。有关详细解释,请参阅Mike Abdullah的答案。
注意:接下来是针对单元级别边距设置的干净实现,如Mike Abdullah的回答所述。设置单元格preservesSuperviewLayoutMargins=NO
将确保表视图不会覆盖单元格设置。如果您确实希望整个表格视图具有一致的边距,请相应地调整您的代码。
设置细胞边距:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// Remove seperator inset
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}
将单元格上的preservesSuperviewLayoutMargins
属性设置为否应,以防止表格视图覆盖单元格边距。在某些情况下,它似乎无法正常运作。
如果一切都失败了,您可以强制使用表格视图边距:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
// Force your tableview margins (this may be a bad idea)
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
tableView.separatorInset = .zero
}
if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
tableView.layoutMargins = .zero
}
}
......你走了!这应该适用于iOS 7和8。
编辑: Mohamed Saleh提请我注意iOS 9中可能发生的变化。您可能需要将表格视图的cellLayoutMarginsFollowReadableWidth
设置为{{1}如果要自定义插入或边距。您的里程可能会有所不同,但未记录在案。
此属性仅存在于iOS 9中,因此请务必在设置前进行检查。
NO
Swift 4:
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
(来自iOS 8 UITableView separator inset 0 not working的代码)
编辑:这是一个纯粹的Interface Builder方法:
注:iOS 11更改&简化了大部分此类行为,即将发布更新......
答案 1 :(得分:255)
精氨酸!!!在你的Cell
子类中执行此操作之后:
- (UIEdgeInsets)layoutMargins
{
return UIEdgeInsetsZero;
}
或设置cell.layoutMargins = UIEdgeInsetsZero;
为我修复了它。
答案 2 :(得分:178)
让我们花点时间了解问题,然后盲目收费以尝试解决问题。
调试器中的快速浏览将告诉您分隔线是UITableViewCell
的子视图。看起来细胞本身对这些细胞系的布局负有相当大的责任。
iOS 8引入了布局边距的概念。默认情况下,视图的布局边距为8pt
,并且它们从祖先视图中继承。
我们可以告诉您,在布局其分隔线时,UITableViewCell
选择尊重左侧布局边距,使用它来约束左侧插图。
将所有这些放在一起,以实现真正零的理想插图,我们需要:
0
就这样,这是一项非常简单的任务:
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
注意事项:
preservesSuperviewLayoutMargins
指定用户定义的运行时属性。preservesSuperviewLayoutMargins
,而是可以配置祖先视图(例如表格)以使0
左边距也是如此,但这似乎更容易出错。你不能控制整个等级。0
并保留其他边距可能会稍微清晰一些。UITableView
在普通样式表格底部绘制的分隔符,我猜测这也需要在表格级别指定相同的设置(还没试过这个!)答案 3 :(得分:58)
我相信这是我在这里提出的问题:Remove SeparatorInset on iOS 8 UITableView for XCode 6 iPhone Simulator
在 iOS 8 中,从UIView
继承的所有对象都有一个新属性。因此,在iOS 7.x中设置SeparatorInset
的解决方案将无法删除您在iOS 8中的UITableView上看到的空白区域。
新属性名为" layoutMargins "。
@property(nonatomic) UIEdgeInsets layoutMargins
Description The default spacing to use when laying out content in the view.
Availability iOS (8.0 and later)
Declared In UIView.h
Reference UIView Class Reference
解决方案: -
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
如果您设置cell.layoutMargins = UIEdgeInsetsZero;
而未检查layoutMargins
是否存在,那么该应用将在iOS 7.x上崩溃。因此,最好的方法是在layoutMargins
之前检查setLayoutMargins:UIEdgeInsetsZero
是否存在。
答案 4 :(得分:46)
您可以在应用程序启动时(加载UI之前)使用UIAppearance一次,将其设置为默认全局设置:
// iOS 7:
[[UITableView appearance] setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
[[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero];
[[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];
// iOS 8:
if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) {
[[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero];
[[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
[[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}
这样,您可以保持UIViewController的代码干净,并且可以随时覆盖它。
答案 5 :(得分:41)
iOS在单元格和表格视图中引入了layoutMargins属性。
此属性在iOS 7.0中不可用,因此您需要确保在分配之前进行检查!
但是,Apple已向您的单元格添加了一个名为 preservesSuperviewLayoutMargins 的属性,这将阻止其继承您的表格视图的边距设置。这样,您的单元格可以独立于表视图配置自己的边距。把它想象成一个覆盖。
此属性称为 preservesSuperviewLayoutMargins ,将其设置为NO可以允许您使用自己的单元格layoutMargin设置覆盖表格视图的layoutMargin设置。它既节省了时间(您不必修改表格视图的设置),而且更简洁。有关详细解释,请参阅Mike Abdullah的答案。
注意:正如Mike Abdullah的回答所表达的那样,这是正确的,不那么混乱的实现;设置单元格的preserveSuperviewLayoutMargins = NO将确保您的表格视图不会覆盖单元格设置。
第一步 - 设置细胞边距:
/*
Tells the delegate that the table view is about to draw a cell for a particular row.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath)
{
// Remove separator inset
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}
}
将单元格上的preservesSuperviewLayoutMargins属性设置为NO 应,以防止表格视图覆盖单元格边距。在某些情况下,它似乎无法正常运作。
第二步 - 只有全部失败后,您才可以强制执行表格视图边距:
/*
Called to notify the view controller that its view has just laid out its subviews.
*/
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if self.tableView.respondsToSelector("setSeparatorInset:") {
self.tableView.separatorInset = UIEdgeInsetsZero
}
if self.tableView.respondsToSelector("setLayoutMargins:") {
self.tableView.layoutMargins = UIEdgeInsetsZero
}
}
......你走了!这应该适用于iOS 8以及iOS 7。
注意:使用iOS 8.1和7.1进行测试,在我的情况下,我只需要使用此解释的第一步。
只有在渲染单元格下面有未填充的单元格时才需要第二步,即。如果表大于表模型中的行数。不执行第二步将导致不同的分隔符偏移。
答案 6 :(得分:38)
在Swift中,由于layoutMargins
是一个属性,因为它更加烦人,所以你必须覆盖getter 和 setter。
override var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set(newVal) {}
}
这将有效地使layoutMargins
只读,这在我的情况下是好的。
答案 7 :(得分:22)
对于iOS 9,您需要添加:
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
有关详细信息,请参阅question。
答案 8 :(得分:15)
夫特:
override func viewDidLoad() {
super.viewDidLoad()
if self.tableView.respondsToSelector("setSeparatorInset:") {
self.tableView.separatorInset = UIEdgeInsetsZero
}
if self.tableView.respondsToSelector("setLayoutMargins:") {
self.tableView.layoutMargins = UIEdgeInsetsZero
}
self.tableView.layoutIfNeeded() // <--- this do the magic
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
...
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}
return cell
}
答案 9 :(得分:11)
我这样做了:
tableView.separatorInset = UIEdgeInsetsZero;
tableView.layoutMargins = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;
答案 10 :(得分:9)
关于cdstamper建议的而不是表视图,在单元格的layoutSubview方法中添加以下行对我有用。
- (void)layoutSubviews
{
[super layoutSubviews];
if ([self respondsToSelector:@selector(setSeparatorInset:)])
[self setSeparatorInset:UIEdgeInsetsZero];
if ([self respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)])
{
[self setPreservesSuperviewLayoutMargins:NO];;
}
if ([self respondsToSelector:@selector(setLayoutMargins:)])
{
[self setLayoutMargins:UIEdgeInsetsZero];
}
}
答案 11 :(得分:9)
这是完全控制这些东西的唯一方法(我能找到)
完全控制每个单元格上的分隔符插入和布局边距。请在willDisplayCell
上的UITableviewDelegate
方法中执行此操作。
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.layoutMargins = UIEdgeInsetsZero
cell.contentView.layoutMargins = UIEdgeInsetsMake(0, 10, 0, 10)
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
}
单元格对象控制分隔符,contentView
控制其他所有内容。如果您的分隔符插入空间显示为意外颜色,则应解决此问题:
cell.backgroundColor = cell.contentView.backgroundColor
答案 12 :(得分:9)
Swift 3.0示例:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// removing seperator inset
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// prevent the cell from inheriting the tableView's margin settings
if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// explicitly setting cell's layout margins
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}
答案 13 :(得分:8)
对我来说,简单的一行完成了工作
cell.layoutMargins = UIEdgeInsetsZero
答案 14 :(得分:8)
Swift 的简单解决方案 iOS 8 ,自定义UITableViewCell
override func awakeFromNib() {
super.awakeFromNib()
self.layoutMargins = UIEdgeInsetsZero
self.separatorInset = UIEdgeInsetsZero
}
通过这种方式,您只需设置一次layoutMargin
和separatorInset
,而不是为每个willDisplayCell
设置,因为大多数上述答案都表明了这一点。
如果您使用自定义UITableViewCell
,这是正确的地方。
否则你应该在tableView:cellForRowAtIndexPath
。
只是另一个提示:您不需要设置preservesSuperviewLayoutMargins = false
,因为默认值已经是NO
!
答案 15 :(得分:7)
只需添加以下代码即可解决此程序。
祝你好运!
-(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];
}
}
答案 16 :(得分:5)
这是我在Swift中为我工作的代码:
override func viewDidLoad()
{
super.viewDidLoad()
...
if tableView.respondsToSelector("setSeparatorInset:") {
tableView.separatorInset = UIEdgeInsetsZero
}
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath)
{
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset.left = CGFloat(0.0)
}
if tableView.respondsToSelector("setLayoutMargins:") {
tableView.layoutMargins = UIEdgeInsetsZero
}
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins.left = CGFloat(0.0)
}
}
对我来说这似乎是最干净的(现在),因为所有cell / tableView边缘/边距调整都是在tableView:willDisplayCell:forRowAtIndexPath:
方法中完成的,而不会将不必要的代码塞进tableView:cellForRowAtIndexPath:
。
顺便说一下,我只是设置了单元格左侧separatorInset / layoutMargins,因为在这种情况下我不想搞砸我在单元格中设置的约束。
代码更新为Swift 2.2:
override func viewDidLoad() {
super.viewDidLoad()
if tableView.respondsToSelector(Selector("setSeparatorInset:")) {
tableView.separatorInset = UIEdgeInsetsZero
}
}
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) {
if cell.respondsToSelector(Selector("setSeparatorInset:")) {
cell.separatorInset.left = CGFloat(0.0)
}
if tableView.respondsToSelector(Selector("setLayoutMargins:")) {
tableView.layoutMargins = UIEdgeInsetsZero
}
if cell.respondsToSelector(Selector("setLayoutMargins:")) {
cell.layoutMargins.left = CGFloat(0.0)
}
}
答案 17 :(得分:4)
卢卡斯在斯威夫特的回答:
// iOS 7:
UITableView.appearance().separatorStyle = .SingleLine
UITableView.appearance().separatorInset = UIEdgeInsetsZero
UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero
// iOS 8:
if UITableView.instancesRespondToSelector("setLayoutMargins:") {
UITableView.appearance().layoutMargins = UIEdgeInsetsZero
UITableViewCell.appearance().layoutMargins = UIEdgeInsetsZero
UITableViewCell.appearance().preservesSuperviewLayoutMargins = false
}
答案 18 :(得分:4)
每次单元格滚动时(使用preservesSuperviewLayoutMargins
)都不会更新layoutMargins
和willDisplayCell
,我建议在cellForRowAtIndexPath:
中执行一次:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath)
cell.preservesSuperviewLayoutMargins = false
cell.layoutMargins = UIEdgeInsetsZero
return cell
}
答案 19 :(得分:4)
大多数答案显示分隔符插入和布局边距是针对单元格和tableview的各种方法(即viewDidLayoutSubviews
,willDisplayCell
等)设置的,但我发现只是将这些放在cellForRowAtIndexPath
中效果很好。似乎是最干净的方式。
// kill insets for iOS 8
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) {
cell.preservesSuperviewLayoutMargins = NO;
[cell setLayoutMargins:UIEdgeInsetsZero];
}
// iOS 7 and later
if ([cell respondsToSelector:@selector(setSeparatorInset:)])
[cell setSeparatorInset:UIEdgeInsetsZero];
答案 20 :(得分:4)
使用下面的代码段,避免在IOS 8&amp; A中使用UITableView时出现不必要的填充问题。 7。
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
{
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
{
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)])
{
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
答案 21 :(得分:3)
在iOS8中:
将此添加到我的UITableViewCell子类:
- (UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero;
}
这对于&#34; tableView:cellForRowAtIndexPath&#34;或&#34; tableView:willDisplayCell&#34;:
[editCell setSeparatorInset:UIEdgeInsetsZero];
为我工作。
答案 22 :(得分:3)
这是一种全局删除插图的简便方法。
在UITableViewCell+Extensions.swift
:
import UIKit
extension UITableViewCell {
override public var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set { }
}
}
AppDelegate
application:didFinishLaunchingWithOptions:
:
UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero
你可能会认为a)也只是覆盖扩展中的separatorInset
,或者b)设置layoutMargins
的外观代理。两者都不会起作用。尽管separatorInset
被指示为属性,但尝试将其作为属性(或方法)覆盖会生成编译器错误。并设置UITableViewCell
的{{1}}的外观代理(或者,就此而言,还设置layoutMargins
的{{1}}和UITableView
的外观代理没有效果。
答案 23 :(得分:2)
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// ... Get the cell
cell.separatorInset = UIEdgeInsetsMake(0.f, 20.f, 0.f, [UIScreen mainScreen].bounds.size.width - 20);
// others
return cell;
}
对于您要隐藏分隔符的任何特定单元格。
答案 24 :(得分:2)
在3楼看到答案后,我试图找出在TableView和&amp;之间设置分隔符的关系。 TableViewCell并做了一些测试。以下是我的结论:
我们可以考虑将单元格的分隔符设置为零必须分两步移动分隔符:第一步是将单元格 separatorinset 设置为零。第二步是将单元格 marginlayout 设置为零。
设置TableView的 separatorinset , marginlayout 可以影响Cell的 separatorinset 。但是,从测试中我发现TableView的 separatorinset 似乎没用,TableView的 marginlayout 实际上可以影响单元格<强> marginlayout 强>
设置Cell的PreservesSuperviewLayoutMargins = false,可以切断TableView对
其中一个解决方案:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = UITableViewCell()
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero
return cell
}
答案 25 :(得分:2)
这是我的解决方案。这适用于自定义单元子类,只需将它们都添加到子类中。
- (UIEdgeInsets)layoutMargins {
return UIEdgeInsetsMake(0, 10, 0, 10);
}
2
self.separatorInset = UIEdgeInsetsMake(0, 10, 0, 10);
您可以方便地自定义分隔符的位置,而无需让设计师为您绘制一个..........
答案 26 :(得分:1)
添加此代码片段,Swift中的简单优雅适用于iOS8:)
// tableview single line
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.preservesSuperviewLayoutMargins = false
cell.layoutMargins = UIEdgeInsetsZero
}
答案 27 :(得分:1)
这在iOS 8和iOS 9中非常适合我。
OBJ-C
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
{
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
{
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)])
{
[cell setLayoutMargins:UIEdgeInsetsZero];
}
return cell;
}
答案 28 :(得分:1)
以比投票最多的答案更紧凑的方式......
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if ([cell respondsToSelector:@selector(setSeparatorInset:)] && [cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)] && [cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
[cell setPreservesSuperviewLayoutMargins:NO];
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
答案 29 :(得分:0)
对我来说,除了这个解决方法( Swift 3.0 )之外没有人工作过:
extension UIColor {
static func colorWith(hex:String, alpha: CGFloat) -> UIColor {
var cString = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
if cString.hasPrefix("#") {
cString.remove(at: cString.startIndex)
}
if cString.characters.count != 6 {
return UIColor.gray
}
var rgbValue:UInt32 = 0
Scanner(string: cString).scanHexInt32(&rgbValue)
return UIColor(red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat( rgbValue & 0x0000FF) / 255.0,
alpha: alpha)
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdendifier, for: indexPath)
cell.backgroundColor = UIColor.colorWith(hex: "c8c7cc", alpha: 1) // same color of line separator
return cell
}
答案 30 :(得分:0)
简单地将这两行放在cellForRowAtIndexPath方法
中如果你想要特定的分隔线从零开始,假设这里是最后一行从零开始
if (indexPath.row == array.count-1)
{
[cell setSeparatorInset:UIEdgeInsetsZero];
[cell setLayoutMargins:UIEdgeInsetsZero];
}
else
tblView.separatorInset=UIEdgeInsetsMake(0, 10, 0, 0);
答案 31 :(得分:0)
在Swift中你可以使用这个
cell.selectionStyle = UITableViewCellSelectionStyle.None
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero
答案 32 :(得分:0)
只需覆盖“ cellForRowAtIndexPath”并设置“ cell.preservesSuperviewLayoutMargins = false”,“ cell.separatorInset = UIEdgeInsets.zero”和“ cell.layoutMargins = UIEdgeInsets.zero”
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: LayoutTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "LayoutCell") as? LayoutTableViewCell
let currentLayout = OrderLayouts()[indexPath.row]
cell.NameLabel?.text = currentLayout.name
cell.DescrLabel?.text = currentLayout.descr
if(GlobalVariables.debug){
cell.DescrLabel?.text = "\(currentLayout.id) \n \(currentLayout.descr)"
}
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
return cell
}
答案 33 :(得分:0)
答案 34 :(得分:0)
我的解决方案是添加UIView作为单元子视图的容器。然后将此UIView约束(顶部,底部,尾随,前导)设置为0点。所有不必要的大量消失了。the image showing the logic
答案 35 :(得分:0)
根据@cdstamper的回答,更好的地方是UITableViewCell的layoutSubviews,在你的单元格文件中(我设置1%间距,你可以设置为零),所以只需要在这里设置代码来处理所有情况(旋转和其他):
-(void)layoutSubviews
{
[super layoutSubviews];
if ([self respondsToSelector:@selector(setSeparatorInset:)]) {
[self setSeparatorInset:UIEdgeInsetsMake(0,self.bounds.size.width*0.01,0,self.bounds.size.width*0.01)];
}
if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
[self setLayoutMargins:UIEdgeInsetsMake(0,self.bounds.size.width*0.01,0,self.bounds.size.width*0.01)];
}
}
答案 36 :(得分:0)
iOS 8及更高版本。 Swift 2.0及更高版本:
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.separatorInset = UIEdgeInsetsZero
if #available(iOS 8.0, *) {
cell.layoutMargins = UIEdgeInsetsZero
} else {
// Fallback on earlier versions
}
}
答案 37 :(得分:0)
我对上述任何解决方案都没有任何好运。我正在为表格单元格使用NIB文件。我&#34;修复&#34;这是通过添加一个高度为1的标签。我将标签的背景更改为黑色,将标签固定到笔尖的底部,然后将其余内容的底部固定到添加的标签上。现在我的细胞底部有一条黑色边框。
对我来说,这感觉更像是一种黑客,但确实有效。
我唯一的另一个选择是完全消除边界。我还在决定我是否会这样做。
答案 38 :(得分:0)
我经历了所有这些精彩的答案,并意识到其中大多数都不适用于iOS 8,或者可以正常工作,但分隔符会在动画期间改变大小,从而导致不必要的闪烁。这是我在创建窗口之前最终在我的app委托中所做的事情:
[[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero];
[[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];
if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) {
[[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero];
[[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
[[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}
这就是我添加到UITableViewController中的内容:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
我不需要添加任何其他内容。感谢所有提供关键部分的人。
答案 39 :(得分:0)
让我的代码:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
cell.preservesSuperviewLayoutMargins = NO;
[cell setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}
答案 40 :(得分:-1)
使用 Swift 2.2
创建import UIKit
extension UITableViewCell {
func removeMargins() {
if self.respondsToSelector(Selector("setSeparatorInset:")) {
self.separatorInset = UIEdgeInsetsZero
}
if self.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) {
self.preservesSuperviewLayoutMargins = false
}
if self.respondsToSelector(Selector("setLayoutMargins:")) {
self.layoutMargins = UIEdgeInsetsZero
}
}
}
cellForRowAtIndex
现在您可以在-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.removeMargins()//To remove seprator inset
}
#!/usr/bin/perl/
use strict;
use warnings;
use Data::Dumper;
#my $filename = '/swpkg/shared/batch_processing/mistints/mistints.csv';
my $filename = 'tested.csv';
open my $FH, $filename
or die "Could not read from $filename <$!>, program halting.";
# Read the header line.
chomp(my $line = <$FH>);
my @fields = split(/,/, $line);
#print "Field Names:\n", Dumper(@fields), $/;
print Dumper(@fields), $/;
my @data;
# Read the lines one by one.
while($line = <$FH>) {
# split the fields, concatenate the first three fields,
# and add it to the beginning of each line in the file
chomp($line);
my @fields = split(/,/, $line);
unshift @fields, join '_', @fields[0..2];
push @data, \@fields;
my $in_date = $fields[14];
my $db_date = join '-', reverse split /\D/, $in_date;
}
close $FH;
print "Unsorted:\n", Dumper(@data); #, $/;
@data = sort {
$a->[0] cmp $b->[0] ||
$a->[20] cmp $b->[20] ||
$a->[23] cmp $b->[23] ||
$a->[26] cmp $b-> [26]
} @data;
open my $OFH, '>', '/swpkg/shared/batch_processing/mistints/parsedMistints.csv';
#print $OFH Dumper(@data);
print $OFH join(',', @$_), $/ for @data;
close $OFH;
#print "Sorted:\n", Dumper(@data);
#print "Sorted:", Dumper(@data);
exit;
答案 41 :(得分:-1)
XCode 7.1 iOS 7,8,9:
将这两行放在TabelViewCell中:
self.layoutMargins = UIEdgeInsetsZero;
self.preservesSuperviewLayoutMargins = false;
这对我有用