自动布局错误无法同时满足UIScrollView

时间:2015-09-23 02:54:22

标签: ios uiscrollview autolayout visual-format-language

我有一个显示UIImageViews的UIScrollView。 ImageViews在运行时以编程方式插入,基于用户先前保存的图像数量。我收到以下错误:

  

无法同时满足约束条件。

     

以下列表中的至少一个约束可能是一个   你不想要。试试这个:(1)看看每个约束并尝试   弄清楚你没想到的; (2)找到添加的代码   不需要的约束或约束并修复它。 (注意:如果你看到了   您不理解的NSAutoresizingMaskLayoutConstraints,请参阅   到UIView属性的文档   translatesAutoresizingMaskIntoConstraints)

"<NSLayoutConstraint:0x17029cd90 H:[UIView:0x15cd31e70]-(0)-|   (Names: '|':UIScrollView:0x15cd326b0 )>",
"<NSLayoutConstraint:0x17029d060 UIScrollView:0x15cd326b0.trailingMargin == UIView:0x15cd31e70.trailing>"

我做了基本的Autolayout事情,其中​​scrollview固定在0点的所有四边。然后我添加一个contentView作为UIScrollView的子视图(普通UIView),它也固定在0点的所有四个边。

编辑故事板约束图像

storyboard constraints on UIScrollview set to 0 on all sides to superview with Descendent constraints set to 0 to contentView

我在代码中给contentView一个宽度,如下所示:

    CGSize pagesScrollViewSize = self.scrollView.frame.size;

        NSDictionary *views     = @{ @"contentView"       :   self.contentView};

        NSDictionary *metrics   = @{ @"width"           :   @(pagesScrollViewSize.width * self.mutableArray.count) };

        NSArray *constraints;
        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[contentView(width)]-|" options:0 metrics:metrics views:views];
        [self.scrollView addConstraints:constraints];

[self loadVisiblePages];

UIImageViews是这样添加的,其中UIImageViews是根据发生到ViewController的segue时设置的页面数添加的。

-(void)loadVisiblePages{

        CGRect frame = self.scrollView.bounds;
        frame.origin.x = frame.size.width * self.page;
        frame.origin.y = 0.0f;

        ImageForArchiving *newImageObject = (ImageForArchiving*)self.mutableArray[page];
        UIImage *imageForNewPageView = newImageObject.image;

        UIImageView *newPageView = [[UIImageView alloc] initWithFrame:frame];
        [newPageView setTranslatesAutoresizingMaskIntoConstraints:YES];
         newPageView.contentMode = UIViewContentModeScaleAspectFit;
        newPageView.image = imageForNewPageView;
        [self.scrollView addSubview:newPageView];

        [self.pageViews replaceObjectAtIndex:page withObject:newPageView];
    }
}

此外,当我滚动UIScrollView时,显示的图像在旋转时会不规则地改变大小。我认为这只是上述警告的结果,而且我还没有布置UIImageViews。上述警告在这种情况下意味着什么,我该如何解决?

1 个答案:

答案 0 :(得分:2)

您似乎已将scrollView的trailingMargin固定到contentView.trailing。 将scrollView.Trailing Margin更改为scrollView.Trailing以获得此约束 选择约束后,可以在故事板中的活动检查器中执行此操作。

或者,清除contentView上的所有约束。然后在再次添加固定约束时,取消选中NSArray *constraints; constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[contentView(width)]-|" options:0 metrics:metrics views:views]; [self.scrollView addConstraints:constraints]; 并设置所有常量0。

在代码中更改此行

NSArray *constraints;
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView(width)]|" options:0 metrics:metrics views:views];
    [self.scrollView addConstraints:constraints];

用这个:

@"H:|-[contentView(width)]-|"

在可视格式中使用plot意味着将contentView固定到superView的边距,并在superView和subView之间添加8 pts的空间。在故事板约束中,您已经使用UIScrollView的Trailing和Leading边缘设置了约束,而在以编程方式添加的约束中,您使用了Trailing Margin和Leading Margin(要求contentView保持8 pt。填充)。因此,冲突。

检查可视格式语法here