我试图使用自动布局来定位两个视图,如下面的图片。我知道,使用iOS 8和size类,我可以为不同的布局创建布局,而且它可以工作。然而,我的目标是iOS 7,并且根据https://stackoverflow.com/a/26841899/4170419等几个帖子,规模类的iPhone景观模式不会适用于早期版本。那么,如何根据我的图片在不同的方向上定位这两种观点呢?谢谢。

发布于 2015-05-05 14:28:51
紧凑宽度紧凑型高度大小类不会在iOS7上工作。它将与紧凑的宽度,任何高度可悲地冲突。
很好的总结:How can Xcode 6 adaptive UIs be backwards-compatible with iOS 7 and iOS 6?
对于您的特殊情况,我认为您可能不得不为iOS7使用一些手工工作。一种可能的办法是:
1)在标签区域和右手边之间添加一个UIView,将其固定在顶部、底部、标签区域的引导和尾随到大小为0的superview。如果没有内容,这应该是0宽度。
2)在标签区域和底部之间添加一个UIView,将顶部固定在标签区域,引导和尾随到superview,并以大小为0的底部。如果没有任何内容,这应该会以0高度结束。
3)将两个视图的IBOutlets添加到控制器.h文件中。
4)在viewDidLoad中,创建MKMapView并将其放置到当前方向的适当视图中。
这使您在启动时,地图视图在您想要的位置。
5)在控制器中添加方向变化检测。当方向改变时,将MKMapView从其当前视图中移除,并将其添加到新方向的视图中。
不确定这是否有效,但它可能为您提供在iOS8和iOS7上使用一段代码所需的内容。
您可能需要为视图的宽度/高度添加约束,或者设置MKMapView框架,以便在布局发生时为每个方向获得正确的维度。
希望有人能想出一个更简单的解决方案,但在这种情况下,size类似乎不太可能有所帮助。
发布于 2015-05-07 21:52:14
最后,我解决了这个问题:)首先,我的两个方向都表明,地图视图必须与主视图的底部和右边对齐。这些约束是固定的。然后,为了关闭Xcode,我设置了纵向定向的约束。
由于iPad有足够的屏幕状态,所以我只对iPhone应用了旋转修复。我相信它可以写得更好,所以如果你有任何意见,请分享。谢谢。
lazy var landscapeLeft: NSLayoutConstraint = {
return NSLayoutConstraint(item: self.myMap, attribute: .Leading, relatedBy: .Equal, toItem: self.idLabel, attribute: .CenterX, multiplier: 1.0, constant: 0)
}()
lazy var landscapeTop: NSLayoutConstraint = {
return NSLayoutConstraint(item: self.myMap, attribute: .Top, relatedBy: .Equal, toItem: self.idLabel, attribute: .Bottom, multiplier: 1.0, constant: 8)
}()
lazy var portraitLeft: NSLayoutConstraint = {
return NSLayoutConstraint(item: self.myMap, attribute: .Leading, relatedBy: .Equal, toItem: self.view, attribute: .Leading, multiplier: 1.0, constant: 8)
}()
lazy var portraitBottom: NSLayoutConstraint = {
return NSLayoutConstraint(item: self.myMap, attribute: .Top, relatedBy: .Equal, toItem: self.expectedDateLabel, attribute: .Bottom, multiplier: 1.0, constant: 8)
}()
func fixLayout() {
if (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Phone) && (UIDevice.currentDevice().orientation.isLandscape) {
self.view.removeConstraint(portraitLeft)
self.view.removeConstraint(portraitBottom)
self.view.addConstraint(landscapeLeft)
self.view.addConstraint(landscapeTop)
} else {
self.view.removeConstraint(landscapeLeft)
self.view.removeConstraint(landscapeTop)
self.view.addConstraint(portraitLeft)
self.view.addConstraint(portraitBottom)
}
}
override func updateViewConstraints() {
super.updateViewConstraints()
fixLayout()
}更新:我太天真了,认为我以前写的代码与iOS 7兼容,仅仅是因为它编译到了ios 7目标上,并且在iOS 8模拟器上工作。多亏@Rory McKinnel,我发现我使用的方法在iOS 7中是不可用的。这一次,我在iOS 7和iOS 8模拟器上进行了测试,它们都能工作。我希望这是这个问题的结束。
https://stackoverflow.com/questions/30054685
复制相似问题