繁体   English   中英

iOS 8 UITableView插图:如果你有自定义布局的单元格,你可能也会遇到这个问题

[英]iOS 8 UITableView inset: if you have cells with custom layout, you'll probably have this issue too

在iOS 8上,对于较大的设备,默认的tableView inset似乎发生了变化。 如果您正在布置自定义单元格并将其左侧布局约束与单元格的默认大小15插入匹配,则您的布局在较小的设备上看起来会很好,但在插入更改的较大设备上,您将获得类似于以下内容的内容:



TableViewCell分隔符插入对齐



我怎样才能解决这个问题?

Xcode6中没有选项/属性来修复它。 有一个setter方法setSepratorInset用于设置插入值。 但是我们不能将(-ve)值传递给<#CGFloat left#>从左边开始。 因为它的最小值始终为0。

[tableView setSeparatorInset:UIEdgeInsetsMake(<#CGFloat top#T, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)];

如果你想解决这个问题,那么隐藏分隔线并添加一个带有所需宽度的1px的imageView来创建一条线并将其添加到单元格中,并且在每个设备上也看起来相同。

管理写一些似乎运作良好的东西。 如果有更漂亮的解决方案,请分享。

@interface InsetRespectingTableViewCell()

@property (nonatomic) IBOutlet NSLayoutConstraint * leftContentInset;
@property (nonatomic) IBOutlet NSLayoutConstraint * rightContentInset;

@end

@implementation InsetRespectingTableViewCell


- (UITableView *)tableView {

    UIView *view;
    for (view = self.superview; ![view isKindOfClass:UITableView.class] && view; view = view.superview);
    return (UITableView *)view;

}

- (void)updateInset {

    CGFloat defaultInset = [self tableView].separatorInset.left;
    self.leftContentInset.constant = defaultInset;
    self.rightContentInset.constant = defaultInset;

}

- (void)didMoveToSuperview {

    [super didMoveToSuperview];
    [self updateInset];

}

只要我坚持使用iOS 8,我就可以使用大小限制来匹配iPhone 6+以外的所有内容。修复iOS 8上的外观在iOS 7上打破了它。我使用的基本方法是设置对于“Regular Width | Any Height”的约束不同,并使用13 px而不是7 px的insets:

  1. 使用具有+/- 7 px空间的自动布局将视图布局到超级容器。
  2. 从左侧列表中选择布局约束
  3. 在最右侧的属性编辑器中,单击常量旁边的(+),然后从弹出窗口中选择“Regular Width | Any Height”。 这将在Constant下添加一个新行。
  4. 将值从7更改为13。

它不是一个完整的解决方案,但它是一个开始。

注意 - 如果你需要添加一个真正的像素行 ,不要愚弄图像,请使用:

@interface UILine : UIView
@end

@implementation UILine

-(void)awakeFromNib
    {
    float sortaPixel = 1.0/[UIScreen mainScreen].scale;

    // float sortaPixel = 1.0/self.contentScaleFactor;
    // -- recall, that does NOT work when loading from storyboard!

    UIView *line = [[UIView alloc] initWithFrame:
    CGRectMake(0, 0, self.frame.size.width, sortaPixel)];

    line.userInteractionEnabled = NO;
    line.backgroundColor = self.backgroundColor;

    line.autoresizingMask = UIViewAutoresizingFlexibleWidth;

    [self addSubview:line];

    self.backgroundColor = [UIColor clearColor];
    self.userInteractionEnabled = NO;
    }

@end

如何在故事板中使用 ,只需制作一个确切位置的UIView,以及您想要的精确宽度。 (当然,使其伸展到宽度,或任何必要的。)

只需将视图 - 例如 - 5 pr 6像素高 - 纯粹让你可以正确看到它。 (在故事板上制作它有多高并不重要。)

(将UIView的顶部准确地放在您想要单像素线的位置。)

使UIView成为你想要的任何颜色,可能是黑色。

将班级更改为UILine。 在运行时,它将在所有设备上的确切位置绘制完美的单像素线。

希望它能以一种小的方式帮助解决这个问题。

这很有趣。

在由Xcode5创建的项目中,分隔符的左侧插入是15/15/16(iPhone5s / iPhone6 / iPhone6P)。

在Xcode6创建的项目中是16/16/20(iPhone5s / iPhone6 / iPhone6P)。

在我的例子中,我禁用了tableView中的默认分隔符,并创建了一个baseCell来重绘separatorLine。

链接: https//github.com/jshl8612/UTableViewBaseCell

希望它有点帮助。

以下是如何修复它的想法。

@IBOutlet weak var leftViewLeadingConstraint: NSLayoutConstraint!

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    switch UIScreen.mainScreen().scale {
    case 2:
        leftViewLeadingConstraint.constant = 7.0
    case 3:
        leftViewLeadingConstraint.constant = 11.0
    default:
        assertionFailure("Error: wrong scale value")
    }
}

在自定义单元格中,您可以覆盖layoutSubviews并指定所需的插图。

来自: https//developer.apple.com/library/IOs/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instm/UIView/layoutSubviews

“只有当子视图的自动调整和基于约束的行为不能提供您想要的行为时,才应覆盖此方法”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM