CGRect未应用

时间:2017-08-19 16:15:31

标签: ios swift frame cgrect

我的代码运行,但问题是tab图像没有重新定位到我在代码中设置的位置。它停留在viewController的所在位置,并没有变得更大或更动人。我试图让它更大。

@IBOutlet weak var tab: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

if UIDevice.current.model == "iPhone4,1" {

        tab.frame = CGRect(x: 130, y: 122, width: 60, height: 60)

    } else if UIDevice.current.model == "iPhone5,1"  {
        tab.frame = CGRect(x: 130, y: 171, width: 75, height: 75)

    }
}

2 个答案:

答案 0 :(得分:0)

如果条件都将为false,因此代码永远不会被执行,这是因为 UIDevice.current.model 将返回" iPhone& #34; " iPod touch" " iPad" 而非硬件型号。正确的方法是:

override func viewDidLoad() {
    super.viewDidLoad()

    var systemInfo = utsname()
    uname(&systemInfo)

    // Retrive the device model
    let model = Mirror(reflecting: systemInfo.machine).children.reduce("") { model, element in
        guard let value = element.value as? Int8, value != 0 else { return model }
        return model + String(UnicodeScalar(UInt8(value)))
    }

    if model == "iPhone4,1" {
        tab.frame = CGRect(x: 130, y: 122, width: 60, height: 60)
    } else if model == "iPhone5,1"  {
        tab.frame = CGRect(x: 130, y: 171, width: 75, height: 75)   
    }
}
  

但此代码只能在 iPhone 4s GSM iPhone 5 上运行   不能在其他设备上运行,例如: CDMA iPhone 5 iPhone 6 或任何其他设备   其他型号包括iPad。

相反,更强大的方法是检查屏幕尺寸,iPhone 4s和更低型号的屏幕尺寸 320x480 点,iPhone 5的屏幕尺寸 320x568 点,其他设备有更大的屏幕尺寸。

我们将定位特定尺寸,而不是定位某个设备。因此,如果屏幕高度大于 480 点,我们在第一个if块内部运行代码,否则我们在第二个块上运行代码,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()

    if UIScreen.main.bounds.size.height > 480 {
        tab.frame = CGRect(x: 130, y: 122, width: 60, height: 60)
    } else {
        tab.frame = CGRect(x: 130, y: 171, width: 75, height: 75)
    }
}

但请记住,这是一种非常糟糕的做法,您应该使用Auto Layout代替。

答案 1 :(得分:0)

尝试以下方法:

extension UIDevice {
    var modelName: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }
        return identifier
    }
}

然后在你的代码调用中:

if UIDevice.current.modelName == "iPhone4,1" {
    tab.frame = CGRect(x: 130, y: 122, width: 60, height: 60)
} else if UIDevice.current.modelName == "iPhone5,1"  {
    tab.frame = CGRect(x: 130, y: 171, width: 75, height: 75)
}