删除特定对象的自动布局约束

Eri*_*ric 50 iphone uiview uiimageview autolayout

我有一个UIImageView嵌入式UIView.我的整个应用程序使用AutoLayout,但我想删除constraintsUIImageView.Xcode不会允许我删除constraints,有没有办法为特定对象禁用它们,将它们设置为零,什么?

Tho*_*aux 89

我同意如果你想要特别的东西,Xcode自动布局是非常糟糕的...

我用什么来编程删除约束:

[detailsPhotoView removeConstraints:detailsPhotoView.constraints];
Run Code Online (Sandbox Code Playgroud)


小智 25

在XCode 5中,编辑约束时可以选择"在构建时删除".如果启用此选项,则会在运行时自动删除约束.如果您不需要特定约束,可以选择使Interface Builder保持满意.


alg*_*gal 8

这里有两个不同的问题:

  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确定UIImageView框架的NSLayoutConstraint 的参数,然后调用layoutIfNeeded:,这将使布局系统立即将修改后的约束转换为新框架.

因此,例如,假设您想要使用一组与熟悉的setFrame:调用非常相似的布局约束来操作UIImageView.在这种情况下,在通过Xcode删除约束设置之后,您可以向视图添加约束,从约束的顶部和左侧指定其宽度,高度和空间.然后,您的平移手势识别器的动作处理程序将只更新起搏器手势识别器的常量参数,并且您的捏合手势识别器可以只更新高度和宽度约束的常量参数.

做(2)的另一种方法是在引擎盖下但在实践中可能更容易设置translatesAutoresizingMaskIntoConstraints=YES.这将做两件事.它将使自动布局系统根据视图的autoresizingMask在视图的超级视图中自动生成约束.第二 - 至关重要! - 它将使布局系统自动将对setFrame的调用转换为对这些约束的修改.

  • 有一个关于删除约束的PITA:您需要从"托管"它的视图中删除约束.例如,如果你有滚动视图内的图像视图和它们之间的约束,那么它就是托管它的滚动.约束不会出现在图像视图的`constraints`属性中,在图像视图上调用`removeConstraint:`将被静默忽略,并且无法从约束本身获取主机视图.因此,你必须有滚动视图和约束的出口,并特别调用`[self.scrollView removeConstraint:self.constraint]`.哎呀! (2认同)

jrt*_*ton 6

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

可以创建使用Autolayout布局的可调整大小的视图.

例如,在您的情况下,您可以创建定位约束 - 例如,将图像视图的中心水平和垂直地固定在其超视图的中心.

您还可以水平和垂直创建大小约束.请参阅我的答案,了解如何执行此操作.为这两个约束创建出口(如果使用接口构建器).您可以具有特定数字的高度和宽度约束,或使用乘数来设置固定的宽高比.

响应捏合手势,您可以调整.constant两个大小约束的属性,并调用setNeedsLayout.这将调整图像视图的大小,同时保持其中心固定.

如果您执行上面的固定宽高比建议,则使用约束调整视图大小实际上比设置框架简单得多.


Ada*_*hns 5

你可以打电话

[yourElement removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)

然后打电话

[yourSuperview addSubview:yourElement];
Run Code Online (Sandbox Code Playgroud)

从中删除所有约束yourElement并将其添加回视图.

值得一提的是,如果您在UIView类别或扩展名之类的内容上执行上述操作,则需要在从superview中删除之前保存对视图的superview的引用:

var theSuperview = self.superview
self.removeFromSuperview()
theSuperview?.addSubview(self)
Run Code Online (Sandbox Code Playgroud)

您可能还需要使yourElement变强而不是弱,因为从superview中删除可能会导致您丢失对它的引用.