当前位置: 首页 > 知识库问答 >
问题:

删除影响UIView的所有约束

缑修齐
2023-03-14

我有一个UIView,它通过几个约束被放置在屏幕上。一些约束由superview拥有,另一些约束由其他祖先拥有(例如,可能是UIViewController的view属性)。

[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];

要澄清这些解决方案的问题,请考虑以下视图层次结构:

  • 爷爷
    • 父亲
        • 儿子
        • 女儿

        现在假设我们创建了以下约束,并始终将它们附加到它们最近的共同祖先:

          null

共有1个答案

姬天宇
2023-03-14

这种方法对我有效:

@interface UIView (RemoveConstraints)

- (void)removeAllConstraints;

@end


@implementation UIView (RemoveConstraints)

- (void)removeAllConstraints
{
    UIView *superview = self.superview;
    while (superview != nil) {
        for (NSLayoutConstraint *c in superview.constraints) {
            if (c.firstItem == self || c.secondItem == self) {
                [superview removeConstraint:c];
            }
        }
        superview = superview.superview;
    }

    [self removeConstraints:self.constraints];
    self.translatesAutoresizingMaskIntoConstraints = YES;
}

@end

在执行完之后,视图仍然保持原样,因为它创建了自动调整大小的约束。当我不这样做时,视图通常会消失。此外,它不仅从superview中删除约束,还会遍历所有的约束,因为在祖先视图中可能会有影响它的约束。

extension UIView {
    
    public func removeAllConstraints() {
        var _superview = self.superview
        
        while let superview = _superview {
            for constraint in superview.constraints {
                
                if let first = constraint.firstItem as? UIView, first == self {
                    superview.removeConstraint(constraint)
                }
                
                if let second = constraint.secondItem as? UIView, second == self {
                    superview.removeConstraint(constraint)
                }
            }
            
            _superview = superview.superview
        }
        
        self.removeConstraints(self.constraints)
        self.translatesAutoresizingMaskIntoConstraints = true
    }
}
 类似资料:
  • 我有一个UIImageView,我想在背景上用平移效果慢慢动画。我的背景图像视图有四个约束: 从顶部到顶部布局指南的距离(零) 图像视图的视图模式设置为“纵横比填充”。当我运行我的应用程序时,没有问题,会显示静态图像。我添加以下代码来设置视图的动画: 然后我调用[self-AnimateBackground Horizontal:YES] 视图将显示:。发生的情况如下: 图像从一个意外(但始终相同

  • 在Sybase ASE中完全删除数据库中的所有表而不删除数据库的最佳方法是什么?我一直在使用一个脚本:从这个问题开始,由于引用完整性,我试图删除数据库中的所有表时出错。 在MySQL中,我可以使用 有没有办法在Sybase ASE中实现这一点,或者可以扩展上面的脚本来循环约束?

  • 问题内容: 在我们的Selenium自动化测试中,我们隐式和显式等待。按照JimEvan的想法,不要混为一谈。因此计划删除隐式等待。 对于我们的测试,每当我们与元素交互时,我们都会使用ignoring显式等待其可见,可点击等。这就是为什么我不认为它会立即抛出。 这样可以确保删除隐式等待不会影响我的测试。除此之外,我想知道它是否有可能破坏测试。根据您的经验,我想了解它的影响,因此要求在此分享您的观点

  • 问题内容: 我编写了Swift代码,试图从给定的自定义UIView类型的所有子视图中删除所有手势识别器。 但是该行会产生编译器错误: 我尝试将循环更改为,但这会产生编译器错误: 我看到UIView的方法return,并且我认为双重包装的返回值使我感到震惊。谁能帮我? 更新:修改后的编译代码为: 问题答案: iOS 11更新 通常,通过循环遍历视图数组来删除视图中的 所有 手势识别是(而且一直是)一

  • 我注意到在每次Nutch抓取过程中,发送到Solr的索引不一致。有时会显示网页的最新更改,有时会显示较旧的更改。 原因 注意到Nutch将旧段的索引提供给Solr。 当前解决方案 在获取之前删除所有旧段,似乎解决了问题。 问题 想知道这种方法是否有任何含义,或者我对此的理解是不正确的。还想知道为什么Nutch在爬行过程中不会自动删除旧段。 谢谢。

  • 我目前正在尝试创建一个数独求解器,并在将一些可能的值分配给尚未全神贯注的框的步骤中。(关于我为什么要这样做的背景信息:数独是一个基于9x9网格的数字游戏,它的上下文规则允许网格中某些未全神贯注的框在求解过程中保存可能的值) 为此,我创建了一个结构,将其定义为二维,并使用for循环用预定义的整数列表填充它。 现在,当我试图从二维结构中某个特定项的列表中删除一个整数时,我发现该结构中所有项的列表都删除