大小类iOS 7兼容性问题

时间:2015-05-05 13:41:04

标签: ios autolayout

我正在尝试使用自动布局来定位两个视图,如下图所示。我知道,对于iOS 8和大小类,我可以为不同的布局创建布局,它可以工作。不过我的目标是iOS 7,根据https://stackoverflow.com/a/26841899/4170419等几个帖子,尺寸类的iPhone横向模式不适用于早期版本。那么,如何根据我的图片将这两种观点定位在不同的方向上呢?感谢。enter image description here

2 个答案:

答案 0 :(得分:0)

紧凑宽度的紧凑高度尺寸类在iOS7上不起作用。它会在任何高度与紧凑宽度发生冲突。

非常好的总结:How can Xcode 6 adaptive UIs be backwards-compatible with iOS 7 and iOS 6?

对于您的特定情况,我认为您可能不得不求助于iOS7的一些手动工作。可能的方法是:

1)在标签区域和右侧固定到顶部,底部,标签区域之间添加一个UIView,前面和后面是尺寸为0的superview。没有内容,这应该最终为0宽度。

2)在标签区域和底部之间添加一个UIView,在顶部固定到标签区域,前导和尾随到超视图,到底部,大小为0.没有内容,这应该最终为0高度。

3)将两个视图的IBOutlets添加到控制器.h文件中。

4)在viewDidLoad中,创建MKMapView并将其放置到当前方向的相应视图中。

这样可以在启动时为您提供所需位置的地图视图。

5)向控制器添加方向更改检测。当方向发生变化时,从当前视图中移除MKMapView并将其添加到视图中以获得新方向。

不确定这会有效,但它可能会在iOS8和iOS7上用一段代码提供你想要的东西。

您可能需要为宽度/高度的视图添加约束,或者设置MKMapView框架以在布局发生时为每个方向获取正确的尺寸。

希望有人可能会提出一个更简单的解决方案,但在这种情况下,大小类似乎不太可能有所帮助。

答案 1 :(得分:0)

最后我解决了:)首先,我的两个方向都表明mapview必须与主视图的底部和右边对齐。这些约束是固定的。然后只是关闭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模拟器上进行了测试,并且它们都有效。我希望这就是问题的结束。