-1

我有两个示例函数。两者都做同样的事情。区别在于变量“objectName”的类型

第一个作品。我很具体并将类型设置为 UILabel。显然,我只能将它与 UILabel 类型对象一起使用,并且为每种类型重新创建函数只是丑陋的。

func _setUILabelTop(objectName: UILabel, location: CGFloat, offset: CGFloat) {
    let originalBottom = objectName.frame.origin.y + objectName.frame.size.height
    objectName.frame.origin.y = location + offset
    objectName.frame.size.height = originalBottom - objectName.frame.origin.y
}

第二个不起作用。使用了 AnyObject 并且 XCode 在函数的第 2 行和第 3 行给了我一个错误。它突出显示带有错误的文本objectName.frame:无法分配给“CGFloat”类型的不可变表达式

func _setObjectTop(objectName: AnyObject, location: CGFloat, offset: CGFloat) {
    let originalBottom = objectName.frame.origin.y + objectName.frame.size.height
    objectName.frame.origin.y = location + offset
    objectName.frame.size.height = originalBottom - objectName.frame.origin.y
}

我的问题:

  1. 是否存在允许 UILabel、UIButton、MKMapView 的对象类型
  2. 有没有更好的方法来单独指定 Top、Bottom、Left 或 Right 属性,而无需计算宽度?

请温柔一点,我只使用 XCode 和 Swift 几天,这也是我的第一篇 StackOverflow 帖子。=)

4

1 回答 1

0

为任何对象设置顶部位置是没有意义的,因为并非所有对象都具有此属性 - 例如 a NSString. 但是,您可以通过使用UIView而不是获得所需的行为AnyObject,因为几乎(如果不是)所有UIKit控件都派生自此类。

func _setTop(forView view: UIView, location: CGFloat, offset: CGFloat) {
    let originalBottom = view.frame.origin.y + view.frame.size.height
    view.frame.origin.y = location + offset
    view.frame.size.height = originalBottom - view.frame.origin.y
}

关于计算,您可以优化originalBottom计算:

let originalBottom = view.frame.maxY
于 2017-01-02T09:45:17.840 回答