2012-07-06 101 views
90

我有一个视图需要以编程方式操作其框架 - 这是一种文档视图,它包含其内容,然后通过操纵框架原点来滚动和放大超级视图。 Autolayout在运行时与此战斗。我可以在运行时禁用特定子视图的自动布局吗?

禁用自动布局完全显得有些苛刻,因为它可以合理地用于处理其他视图的布局。看起来我可能想要的是某种“空限制”。

回答

1
  • 在4.5
  • 选择Open Project故事情节
  • 打开文件检查
  • 在Interface Builder的文档取消选中 '使用自动布局'

可以跨多个故事板如果要拆分对某些视图使用自动布局。

+10

禁用整个故事板/笔尖的自动布局。我在寻找的是一种方式(理想的程序化),让故事板/笔尖中的特定子视图不使用自动布局,而让其他人不管故事板/笔尖指定的情况如何。 \t //初始化用于显示的storboard&细节视图控制器 UIStoryboard * SB = [UIStoryboard storyboardWithName:@“故事板”束:一个NSBundle mainBundle – terriblememory 2012-07-31 05:01:59

+0

根据需要你可以使用多个故事板,只是调用与那些/无自动布局]]; DetailViewController * dvController = [sb instantiateViewControllerWithIdentifier:entry.viewName]; – 2012-08-02 18:41:10

22

也许只设置translatesAutoresizingMaskIntoConstraintsYES(而不是增加影响这一观点额外的限制)都会让你设置帧不战而自动布局系统。

49

我有一个类似的问题,Autolayout在运行时重写了一些框架设置(我有一个动态视图,在某些情况下推动了一个新的视图控制器...按下然后按Back将重置初始视图)。

我通过将我的操作代码放在我的View Controller的viewDidLayoutSubviews中来解决这个问题。这似乎是在mojo被调用的任何约束之后被调用的,但是在viewDidAppear之前,所以用户并不聪明。

+1

不适用于self.navigationItem.titleView。仍然不尊重框架的变化。 – 2013-12-09 10:52:16

+1

如果您试图使用标题视图的框架,我会将它放在容器视图中,并将容器视图添加为navigationItem的自定义视图。 – jmstone617 2013-12-09 23:27:15

+2

这也适用于我。在发现这个解决方法之前,我浪费了2小时:22米将我的头撞向了谚语墙。 – TMc 2014-01-26 03:02:34

-14

如果是厦门国际银行文件:

  1. 选择的.xib文件
  2. 选择 “文件的所有者”
  3. 显示工具
  4. 点击: “文件检查器”
  5. 在“界面生成器文档“禁用:”使用Autolayout“
+1

不,这将禁用整个xib的自动布局。我在寻找的是从自动布局系统中只取出一个特定子视图的方法。 – terriblememory 2012-12-03 15:26:11

+0

他只想禁用一个视图的Autolayout .. – BilalReffas 2015-09-03 13:51:45

157

我有同样的问题。但我已经解决了它。
是的,您可以在运行时为特定的UIView禁用自动布局,而不是在Xcode 4.3及更高版本中默认设置的整个xib或故事板中禁用它。

设置translatesAutoresizingMaskIntoConstraintsYES,您设置子视图的帧之前:

self.exampleView.translatesAutoresizingMaskIntoConstraints = YES; 
self.exampleView.frame = CGRectMake(20, 20, 50, 50); 
+2

这看起来像一些更复杂的情况下,有很多意见矫枉过正。对于这样简单的事情来说,这是可以的。 – esh 2014-03-27 07:31:39

+0

破旧,但为我工作。 – 2014-04-06 09:30:18

+0

@MuhammadAamirALi删除子视图,然后将其添加回可能会降低性能。我们可以存档更好的解决方案吗? – 2014-10-22 03:48:25

1

对我来说,它的工作,以编程方式创建子视图,在我的情况下,自动布局与我需要一个视图搞乱围绕它的中心旋转,但一旦我以编程方式创建了这个视图,它就可以工作

0

这发生在一个没有故事板或xib文件的项目中。所有100%的代码。我在底部有一个广告横幅,并希望视图边界停在广告横幅上。加载后视图会自动调整大小。我尝试了这个页面上的所有解决方案,但没有一个能够工作

我最终创建了一个缩短高度的子视图,并将其放入控制器的主视图中。然后,我的所有内容都进入了子视图。这很容易解决了这个问题,而没有做出任何感觉就像是对谷物不利的事情。

我想如果你想要一个不是正常大小的视图,那么你应该使用子视图。

6

您可以设置translatesAutoresizingMaskIntoConstraints类型Boolean,在xib/storyboard中您想要的UIView的用户定义运行属性中输入值Yes。

0

我遇到过类似的情况,我加入了一个以自动布局启动的项目,但我需要对几个视图进行动态调整。这里有什么对我有用:

  1. 没有视图或组件在界面生成器布局。

  2. 纯粹以编程方式从alloc/init开始并适当地设置它们的框架来添加您的视图。

  3. 完成。

8

我不知道这是否会帮助其他人,但我写了一个类别来使这个方便,因为我发现自己做了很多。

的UIView + DisableAutolayoutTemporarily.h

#import <UIKit/UIKit.h> 

@interface UIView (DisableAutolayoutTemporarily) 

// the view as a parameter is a convenience so we don't have to always 
// guard against strong-reference cycles 
- (void)resizeWithBlock:(void (^)(UIView *view))block; 

@end 

的UIView + DisableAutolayoutTemporarily.m

#import "UIView+DisableAutoResizeTemporarily.h" 
@implementation UIView (DisableAutoResizeTemporarily) 

- (void)resizeWithBlock:(void (^)(UIView * view))block 
{ 
    UIView *superview = self.superview; 
    [self removeFromSuperview]; 
    [self setTranslatesAutoresizingMaskIntoConstraints:YES]; 
    __weak UIView *weakSelf = self; 
    block(weakSelf); 
    [superview addSubview:self]; 
} 

@end 

我用这样的:

[cell.argumentLabel resizeWithBlock:^(UIView *view) { 
    [view setFrame:frame]; 
}]; 

希望它能帮助。

+0

辉煌!我用你的代码的修改版本来为任何UIView编写一个简单的“hideControl”函数。它基本上将UIView的高度设置为0,但关键的是,它使用您的代码使AutoLayout正确处理(不像使用“someView.hidden = TRUE”)。因此,控件出现在隐藏控件的下方,并且垂直间距与其相关联,现在将在屏幕上向上移动以填充之前出现隐藏视图的间隙。 – 2014-12-10 14:09:16

+0

你刚刚救了我的命!万分感谢 ! – Zaphod 2015-02-15 16:13:01

15

在iOS 8中,您可以将NSLayoutConstraint设置为活动或不活动。所以,如果我使用界面生成器,我在我所有的约束添加到OutletCollection,然后激活或使用禁用:

NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad) 
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad) 

我使用它这里具有纵向和横向模式的不同限制特定的应用并根据设备的旋转启动/停用。这意味着我可以在界面构建器中为两种方向创建一些复杂的布局更改,并且仍然使用自动布局而不使用详细的自动布局代码。

或者您可以使用removeConstraints和addConstraints来激活/停用。

+0

对不起劫持这样一个老问题,但我可以问你如何设法为不同布局添加布局约束?我似乎无法在界面构建器中找到启用/禁用约束的选项。还是你只是为两个布局添加约束,并忽略了抱怨无效(重写)约束的接口生成器? – Malte 2015-03-13 08:19:09

+0

那么你可以通过使用大小类来实现:https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/SelectingASizeClass.html#//apple_ref/doc/uid/TP40014436-CH7-SW1 ,但是我不能这样做,因为我也支持iOS 7,而且大小类不完全支持iOS 7.我通过降低冲突约束的优先级来做到这一点。不理想,但它阻止了警告。无论如何,我认为这是我做到的。 – bandejapaisa 2015-03-13 11:34:48

0

而不是禁用自动布局,我只是用你正在替换的帧计算新的约束。这在我看来是合适的方式。如果您正在调整依赖于约束的组件,请相应地调整它们。例如,如果两个视图(myView和otherView)之间的垂直约束为0,并且您有平移手势或调整myView高度的东西,则可以使用调整后的值重新计算约束。

self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height); 
[self.myView needsUpdateConstraints]; 
0

对于那些使用自动布局的人,请查看我的解决方案here。你应该使@IBOutlet的约束你想调整,然后改变它们的常量。

-1

在我看来,我有一个标签和一个文本。标签有平底锅手势。标签在拖动过程中很好地移动。但是,当我使用文本框键盘时,标签将其位置重置为在自动布局中定义的原始位置。当我迅速为标签添加以下内容时问题得到解决。我在viewWillAppear中添加了它,但它可以添加到您有权访问目标字段的任何位置。

self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true 
相关问题