我已经简化和分离了有问题的情况,这里是它应该如何工作,以及它在iOS 7中的工作原理:
该功能由一个容器视图(蓝色)和三个子视图组成:
>标签
>图像视图(具有切片,缩放图像)
>一个按钮
我添加了一个滑块,通过修改容器的宽度约束来控制容器视图的宽度.
自动布局约束将标签固定在左侧,右侧的按钮,并且图像视图被锚定到两侧而不具有宽度约束.
在iOS 8中,完全相同的设置如下所示:
请注意,图像视图(黑线)在容器视图右侧的偏移量外显示为锚定.
我已经尝试了所有的东西,我不知道为什么这在iOS 8中的行为是不同的.我已经删除并多次替换了所有的约束,但我仍然得到相同的结果.
这些是在每个子视图中设置的约束:
这些是容器视图的约束:
容器视图的宽度约束由滑块操纵,如下所示:
- (IBAction)handleSliderChange:(id)sender { self.buttonWidth.constant = self.slider.value * 1024.0; [self.containerView setNeedsLayout]; [self.containerView setNeedsUpdateConstraints]; [self.containerView layoutIfNeeded]; [self.view setNeedsLayout]; [self.view setNeedsUpdateConstraints]; [self.view layoutIfNeeded]; }
在iOS 8中出现自动布局问题的其他人似乎已经能够通过在包含的视图上直接调用setNeedsLayout和/或setNeedsUpdateConstraints来解决类似的问题,这就是为什么我在显示内容时都非常明确地调用它和根视图.我已经尝试了上述的所有组合,但似乎没有什么不同.
我开始失去寻求解决方案的希望,但是也许这里的某个人处理了类似的情况,并可以在这个问题上给出一些澄清?
编辑:我应该补充说,我也试图设置constraints from the image view to the label and button而不是与包含视图的边缘相同的结果.
编辑2:这是我试图隔离问题时使用的测试项目:Download
解决方法
您的示例项目:
UIImage *img = [UIImage imageNamed:@"pointer-dark-left"]; NSLog(@"alignmentRect: %@",NSStringFromUIEdgeInsets(img.alignmentRectInsets)); NSLog(@"capInsets: %@",NSStringFromUIEdgeInsets(img.capInsets));
此代码打印
// iOS 7 alignmentRect: {0,0} capInsets: {0,5.5,134} // iOS 8 alignmentRect: {0,65.5} capInsets: {0,134}
alignmentRectInsets.right是65.5!
作为documented,Autolayout使用对齐矩形,UIImageView使用其图像alignmentRectInsets.所以,你的self.line有65.5pt额外的宽度.
当然,你没有在对齐插件编辑器中设置对齐插件,我相信这是一个错误.
这是一个丑陋,但工作,解决方法:(
- (void)viewDidLoad { [super viewDidLoad]; self.line.image = [self.line.image imageWithAlignmentRectInsets:UIEdgeInsetsZero]; }