iOS 9 UITableView分隔符插入(重要的左边距)
我在iOS 9
上的UITableViewCell
中的UITableView
之间存在分隔符问题。 他们有显着的左边缘。 我已经有了删除iOS 8
引入的空格的代码,但它不适用于iOS 9
。 看起来他们加了别的东西。 我想这可能是与layoutMarginsGuide连接,但我还没有弄明白。 有没有人有类似的问题,发现解决scheme?
好的, 我find了解决办法 。 唯一需要的是在UITableView
的呈现实例上设置标志cellLayoutMarginsFollowReadableWidth
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
我想在文档中find一些参考,但它看起来还没有准备好, 只在diff页面上提到 。
由于该标志是在iOS 9中引入的,因此向后兼容性应该在尝试设置之前添加一个检查:
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) { myTableView.cellLayoutMarginsFollowReadableWidth = NO; }
对于Swift 2.0
你可以使用#available
来检查iOS版本。
if #available(iOS 9, *) { myTableView.cellLayoutMarginsFollowReadableWidth = false }
此外,您需要使用Xcode 7
或更高版本进行编译。
编辑
请记住,这是唯一的必要的修复,如果你的分隔符看起来“好”,直到iOS 8,否则你需要更多一点。 你可以find信息如何做到这一点已经在SO。
Swift 2.2 iOS 9.3
在viewDidLoad中
tableView.cellLayoutMarginsFollowReadableWidth = false
在UITableViewDelegates中
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if cell.respondsToSelector(Selector("setSeparatorInset:")){ cell.separatorInset = UIEdgeInsetsZero } if cell.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) { cell.preservesSuperviewLayoutMargins = false } if cell.respondsToSelector(Selector("setLayoutMargins:")){ cell.layoutMargins = UIEdgeInsetsZero } }
如果你想在界面构build器中做到这一点
完美的解决scheme达到iOS 9
在viewDidLoad中
- (void)viewDidLoad { [super viewDidLoad]; //Required for iOS 9 if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 9.0) { self.testTableView.cellLayoutMarginsFollowReadableWidth = NO; } }
在TableViewDelegate方法中添加以下代码:
- (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 3.0 / 4.0
tableView.cellLayoutMarginsFollowReadableWidth = false 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: UIView.preservesSuperviewLayoutMargins)) { cell.preservesSuperviewLayoutMargins = false } if cell.responds(to: #selector(setter: UIView.layoutMargins)) { cell.layoutMargins = UIEdgeInsets.zero } }
这在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; }
根据这里的不同答案,我可以用Swift中的这些代码行去除分隔符的差距:
tableView.separatorInset = UIEdgeInsetsZero tableView.layoutMargins = UIEdgeInsetsZero cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero
但是我仍然在文本之前有这么小的差距:
接受的答案不适合我。 直到我移动setCellLayoutMarginsFollowReadableWidth之前setLayoutMargins(iOS 8仍然需要):
if([_tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) { _tableView.cellLayoutMarginsFollowReadableWidth = NO; } if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) { _tableView.layoutMargins = UIEdgeInsetsZero; }
- (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]; } }
对于iOS 8和9
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero]; if ([UITableView instancesRespondToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO]; }
和
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ([cell respondsToSelector:@selector(setLayoutMargins:)]) [cell setLayoutMargins:UIEdgeInsetsZero]; }
这是我在XCode 8.2.1中的Swift 3.0 / iOS 10的解决scheme。
我已经创build了一个适用于IB的UITableview的子类,并以编程的方式创build了tableviews。
import UIKit class EXCSuperTV: UITableView { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setupView() } override init(frame: CGRect, style: UITableViewStyle) { super.init(frame: frame, style: style) setupView() } func setupView() {} } class EXCNoFooter: EXCSuperTV { override func setupView() { super.setupView() //tableFooterView = UIView.Zero() } } class EXCMainTV: EXCNoFooter { override func setupView() { super.setupView() separatorInset = UIEdgeInsets.zero } }
- 有没有办法让NSUserDefaults中的所有值?
- 我如何使用NSURSession的NSOperationQueue?
- React Native:如何在按下“下一个”键盘button后select下一个TextInput?
- iOS 9初始屏幕是黑色的
- 在terminal上运行React Native App时出错(iOS)
- iOS 8:networking应用程序状态栏的位置和resize的问题
- Swift – 使用哪种types? NSString或String
- 删除iOS UIBarButtonItem的标题文本
- Watchkit AppIcon – 名为“AppIcon”的应用程序图标集没有任何适用的内容