gpt4 book ai didi

iOS 8 自动布局、VFL 和边距等于或大于

转载 作者:技术小花猫 更新时间:2023-10-29 11:05:16 27 4
gpt4 key购买 nike

我在 iOS 8 上的 VFL 中遇到了约束问题,而在 6 和 7 上一切正常。这是约束条件:

H:|-margin-[_imageView]-(=>margin)-[_label]-margin-|

_imageView__label 都获得了正确的固有宽度,并且边距按预期增长。我要实现

|-[_imageView]-------------------------------[some text]-|

|-[_imageView]---------------------------[a larger text]-|

|-[_imageView]-----------------------[a very large text]-|

|-[_imageView]-[a very very very very very very larg...]-|

它在视觉上是可以的,但它引发了一个破坏约束的异常:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7b856ee0 H:[UIImageView:0x7b8ef1f0]-(>=12)-[UILabel:0x7b8e7c60'Test']>

打印_autolayoutTrace后没有歧义。

但是,如果约束只涉及标签,则完全没有问题:

H:|-margin-[_label1]-(=>margin)-[_label2]-margin-|

问题可以通过以下步骤解决:

更改约束删除 >= 并添加优先级:

H:|-margin-[_imageView]-(margin@750)-[_label]-margin-|

设置_imageView 的拥抱优先级

[_imageView setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];

设置_label的压缩阻力

[_label setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];

有了这些规则,在任何平台上都没有问题。所有这些在 iOS 8 上都是必需的吗?是错误还是我做错了?

谢谢。

最佳答案

我从头开始项目,这是我的代码(实际上工作正常):

UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
topView.backgroundColor = [UIColor redColor];
topView.translatesAutoresizingMaskIntoConstraints = NO;

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 40, 160)];
imageView.backgroundColor = [UIColor greenColor];
imageView.translatesAutoresizingMaskIntoConstraints = NO;
[topView addSubview:imageView];

self.label = [[UILabel alloc] initWithFrame:CGRectMake(80, 80, 200, 32)];
self.label.backgroundColor = [UIColor yellowColor];
self.label.text = @"some text";
self.label.translatesAutoresizingMaskIntoConstraints = NO;
[topView addSubview:self.label];


self.tableView.tableHeaderView = topView;

NSDictionary *views = @{@"imageView":imageView, @"label":self.label};

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-margin-[imageView(40)]-(>=margin)-[label]-margin-|" options:0 metrics:@{@"margin": @30} views:views];
NSArray *imageConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[imageView(160)]-20-|" options:0 metrics:nil views:views];
NSArray *textConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[label]" options:0 metrics:nil views:views];
NSArray *topConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[topView(320)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(topView)];

[topView addConstraints:constraints];
[topView addConstraints:imageConstraints];
[topView addConstraints:textConstraints];
[topView addConstraints:topConstraints];

我认为您的主要问题是您没有关闭生成 UIView-Encapsulated-LayouttranslatesAutoresizingMaskIntoConstraints(我在 iOs8 之前从未遇到过)。我还没有找到一个很好记录的地方,但有很多关于该约束的问题。

我还创建了 github 存储库,因此您可以自己尝试:https://github.com/Nikita2k/constraintsTest

此外,您还可以观看 WWDC2014 视频 - 表格和 Collection View 的新增功能(约 20 分钟)。有一些信息,您现在可以看到 UIView-Encapsulated-Layout 问题,但稍后会修复。此外,您可以尝试使用 rowHeight 作为 Storyboard(或 xib)中的所有 ios8 tableViews 应该明确设置

self.tableView.rowHeight = UITableViewAutomaticDimension

我不确定,它对这种特殊情况是否有帮助,但也请尝试一下!

关于iOS 8 自动布局、VFL 和边距等于或大于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25786532/

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