我有一个UIImageView
嵌入UIView
。 我的整个应用程序使用AutoLayout
,但我想删除constraints
为UIImageView
。 Xcode
不会让我删除的constraints
,有没有方法来禁用这些特定对象,其设置为0,什么?
Answer 1:
我同意的Xcode自动布局是可怕的,如果你想要的东西,特别是使用...
我用它来编程消除制约因素:
[detailsPhotoView removeConstraints:detailsPhotoView.constraints];
Answer 2:
在Xcode 5中,而编辑约束“在构建时删除”选项。 如果启用约束会自动在运行时被删除。 该选项也可把Interface Builder的高兴,如果你不想特别限制。
Answer 3:
这里有两个不同的问题:
- 如何使用Xcode的设置没有限制一个UIImageView
- 如何既允许的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];