UIView 没有正确定位启用自动布局的故事板

Posted

技术标签:

【中文标题】UIView 没有正确定位启用自动布局的故事板【英文标题】:UIView is not positioned properly with autolayout enabled storyboard 【发布时间】:2016-11-14 08:25:31 【问题描述】:

我有一个视图控制器,该视图(.view 属性),我正在访问并更改它的框架以使用第三方库(名为 KLCPopup)显示该视图。这很好。

但问题是,如果我在情节提要中添加一个 UIButton 并且它总是出现在顶部中心位置。所以我将它从情节提要中删除并尝试以编程方式添加它,但它仍然没有出现在正确的位置。

_btnFavourite = [UIButton buttonWithType:UIButtonTypeCustom];
_btnFavourite.translatesAutoresizingMaskIntoConstraints = NO;
[_btnFavourite setImage:[UIImage imageNamed:@"favorite-not-sel"] forState:UIControlStateNormal];
[_btnFavourite setImage:[UIImage imageNamed:@"favorite-sel"] forState:UIControlStateSelected];
_btnFavourite.frame = CGRectMake((self.view.frame.size.width - (lmargin * 2.0f))/2.0f, (self.view.frame.size.height - (tmargin * 2.0f))/2.0f, 50.0f, 50.0f);
[_btnFavourite setBackgroundColor:UIColor.redColor];
[self.view addSubview:_btnFavourite];

我正在尝试将按钮框架设置在我想要的位置。但它总是被添加到不同的地方。

【问题讨论】:

这段代码在哪里调用?它不应该总是在不同的地方。 @mkeremkeskin,我在 viewDidLoad 方法中添加了这段代码。另外,尝试使用 awakeFromNib 方法。 那么您是在 viewDidLoad 中向 ViewController 的视图中添加一个按钮吗?如果是这种情况,按钮应该总是在同一个地方。您提供的信息不足以提供答案。 @mkeremkeskin,你需要知道什么?我可以在我的问题中回答它们。 【参考方案1】:

不要永远在使用自动布局时修改框架。因此,您的 .view.frame 不应被修改。

此外,在添加 UIButton(或任何可视元素)时,您不应以编程方式设置其框架,而应以编程方式添加新约束。这样一来,您就可以让 ios 处理所有事情,并且它还会自行在不同的手机/方向上调整大小! (.frame 无法处理)

现在关于您的问题,我无法真正告诉您应该添加什么作为约束,因为我不知道您希望按钮在哪里。但是我强烈建议你尽可能多地学习NSLayoutConstraint 和阅读教程。它不会丢失知识,它会派上用场很多很多次。

如果您添加有关当前视图(屏幕截图、您想要什么、您拥有什么等)和按钮(应该在哪里)的更多信息,我会告诉您要添加哪些约束。如果您尝试自己一个小时或其他时间并返回解决方案(我很乐意在此处添加)或您的最佳结果,这将是一个很好的练习,我会从那里指导您。如果我不给你答案,你会学到更多。

【讨论】:

您好 Zil,谢谢您的提示。现在我没有足够的时间学习它,我正在寻找替代品。我可以以编程方式创建 UIView(仅使用框架)并在其上添加一个按钮并可以显示它吗?它可以在自动布局环境中工作吗? 是的,你可以,它会“工作”。但就不同的手机尺寸和方向而言,这将是一场噩梦【参考方案2】:

首先,不要修改viewDidLoad上的任何view的frame(可以创建,可以添加,只是不能修改frame),此时view还没有布局,导致frame错误,而是移动到@ 987654322@或viewWillAppear

其次,如果视图已经在storyboard中创建了约束,只需将约束作为属性拖动并更改它然后调用layoutIfNeeded,不要更改框架

【讨论】:

以上是关于UIView 没有正确定位启用自动布局的故事板的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局将视图定位在 tableview 的顶部

如何在 nib 中为 UIView 应用自动布局?

如何使用自动布局故事板实现 30 个按钮网格?

通过故事板和自动布局完全使用 uiscrollview 水平滚动

故事板动态自动布局问题

如何在标题视图 iOS 中创建故事板布局多个视图?