Как определить, соответствует ли текущий размер 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?
Ответы
Ответ 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
*/