Swift:在不同设备上以编程方式查找元素的大小

Swift: Finding size of element programatically on different devices

为了我的工作,我正在帮助设计一个 iOS 应用程序,所以我最近开始使用 Swift。在应用程序中,我们有三个不同的元素:一个 Google 地图元素和两个图形。我想这样做,如果你按下这些元素中的任何一个,它们将调整大小以适应屏幕,当你再次按下屏幕时,它们将恢复到原来的大小。

填满屏幕没问题,我已经成功实现了。但是,当您再次按下该元素时,该元素看起来会比原来小或大,这取决于您 运行 它在什么设备上。目前,我通过使用元素的高度和宽度属性将其最小化,并在用户按下全屏元素时将它们设置回这些属性的原始值。但是,这些似乎是硬编码的,而不是为您使用的任何设备动态创建的,这就是它无法正确恢复到原始大小的原因。

目前我的代码是这样的:

@IBAction func mapButtonClicked(sender: AnyObject) {
    if mapExpanded == false {
        mapView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
        mapButton.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
        mapExpanded = true
    } else {
        mapView.frame = CGRectMake(0, 0, oldMapWidth, oldMapHeight)
        mapButton.frame = CGRectMake(0, 0, oldMapWidth, oldMapHeight)
        mapExpanded = false
    }
}

其中 oldMapWidth = self.view.mapView.width 和 oldMapHeight = self.view.mapView.height。

我尝试过相对于屏幕调整它的大小,但这只适用于单个设备,并且在切换到不同的平板电脑时会出现同样的问题。是否有不同的属性将在编译后提供高度和宽度,以便它对于当前所在的设备是正确的?

如何保留框架,并在扩展之前设置它?这个测试代码似乎对我来说很完美:

class ViewController: UIViewController {

    @IBOutlet weak var mapView: MKMapView!
    @IBOutlet weak var mapButton: UIButton!
    var mapExpanded = false
    var oldFrame = CGRectZero

    @IBAction func mapButtonClicked(sender: UIButton) {
        if mapExpanded == false {
            // before expanding, set old
            oldFrame = mapView.frame

            mapView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
            mapButton.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
            mapExpanded = true
        } else {
            mapView.frame = oldFrame
            mapButton.frame = oldFrame
            mapExpanded = false
        }
    }
}

在我的示例中,我在 Storyboard 中使用 AutoLayout 来放置地图和按钮。我建议这样做。