2015-04-09 25 views
13

Apple Watch için iki ekran boyutu olduğunu biliyoruz: 38mm ve 42mm. WKInterfaceDevice sınıfı, screenBounds adlı okunabilir bir özellik sağlar. Geçerli aygıt türünü algılamak için bir yöntem eklemeye çalışırken, WKInterfaceDevice için bir uzantı yazdım.Güncel Apple Watch boyutu/boyutu 38mm veya 42mm mi çalışıyor?

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 boyutunu algılamak için doğru yöntem bu mu? Apple belgelerinde eksik olduğum başka bir yöntem var mı?

cevap

20

Kodunuzu iyi görünüyor, ancak birkaç küçük sorunlar vardır: Sen (muhtemelen gelecekte yayınlanacak) bir "bilinmeyen" ekran boyutu bir dava yok

  • sen CGRectMake kullanıyor ancak Swift sen sen CGRectEqualToRect kullanıyor ancak Swift içinde sadece kullanabileceğiniz bir CGRect başlatıcı
  • kullanmalıdır == veya switch
  • Açıkça WatchResolution çeteleler dönen yapıyor ancak açık ve net olması gerekmez - Swift sizin yöntem imzası onu anlamaya olacak bir şey için kullanmaktan watch42mmRect ilan fakat değiliz

böyle yeniden yazmak olacaktır:

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 
     } 
    } 
} 
+0

Cevabınız oldukça özlü, thx. – tounaobun

+0

Bu harika! Teşekkürler! –

3

Sizin yönteminiz iyi görünüyor ve bununla ilgili bir sorun yok. Başka bir çözüm, WKInterfaceController'ın contentFrame özelliğini kullanmaktır. Genişlik 312 (156) piksel ise, 42mm başka 38mm'dir.

enter image description here

+0

Bkz: "Bu dikdörtgen, farklı olabilir ekran sınırlarından daha fazla. " Ama OP ekran sınırlarını almaya çalışıyor. –

+0

Tahmin ettiğim yükseklikten dolayı. İçerik nedeniyle değişiklik gösterebilir. İşte bu yüzden genişlik dedim. –

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

Lütfen her zaman cevabınıza biraz daha ayrıntı ekleyin. –

1

yukarıdaki tüm çözümler çalışıyor. ScreenBounds ([[WKInterfaceDevice currentDevice] screenBounds]) ile birlikte, screenScale ([[WKInterfaceDevice currentDevice] screenScale]) işlevini de kontrol etmek iyi olacaktır. Gerçek boyut, bu anlamda screenBounds * screenScale olacaktır.

Daha referansı: https://developer.apple.com/watch/human-interface-guidelines/specifications/

2

kontrol etme screenBounds gerçek cihazla iOS 9 ile Xcode 7 artık çalışmıyor görünüyor, İzle 38mm tarafından döndürülen izle boyutu her zaman 156x195 olduğunu.

Benim (kötü) bir alternatif Swift 4 kısa Örneğin görünüşüdür yapısı

+0

Aynı sorunu buldum. Bir elma böceği gibi görünüyor. –

0

bağlı olarak viewcontroller contentFrame genişlik veya yükseklik kontrol etmektir: yazan yere

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 
    } 

} 
İlgili konular