iOS自动布局不显示从底部固定间隔的按钮

问题描述:

我想在距屏幕底部固定距离处显示一个按钮(下方图像中的蓝色方框)。iOS自动布局不显示从底部固定间隔的按钮

下面是约束上:

enter image description here

当运行在不同的模拟器应用程序,按钮被在不同的位置显示。看看下面的图片,看看有什么不同。

的iOS 6.1和4英寸模拟器:

enter image description here

的iOS 7和4英寸模拟器:

enter image description here

的iOS 6.1和3.5英寸模拟器:

enter image description here

的iOS 7和3.5英寸模拟器,该按钮是不是visible.i.e其origin.y比屏幕高度。

任何想法为什么发生这种情况?

编辑:编辑约束(仍无法正常工作)

enter image description here

更新:我可以缩小问题的范围。在故事板中,我在主视图中有这个按钮和其他子视图。以编程方式将mapView添加到此主视图,并将所有主视图的子视图添加到mapView,如下所示。

// Add mapView to main view 
mapView = ...; 
[self.view addSubview:self.mapView]; 

// Remove subviews from main view 
[self.button removeFromSuperview]; 
... 

// Add subviews into mapView so that they are visible on map 
[self.mapView addSubview:self.button]; 
... 

现在,如果我上面的代码注释和运行应用程序按钮,然后显示在正确的位置,但上面的代码注释掉我碰到按键错位的问题。

更新:此问题的部分答案是以编程方式添加约束。我说部分,因为我有其他意见,随着这个按钮,这是正确显示。我没有代码中的限制。因此,还有一些可以探索的地方。

+0

什么是底部对齐? – footyapps27

+0

@ footyapps27问题在按钮的'origin.y'值中,并且没有与按钮左/右对齐的视图。所有视图都在此按钮的上方或下方。 – Geek

+0

您是否正在使用X-Code 5.x进行设计? – footyapps27

您正在将按钮对齐到底部布局指南,它不同于将其对齐到超级视图的底部,在这种情况下我会建议。将其与垂直布局指南对齐取决于iOS6/7,并且如果允许视图控制器的内容位于导航栏/底部栏的下方。

将它与超级视图(容器)对齐可以解决您的问题。但解决这个问题的正确方法是设置视图控制器的正确“延伸边缘”。我假设您在iOS7上启用了“顶部条形图”和“底部条形图”,这将解释偏移量。禁用它们会比如模仿与iOS6相同的行为,并且不会以这些不同的偏移结束。

这真的取决于你的视图控制器(导航栏,底部栏等)以及如何设置视图控制器的“edgesForExtendedLayout”。

编辑: 调用 [self.button removeFromSuperview];

不会从视图中删除刚刚按钮,而且所有的约束先前设定!所以你必须再次设置约束 - 手动或避免从超级视图中移除按钮。我想这就是为什么它在界面生成器中看起来很好,并且在运行时会搞砸!

Documentation

调用此方法去除了参考你 卸下,或者是指任何视图你 删除的视图的子树中的视图中的任何约束。

+0

我已经在使用'self.edgesForExtendedLayout = UIRectEdgeNone;',并试图从superview的底部设置约束而不是底部指引,但没有奏效。 – Geek

+0

您是否有任何不明确的布局规则,或缺少您正在使用的约束?通常你可以在日志中找到一些相关信息 –

+0

另外,请比较iOS 6.1的照片和2种不同屏幕尺寸的设备。 – Geek

由于您使用X-Code 5.0.2,该xib's界面生成器便会自动为Retina 4 inch full screen默认!

尝试将Attributes Inspector更改为Retina 3.5 inch full screen

然后相应地改变你的约束。

enter image description here

尝试改变这种&看你怎么需要改变你的约束3.5 inch screen

enter image description here

+0

我已经在IB中设置了“视图为iOS 6.1和更早版本”。所以无论我看到的是3.5英寸的屏幕。 – Geek

+0

看到我的更新有问题。 – Geek

当你把你的按钮编程,那么你需要添加
自动布局约束编程以及

Apple Doc for Autolayout

Stackoverflow post

+0

我不会以编程方式添加按钮。 – Geek

+0

@Geek此代码存在于您的问题 - 它有什么作用? /从主视图删除子视图 [self.button removeFromSuperview]; ... //将子视图添加到mapView中,以便它们在地图上可见 [self.mapView addSubview:self.button]; –

+0

好的。你正在讨论添加到mapView。有没有办法复制约束,而不是以编程方式重新添加? – Geek