Jonathan Helding Jonathan Helding - 2 months ago 7
Swift Question

Swift changing button height depending on screen size

So i have a button/image, i want i to get higher/smalle when viewing on iPad or a smaller IPhone.

In Xcode >7 i could put my items inside W/all H/all, then i could put constraint in compact width/any height if i wanted it to be in Iphone portrait. But in Xcode 8 its a whole new system and i don't know how to do it now, so i want to change my height of the button depending on the size of the screen, how do i do that?

i've tried to search around on the net, and find something with make a constraint outlet could that work if i have autolayout on?

Answer

You could use:

Swift 3

class ViewController: UIViewController {

    let screenSize: CGRect = UIScreen.main.bounds
    @IBOutlet weak var buttonWidthContraint: NSLayoutConstraint!
    @IBOutlet weak var buttonHeightContraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        buttonHeightContraint.constant = (screenSize.height / 2)
        buttonWidthContraint.constant = (screenSize.width / 2)

    }
}

Swift 2

class ViewController: UIViewController {

    let screenSize: CGRect = UIScreen.mainScreen().bounds
    @IBOutlet weak var buttonWidthContraint: NSLayoutConstraint!
    @IBOutlet weak var buttonHeightContraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        buttonHeightContraint.constant = (screenSize.height / 2)
        buttonWidthContraint.constant = (screenSize.width / 2)

    }
}

This way the UIButton.height is always the size of the screen / 2.

Just have a look for the right quotient you need. For example (screenSize.height / 25.3), then on iPad, on every iPhone and so on, the Button will always have the height, depending on the device.

Another possibility would be the UIDeviceExtension

import Foundation
import UIKit

public 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 where value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }

        switch identifier {
        case "iPod5,1":                                 return "iPod Touch 5"
        case "iPod7,1":                                 return "iPod Touch 6"
        case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
        case "iPhone4,1":                               return "iPhone 4s"
        case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
        case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
        case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
        case "iPhone7,2":                               return "iPhone 6"
        case "iPhone7,1":                               return "iPhone 6 Plus"
        case "iPhone8,1":                               return "iPhone 6s"
        case "iPhone8,2":                               return "iPhone 6s Plus"
        case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
        case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
        case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
        case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
        case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
        case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
        case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
        case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
        case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
        case "iPad6,7", "iPad6,8":                      return "iPad Pro"
        case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4", "iPad3,1", "iPad3,2", "iPad3,3", "iPad3,4", "iPad3,5", "iPad3,6", "iPad4,1", "iPad4,2", "iPad4,3", "iPad5,3", "iPad5,4", "iPad2,5", "iPad2,6", "iPad2,7", "iPad4,4", "iPad4,5", "iPad4,6", "iPad4,7", "iPad4,8", "iPad4,9", "iPad5,1", "iPad5,2":                       return "iPad"
        case "AppleTV5,3":                              return "Apple TV"
        case "i386", "x86_64":                          return "Simulator"
        default:                                        return identifier
        }
    }

}

Used as following (for example):

let modelName = UIDevice.currentDevice().modelName
if modelName == "iPad" {
    buttonOutlet.frame.size.height =  42
} else if modelName == "iPhone 4" {
    buttonOutlet.frame.size.height =  25
}

And so on.