删除特定对象自动布局限制(Remove Auto-Layout Constraints for Sp

2019-07-03 20:38发布

我有一个UIImageView嵌入UIView 。 我的整个应用程序使用AutoLayout ,但我想删除constraintsUIImageViewXcode不会让我删除的constraints ,有没有方法来禁用这些特定对象,其设置为0,什么?

Answer 1:

我同意的Xcode自动布局是可怕的,如果你想要的东西,特别是使用...

我用它来编程消除制约因素:

[detailsPhotoView removeConstraints:detailsPhotoView.constraints];


Answer 2:

在Xcode 5中,而编辑约束“在构建时删除”选项。 如果启用约束会自动在运行时被删除。 该选项也可把Interface Builder的高兴,如果你不想特别限制。



Answer 3:

这里有两个不同的问题:

  1. 如何使用Xcode的设置没有限制一个UIImageView
  2. 如何既允许的UIImageView被摇镜和/或调整时,其布局是由限制处理。

关于(1),jturton是正确的。 只要您启用了在Xcode自动布局时,Xcode将保证/需要有足够的约束来唯一确定您的视图的大小和位置。

如果你还没有手动指定足够的约束在Xcode(通过出现在布局检查蓝色的“用户限制”),然后Xcode中会增加新的约束,它猜测(其显示为紫色),直到有足够的约束,以确定布局。

如果UIImageView的有上没有限制,其布局将无法确定,所以你不能设置了在Xcode。 为了解决这个问题,你应该做的是使用Xcode中设置IBOutlets所有要删除的约束,然后在你的UIView的awakeFromNib:或者在UIViewController的viewDidLoad:您可以通过调用removeConstraints手动删除的约束:。

不过,现在您的UIImageView的布局是欠定。 所以在这一点上,你将要手动添加新的限制,这将让您移动和调整的UIImageView,这给我们带来(2)质疑。

关于(2),如何调整与移动其布局由约束确定,答案是设置手势识别照常以检测夹紧&平移手势的视图,但不是那些手势识别主叫SETFRAME:修改的视图,它们应该修改constant一个NSLayoutConstraint其确定的UIImageView的帧的参数,然后调用layoutIfNeeded :,这将导致布局系统到该修改的约束立即转化为一个新的帧。

所以,举例来说,假设你想操纵一组布局约束非常相似,熟悉SETFRAME的UIImageView的:来电。 在这种情况下,通过Xcode中删除这些约束,设置完成后,您可以添加约束来指定它的宽度,高度和从顶部它的空间,离开了上海华的看法。 那么对于您的移动手势识别操作处理程序,只会更新起搏器手势识别的不变参数,你捏手势识别可能只是更新的高度和宽度限制的恒定参数。

另一种方式做到(2),这是在引擎盖下的相同,但可能是在实践中更容易,是设置translatesAutoresizingMaskIntoConstraints=YES 。 这将做两件事情。 这将导致自动布局系统自动生成基于视图的autoresizingMask在视图的上海华约束。 二 - 关键! - 这将导致布局系统自动转换成SETFRAME电话:进入这些制约因素的修改。



Answer 4:

不能没有约束的-你必须到位,以明确大小和位置,每个视图足够的约束

可以创建奠定了使用自动布局可调整大小的视图。

例如,你的情况,你可以创建定位的限制 - 比如,水平和垂直针摄像画面的中心,它的父的中心。

你也可以创建一个大小的限制,水平和垂直方向。 见我的答案在这里对如何做到这一点。 创造出口到这两个约束(如果使用界面生成器)。 你可以有一个特定数目的高度和宽度的限制,或使用乘法器,使一个固定的高宽比。

为了应对捏的手势,你可以调整.constant两个尺寸限制属性,并调用setNeedsLayout 。 这将重新调整,同时又保持其中心固定图像视图。

如果这样做上面的固定纵横比建议,调整使用约束的图实际上比设置框要简单得多。



Answer 5:

您可以拨打

[yourElement removeFromSuperview];

然后调用

[yourSuperview addSubview:yourElement];

以去除所有约束yourElement并将其重新添加到视图。

值得一提的是,如果你正在做上述上像一个UIView类或扩展,你需要从上海华盈之前取出保存到视图的上海华盈参考:

var theSuperview = self.superview
self.removeFromSuperview()
theSuperview?.addSubview(self)

您可能还需要做出yourElement强,而不是弱,因为从上海华去除可能导致你的引用失去它。



Answer 6:

如果你只是想从层次结构中删除一个视图,只需调用[theView removeFromSuperview] 任何影响它的限制也将被删除。

但是,有时你可能也想提出一个观点回来,已经暂时删除它。

要做到这一点,我使用下列类别UIView 。 它从视图视图层次走过v一些最终容器视图c (通常是您的视图控制器的根视图)和删除来说是外部约束v 。 这些是兄妹约束v ,而不是限制仅影响v的孩子。 您可以隐藏v

-(NSArray*) stealExternalConstraintsUpToView: (UIView*) superview
{
    NSMutableArray *const constraints = [NSMutableArray new];

    UIView *searchView = self;
    while(searchView.superview && searchView!= superview)
    {
        searchView = searchView.superview;

        NSArray *const affectingConstraints =
        [searchView.constraints filteredArrayUsingPredicate:
         [NSPredicate predicateWithBlock:^BOOL(NSLayoutConstraint *constraint, NSDictionary *bindings)
          {
              return constraint.firstItem == self || constraint.secondItem == self;
          }]];

        [searchView removeConstraints: affectingConstraints];
        [constraints addObjectsFromArray: affectingConstraints];
    }

    return constraints;
}

该方法传回阵列中的,你可以保留的地方,这样以后你可以添加约束回删除的约束。

使用它有点像这样...

NSArray *const removedConstraints = [viewToHide stealExternalConstraintsUpToView: self.view];
[viewToHide setHidden: YES];

,后来,把约束回来。

由于iOS的8你不需要去想其中的约束应放在。 只要使用此...

[NSLayoutConstraint activateConstraints: removedConstraints];
[viewToHide setHidden: NO];

与早期版本的iOS你不需要费尽心思在哪里约束加回。 然后扔在控制器的self.view 。 提供约束是在所有他们的影响,他们将工作意见上海华。

[self.view addConstraints: removedConstraints];
[viewToHide setHidden: NO];


文章来源: Remove Auto-Layout Constraints for Specific Object