即使启用了自动布局,我能否以编程方式设置特定视图的框架?

Posted

技术标签:

【中文标题】即使启用了自动布局,我能否以编程方式设置特定视图的框架?【英文标题】:Can I set frame of particular view programatically even if Auto Layout is enabled? 【发布时间】:2015-04-27 07:33:52 【问题描述】:

假设我有一个视图控制器 A,里面有 5 个视图,比如标签、按钮。我已将约束设置为 4 个视图。但是,对于第 5 种观点,情况不同。在纵向中,我需要不同的 x、y 位置以及高度和宽度。在横向中,我需要不同的 x、y 位置以及高度和宽度。因此,不可能为此定义约束,因为它是自定义的。我只需要以编程方式设置框架,只要我希望我的视图以不同的方向放置。

有什么解决办法吗?

【问题讨论】:

5th_view.translatesAutoresizingMaskIntoConstraints = YES;然后设置框架。 我会写你在改变方向的方法中提到的代码。对 ?并请写一个“答案”,这样我就可以投票并接受它是否有效...... 在方向更改中编写此代码。哈哈.....不需要投票......只需尝试这段代码,让我知道它是否有效。 它就像一个魅力。因此,将来,如果客户希望将特定视图放置在自定义位置,即使将约束添加到其他视图,我也可以使用它。对吧? 很高兴它成功了。 :-) 是的,您可以使用它。快乐编码:-) :-) 【参考方案1】:

检测到orientation后,您可以使用您连接的controlIBOutlets来设置frame,例如:

[myView setFrame:CGRectMake(x,y,width,height)];

希望对你有帮助。

编辑

首先在故事板或您的 IB 中创建一个约束,然后为 ex 的该约束创建一个出口:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeightConstraint;

然后以编程方式更改此约束,例如:

self.viewHeightConstraint.constant = 40;

【讨论】:

我已经试过了。但是,由于启用了自动布局并且我为剩余的 4 个视图添加了约束,因此第 5 个视图上的帧更改(以编程方式)不起作用。 我的问题不在于如何获得设备分辨率或方向或更改框架的位置。 @Ahsan Autolayout 已启用,您需要将其转换为约束。 另一种可能是您在 xib 文件或故事板中设置约束,并以编程方式更改这些约束。查看我编辑的答案 我不想对第 5 个视图使用任何约束。我只想以编程方式根据需要更改框架...【参考方案2】:

选项 1 将此添加到您的视图控制器,并使用它来监控您的设备方向,而不是更改您的第 5 个视图框架

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator


选项 2

在 viewDidLoad 中添加

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(change:) name:UIDeviceOrientationDidChangeNotification object:nil];

然后在这个函数中你可以监控方向变化

-(void)change:(UIDeviceOrientation)orientation


在dealloc中,删除它

-(void)dealloc
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];

【讨论】:

您能给我简要介绍一下选项 1 吗?我的意思是我会用那种方法写什么?

以上是关于即使启用了自动布局,我能否以编程方式设置特定视图的框架?的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局iOS以编程方式滚动到特定页面/位置

以编程方式自动布局

如何使用自动布局以编程方式快速设置旋转时 UICollectionView 的宽度

如何以编程方式使用自动布局以编程方式添加 UIview?

如何以编程方式使用自动布局添加自定义视图

以编程方式自动布局垂直ios时出错