107

我有一个需要以编程方式操作其框架的视图 - 它是一种包含其内容的文档视图,然后通过操作框架原点围绕超级视图滚动和缩放。自动布局在运行时与此作斗争。

完全禁用自动布局似乎有点苛刻,因为它可以合理地用于处理其他视图的布局。似乎我可能想要的是某种“空约束”。

4

14 回答 14

171

我有同样的问题。但我已经解决了。
是的,您可以在运行时为特定UIView的 .

设置translatesAutoresizingMaskIntoConstraintsYES, 在设置子视图的框架之前:

self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
于 2013-03-06T08:10:04.353 回答
50

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

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

于 2012-11-28T20:02:58.700 回答
30

也许只是设置translatesAutoresizingMaskIntoConstraintsYES(而不是添加影响该视图的其他约束)可以让您设置框架而不会与自动布局系统发生冲突。

于 2012-09-21T21:02:15.440 回答
17

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

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

我在这里使用的特定应用程序在纵向和横向模式下具有不同的约束,并且我根据设备的旋转来激活/停用。这意味着我可以在界面构建器中为两个方向创建一些复杂的布局更改,并且仍然使用自动布局而没有冗长的自动布局代码。

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

于 2014-12-31T21:09:50.107 回答
9

我不知道这是否对其他人有帮助,但我写了一个类别来方便这一点,因为我发现自己经常这样做。

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];
}];

希望能帮助到你。

于 2014-07-01T02:40:42.200 回答
6

您可以在 xib/storyboard 中设置所需的 UIView 的用户定义运行时属性中的translatesAutoresizingMaskIntoConstraints类型、值是。Boolean

于 2014-03-11T18:41:39.850 回答
3

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

self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true
于 2016-01-16T06:47:45.513 回答
2
  • 在 4.5 中打开项目
  • 选择故事板
  • 打开文件检查器
  • 在界面生成器文档下取消选中“使用自动布局”

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

于 2012-07-30T22:31:48.040 回答
1

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

  1. 不要在界面生成器中布置视图或组件。

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

  3. 完毕。

于 2014-06-19T19:19:52.083 回答
1

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

于 2014-01-20T01:48:15.607 回答
0

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

我最终只是创建了一个高度缩短的子视图,并将其放入控制器的主视图中。然后我所有的内容都进入了子视图。这很容易解决了这个问题,而没有做任何违背常规的事情。

我在想,如果您想要的视图不是填充窗口的正常大小,那么您应该为此使用子视图。

于 2014-02-04T20:57:30.500 回答
0

我不会禁用自动布局,而是使用您要替换的框架计算新约束。在我看来,这似乎是合适的方式。如果您正在调整依赖于约束的组件,请相应地调整它们。

例如,如果您在两个视图(myView 和 otherView)之间的垂直约束为 0,并且您有一个平移手势或调整 myView 高度的东西,那么您可以使用调整后的值重新计算约束。

self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
[self.myView needsUpdateConstraints];
于 2015-05-26T20:56:31.157 回答
0

对于那些使用自动布局的人,请在此处查看我的解决方案。您应该制作@IBOutlet您想要调整的约束,然后更改它们的常量。

于 2015-06-06T21:56:01.647 回答
-16

如果是 xib 文件:

  1. 选择 .xib 文件
  2. 选择“文件的所有者”
  3. 显示实用程序
  4. 点击:“文件检查器”
  5. 在“界面生成器文档”下禁用:“使用自动布局”
于 2012-12-03T13:32:43.917 回答