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 来放置地图和按钮。我建议这样做。
为了我的工作,我正在帮助设计一个 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 来放置地图和按钮。我建议这样做。