Выбор сториборда в зависимости от типа устройства

storyboard
swift
ios

#1

Собственно вот так можно быстро получить требуемый борд:


func setupStoryboard() -> UIStoryboard! {
        
        var currentStoryboard: UIStoryboard!
        switch UIDevice.currentDevice().userInterfaceIdiom {
        case .Phone:
            currentStoryboard = UIStoryboard(name: "iPhone", bundle: nil)
        case .Pad:
            currentStoryboard = UIStoryboard(name: "iPad", bundle: nil)
        default: break
        }
        return currentStoryboard
    } // setupStoryboard

А вот быстро его подчепить:

self.window?.rootViewController = setupStoryboard().instantiateInitialViewController()


Масштабирование текста
#2
func grabStoryboard() -> UIStoryboard {

            let screenHeight: Int = Int(UIScreen.mainScreen().bounds.size.height)
            var storyboard: UIStoryboard
            switch screenHeight {
                // iPhone 4s    
            case 480:
                storyboard = UIStoryboard.init(name: "iPhone4", bundle: nil)
                // iPhone 5s    
            case 568:
                storyboard = UIStoryboard.init(name: "iPhone5", bundle: nil)
            // iPhone 6    
            case 667:
                storyboard = UIStoryboard.init(name:"iPhone6", bundle: nil)
            // iPhone 6 Plus
            case 736:
                storyboard = UIStoryboard.init(name:"iPhone6Plus", bundle: nil)
            default:
            // it's an iPad        
                storyboard = UIStoryboard.init(name:"iPad", bundle: nil)
        }

    return storyboard
}

Выбор storyboard в зависимости от высоты экрана. Использовать в AppDelegate
Никогда не используйте этот код :slight_smile: Работы прибавится в несколько раз :slight_smile:


#3

А зачем на каждый айфон свой борд? По моему с констрейнами и лейаутом, достаточно двух бордов: айфон и айпад. И то лишь для того, что на йападе не совсем уместно смотрится телефонная реализация и его лучше верстать отдельно!


#4

Если надо создать ад для других участников проекта и побольше геммороя получить :slight_smile:
Двух бордов достаточно. На 4ку можно рассмотреть отдельный боард, у нее пропорции другие.


#5

Другие, в таком случае я размеры шрифтов, кнопок и прочей фигни в коде считаю


#6

А как размер шрифта кнопки рассчитать в коде, можете подсказать?


#7

Так он автоматом становится sizeToFit вроде


#8

Нет. Сделал сейчас отдельно кнопку с текстом, на 6s она увеличивается, а текст как был 20pt, так и остался


#9

А для чего это всё нужно? Средствами Size Classes разве нельзя решить подобные задачи?


#10

Ну, можно сделать перечисление с типом устройства, для каждого хранить размер шрифта

enum CustomFonts {
    static let iPhone4 = UIFont(name: "Helvetica", size: 16)
    static let iPhone5 = UIFont(name: "Helvetica", size: 18)
    static let iPhone6 = UIFont(name: "Helvetica", size: 20)
}

После проверить что за устройство и установить нужный размер:

self.refreshTitleButton.titleLabel?.font = CustomFonts.iPhone6

Вообще проблемы не вижу. Устройство легко опрашивается!


#11

Ну и сразу отвечу, пока вы не спросили:

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 "iPhone8,4":                               return "iPhone SE"
        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,3", "iPad6,4", "iPad6,7", "iPad6,8":return "iPad Pro"
        case "AppleTV5,3":                              return "Apple TV"
        case "i386", "x86_64":                          return "Simulator"
        default:                                        return identifier
        }
    }
}

Адаптация под разные устройства из одного класса. Заранее спасибо
#12

Подскажите пожалуйста, как описать условие, чтобы при использовании айфонов именно 5ой серии был один текст(например 3слова), а при использовании др серий айфонов (6,7,ipad) другой текст(10слов)? Спасибо