首页 > 解决方案 > 即使在添加子视图后也无法使用锚添加约束

问题描述

我是 iOS 新手。这是我的代码导致错误。

FSImageView *imageView = [_imageViews objectAtIndex:(NSUInteger) page];
if ((NSNull *) imageView == [NSNull null]) {
        imageView = [self dequeueImageView];
        if (imageView != nil) {
            [_imageViews exchangeObjectAtIndex:(NSUInteger) imageView.tag withObjectAtIndex:(NSUInteger) page];
            imageView = [_imageViews objectAtIndex:(NSUInteger) page];
        }
    }

    if (imageView == nil || (NSNull *) imageView == [NSNull null]) {
        imageView = [[FSImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, _scrollView.bounds.size.width, _scrollView.bounds.size.height)];
        UIColor *backgroundColor = barsHidden ? _backgroundColorHidden : _backgroundColorVisible;
        [imageView changeBackgroundColor:backgroundColor];
        [_imageViews replaceObjectAtIndex:(NSUInteger) page withObject:imageView];
    }

    imageView.useScaleFactor = self.useScaleFactor;
    imageView.image = _imageSource[page];
if (imageView.superview == nil) {
        [_scrollView addSubview:imageView];

        if (@available(iOS 11.0, *)) {
            [imageView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor
                                                constant:0.0].active = YES;
            [imageView.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor
                                                   constant:0.0].active = YES;
        } else {
            // Fallback on earlier versions
        }
    }

异常发生在 Anchor 的东西上。它说..

由于未捕获的异常“NSGenericException”而终止应用程序,原因:“无法使用锚激活约束,因为它们没有共同的祖先。约束或其锚点是否引用不同视图层次结构中的项目?这是非法的。

标签: iosnslayoutconstraint

解决方案


此时查看您的代码

[imageView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor
                                            constant:0.0].active = YES;
[imageView.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor
                                               constant:0.0].active = YES;

您正在尝试激活关于 superView(即您的 self.view)的 superView(即您的 scrollView)的约束这是非法的

你的结构就像 UIView -> ScrollView -> imageView。并且您正在从 UIView 设置锚点,您应该尝试相对于 ScrollView 设置它。

编辑

你应该试试这个:

[imageView.topAnchor constraintEqualToAnchor:_scrollView.topAnchor
                                                constant:0.0].active = YES;
[imageView.bottomAnchor constraintEqualToAnchor:_scrollView.bottomAnchor
                                                   constant:0.0].active = YES;

此外,为.leftAnchor 和 .rightAnchor 设置。

编辑

[_scrolLView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor
                                                constant:0.0].active = YES;
[_scrolLView.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor
                                                   constant:0.0].active = YES;

此外,为.leftAnchor 和 .rightAnchor 设置。

尝试并分享结果。

希望能帮助到你。


推荐阅读