即使在添加子视图后也无法使用锚添加约束

Posted

技术标签:

【中文标题】即使在添加子视图后也无法使用锚添加约束【英文标题】:Cannot add constraints with anchors even after adding subview 【发布时间】:2018-08-16 11:00:02 【问题描述】:

我是 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”而终止应用程序,原因:“无法使用锚激活约束,因为它们没有共同的祖先。约束或其锚点是否引用不同视图层次结构中的项目?这是非法的。'

【问题讨论】:

【参考方案1】:

此时查看您的代码

[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(即您的 scrollView)的 superView(即您的 self.view)相关的约束 这是非法的

你的结构就像 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 设置。

尝试并分享结果。

希望对你有帮助。

【讨论】:

我只是在修复错误,这段代码不是我的。也许 UIView -> ScrollView -> imageView。那我接下来该怎么办?我根本不熟悉Objective-C。 :) 请检查我的编辑。这会给你的想法 完成了,但是又一个错误来了.. like -> 一个约束工厂方法被传递了一个 nil 布局锚。这是不允许的,并且可能会导致令人困惑的异常。突破 BOOL 您传递了一些 nil 值,这会导致崩溃。您是否在情节提要中为 scrollView 设置了适当的约束?或者您在代码中将滚动视图添加为子视图? 我不确定。我在情节提要中看不到 scrollView 。只有collectionView。 scrollView 在 .h 文件中声明为 @property(strong, nonatomic) 。我不知道那是什么意思。

以上是关于即使在添加子视图后也无法使用锚添加约束的主要内容,如果未能解决你的问题,请参考以下文章

无法同时满足约束 - 在添加子视图时

使用约束在 UITableViewController 中添加 UIActivityIndi​​catorView 时出错。无法使用 SnapKit 使用锚激活约束

iOS - 添加约束后无法识别触摸

如何向 StackView 的子视图内的视图添加约束

即使在添加子视图之后,视图层次结构也没有为约束做好准备

无法使用锚激活约束