Подтвердить что ты не робот

Как определить, соответствует ли текущий размер Apple Apple размеру/размеру 38 мм или 42 мм?

Мы знаем, что для Apple Watch есть два размера экрана: 38 мм и 42 мм. Класс WKInterfaceDevice предоставляет читаемое свойство с именем screenBounds. Я написал расширение для WKInterfaceDevice, пытаясь добавить метод для обнаружения текущего типа устройства.

import WatchKit

enum WatchResolution {

    case Watch38mm, Watch42mm
}

extension WKInterfaceDevice {

    class func currentResolution() -> WatchResolution {

        let watch38mmRect = CGRectMake(0.0, 0.0, 136.0, 170.0)
        let watch42mmRect = CGRectMake(0.0, 0.0, 156.0, 195.0)

        let currentBounds = WKInterfaceDevice.currentDevice().screenBounds

        if CGRectEqualToRect(currentBounds, watch38mmRect) {

            return WatchResolution.Watch38mm
        } else {

            return WatchResolution.Watch42mm
        }
    }
}

Это правильный метод определения размера Apple Watch? Есть ли другой метод, отсутствующий в документах Apple?

4b9b3361

Ответ 1

Обновление Swift 4:

Включает новый запуск разрешений Watch:

enum WatchResolution {
    case Watch38mm, Watch40mm,Watch42mm,Watch44mm, Unknown  
}

extension WKInterfaceDevice {
class func currentResolution() -> WatchResolution {
    let watch38mmRect = CGRect(x: 0, y: 0, width: 136, height: 170)
    let watch40mmRect = CGRect(x: 0, y: 0, width: 162, height: 197)
    let watch42mmRect = CGRect(x: 0, y: 0, width: 156, height: 195)
    let watch44mmRect = CGRect(x: 0, y: 0, width: 184, height: 224)

    let currentBounds = WKInterfaceDevice.current().screenBounds

    switch currentBounds {
    case watch38mmRect:
        return .Watch38mm
    case watch40mmRect:
        return .Watch40mm
    case watch42mmRect:
        return .Watch42mm
    case watch44mmRect:
        return .Watch44mm
    default:
        return .Unknown
    }
  } 
}

Usage

Usage
let resol = WKInterfaceDevice.currentResolution()
    switch resol {
    case .Watch38mm, .Watch42mm:
        // Do Something
    case .Watch40mm, .Watch44mm:
        // Do Something
    default:
        // Do Something
    }

Ссылка: Ссылка на интерфейс Apple Watch Watch

Надеюсь, это поможет....

Спасибо

Ответ 2

Ваш код выглядит хорошо, но имеет несколько незначительных проблем:

  • У вас нет случая для "неизвестного" размера экрана (возможно, выпущенного в будущем)
  • Вы используете CGRectMake, но в Swift вы должны использовать инициализатор CGRect
  • Вы используете CGRectEqualToRect, но в Swift вы можете просто использовать == или switch
  • Вы явно возвращаете перечисления WatchResolution, но вам не нужно быть явным - Swift выберет это из вашей сигнатуры метода
  • Вы объявляете watch42mmRect, но не используете его для чего-либо

Я бы переписал его следующим образом:

enum WatchResolution {
    case Watch38mm, Watch42mm, Unknown
}

extension WKInterfaceDevice {
    class func currentResolution() -> WatchResolution {
        let watch38mmRect = CGRect(x: 0, y: 0, width: 136, height: 170)
        let watch42mmRect = CGRect(x: 0, y: 0, width: 156, height: 195)

        let currentBounds = WKInterfaceDevice.currentDevice().screenBounds

        switch currentBounds {
        case watch38mmRect:
            return .Watch38mm
        case watch42mmRect:
            return .Watch42mm
        default:
            return .Unknown
        }
    }
}

Ответ 3

Ваш метод выглядит отлично, и с ним ничего не происходит. Другое решение - использовать свойство contentFrame для WKInterfaceController. Если ширина составляет 312 (156) пикселей, то ее 42 мм еще 38 мм.

enter image description here

Ответ 4

CGRect rect = [WKInterfaceDevice currentDevice].screenBounds;
if (rect.size.height == 195.0) {
    // Apple Watch 42mm
}else if (rect.size.height == 170.0){
    // Apple Watch 38mm 
}

Ответ 5

Проверка screenBounds больше не работает на xCode 7 с iOS 9 с реальным устройством, размер часов, возвращаемый Watch 38mm, всегда равен 156x195.

Моя (плохая) альтернатива заключается в проверке ширины или высоты содержимого viewcontrollerFrame в зависимости от структуры представления

Ответ 6

Все вышеперечисленные решения работают нормально. Наряду с screenBounds ([[WKInterfaceDevice currentDevice] screenBounds]), будет полезно проверить screenScale ([[WKInterfaceDevice currentDevice] screenScale]). Фактический размер будет screenBounds * screenScale в этом смысле.

Больше ссылок: https://developer.apple.com/watch/human-interface-guidelines/specifications/

Ответ 7

Для короткого примера Swift 4:

enum WatchType {
    case watch38mm, watch42mm
}

extension WKInterfaceDevice {

    class var currentResolution: WatchType {
        // Apple Watch 38mm 136x170 - 42mm 156x195
        return WKInterfaceDevice.current().screenBounds.width == 136 ? .watch38mm : .watch42mm
    }

}

Ответ 8

Swift 5 версия ответа @Aaron Brager (+ поддержка новых Apple Watch).

enum WatchResolution {
case Watch38mm, Watch40mm, Watch42mm, Watch44mm, Unknown
}

extension WKInterfaceDevice {

class func currentResolution() -> WatchResolution {

    let watch38mmRect = CGRect(x: 0, y: 0, width: 136, height: 170)
    let watch40mmRect = CGRect(x: 0, y: 0, width: 162, height: 197)
    let watch42mmRect = CGRect(x: 0, y: 0, width: 156, height: 195)
    let watch44mmRect = CGRect(x: 0, y: 0, width: 184, height: 224)

    let currentBounds = WKInterfaceDevice.current().screenBounds

    switch currentBounds {
    case watch38mmRect:
        return .Watch38mm
    case watch40mmRect:
        return .Watch40mm
    case watch42mmRect:
        return .Watch42mm
    case watch44mmRect:
        return .Watch44mm
    default:
        return .Unknown
    }
}
}


/*
 all resolutions
 40mm: 394×324
 44mm: 448×368
 38mm: 340×272
 42mm: 390×312
 */