gpt4 book ai didi

iOS 8 UILabel intrinsicContentSize 打破布局约束

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:02:32 26 4
gpt4 key购买 nike

我有一个相当简单的自定义 UITableViewCell 子类,其中包含一个 UISwitchUIImageViewUILabel。所有这些都是单元格 contentView 的 subview ,并使用 AutoLayout 进行布局。所有 subview 都以 Y 为中心,然后我创建了一系列左右边缘约束以水平排列它们。 UILabel 是最右边的项目,应该缩放以适应 UIImageView 的右边缘到它的左边和它的父 View 的右边缘。当文本太长放不下时,它应该被截断。当我使用适用于 iOS 7.1 的模拟器进行测试时,这按预期工作。但是,在 iOS 8.1 上,当标签中的文本太长而无法容纳分配的空间时,标签会将 UIImageView 推到其左侧的位置。我过去从未遇到过 UILabel 的这个问题。

编辑:我应该提到我在运行时没有遇到自动布局错误。

下面是截图和我的代码:

以下是 iOS 7 上的正确行为:

Working version on iOS 7.1

这是我在 iOS 8 上得到的:

Bad iOS 8.1 layout

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

self.backgroundColor = [UIColor whiteColor];
self.contentView.backgroundColor = [UIColor whiteColor];

UISwitch *filterSwitch = [[UISwitch alloc] init];
_filterSwitch = filterSwitch;
filterSwitch.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addSubview:filterSwitch];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:filterSwitch
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.contentView
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0.0]];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:filterSwitch
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.contentView
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:10.0]];

UIImageView *filterImageView = [[UIImageView alloc] init];
_filterImageView = filterImageView;
filterImageView.translatesAutoresizingMaskIntoConstraints = NO;
filterImageView.backgroundColor = [UIColor redColor];
filterImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.contentView addSubview:filterImageView];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:filterImageView
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.contentView
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0.0]];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:filterImageView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:30.0]];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:filterImageView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:filterImageView
attribute:NSLayoutAttributeHeight
multiplier:1.0
constant:0.0]];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:filterImageView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:filterSwitch
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:8.0]];

UILabel *filterLabel = [[UILabel alloc] init];
_filterLabel = filterLabel;
filterLabel.translatesAutoresizingMaskIntoConstraints = NO;
filterLabel.font = [UIFont fontWithName:@"Avenir-Medium" size:14.0];
filterLabel.textColor = [UIColor colorWithWhite:0.25 alpha:1.0];
filterLabel.textAlignment = NSTextAlignmentLeft;
filterLabel.lineBreakMode = NSLineBreakByTruncatingTail;
[self.contentView addSubview:filterLabel];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:filterLabel
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.contentView
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0.0]];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:filterLabel
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:filterImageView
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:8.0]];
[self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:filterLabel
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.contentView
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:-10.0]];

return self;
}

最佳答案

推测switch和label的水平抗压优先级是一样的。因此,布局不明确(不会自动检测到,因此在运行时不会出错)。当两者都不能适应可用宽度时,将被压缩是任意的。所以,您在 iOS 7 上只是幸运(或不幸,取决于您如何看待它)。

将标签的水平压缩阻力设置为低于其他两个 View 的水平压缩阻力,以便先压缩。

我刚刚尝试过:如果您设置相同的情况 — H:|-[switch]-[image(==30)]-[label]-| — 在 IB 的 View 中并设置标签的文本足够长,IB会告诉你歧义问题。

关于iOS 8 UILabel intrinsicContentSize 打破布局约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27908482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com