2014-12-28 19 views
19

İçeriği Bugün görünüm etiketlerinin kalanına hizalamak için Bugün uzantısının ana görünümünde sol kenar boşluğunun nasıl hesaplanacağını bulmaya çalışıyorum.Bugünün uzantısı sol marjı iOS 8'de nasıl belirlenir?

Bugün bir uzantıları kullanarak temiz bir Xcode projesiyle ilgili bir örnek (Görünüm geçmişlerine renk ekledim ve Hello World UILabel'u hizalamak istediğim yerleri göstermek için kesikli bir kırmızı çizgi çizdim).

iPhone 6 Plus simülatörü (sol yan manzara, sağ taraf dikey) sonuç aşağıdaki resimden bulunabilir: resimde

enter image description here

, yeşil ana görünümü sol sınır olduğunu fark UILabel "testi2" uygulama adıyla farklı şekilde yerleştirilmiş. Ayrıca, kırmızı çizgi - ana görünümlerin sınır hizalamalarının her cihazda farklı olduğu anlaşılıyor: iPhone 5x, iPhone 6 ve iPad'ler.

davranış temiz bir Xcode proje (Xcode 6.1.1, iOS 8.1 ve Swift kullanıyorum) kullanılarak yeniden olabilir

:

  1. boş Xcode projesi (Tek görünüm uygulaması)
  2. oluştur yeni Hedefi ekle
  3. : Extensions> Bugün uzatma grubundan Bugün uzantısı
  4. , MainInterface.storyboard bulun ve yeşil ana görünümü arka plan yapmak ve Merhaba dünya UILabel kırmızı arka planı: enter image description here

Merhaba Dünya UILabel (kırmızı arkaplan) kesikli çizgiyle nasıl hizalarım? Veya ana görünümü (yeşil arka plan) kesikli çizgiye nasıl hizalarım?

+0

Görüntü bozuk, en azından burada. "CloudFlare ağında bulunan bir web sitesinde (i.stack.imgur.com) bir sayfa istediniz. CloudFlare şu anda istenen etki alanınızı (i.stack.imgur.com) çözemiyor." –

+0

Aslında, bu bir StackOverflow sorunu gibi görünüyor. Sadece site ile ilgili bir görüntü olan bir başka kırık görüntü fark ettim. Aldırmamak. –

+0

Tamam, işte yine de görüntünün başka bir bağlantısı var: http://ibin.co/w800/1mDY3ckx95h7 –

cevap

17

Bunu denediniz mi?

EDIT:

Objective-C:

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets 
{ 
    return UIEdgeInsetsZero; 
} 

Swift: Bu So-Thread göre manuel olarak ayarlamak zorunda kalacaktır gibi

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { 
     return UIEdgeInsetsZero 
} 

Aksi görünüyor :

Bu yöntemin kullanımdan kaldırıldığı ve> = iOS10 çalıştıran cihazlar için çağrılmadığı anlaşılıyor. Ancak bir alternatif üzerinde herhangi bir belge bulamadım. Bu konuda herhangi bir bilginiz varsa lütfen bu gönderiye ekleyin, böylece herkes kar edebilir. Sadece bu işlevi kullanırken,> = iOS10 olarak adlandırılmayacağından emin olun.

Kaynak: karışık sonuçlarla -widgetMarginInsetsForProposedMarginInsets ait defaultMarginInset ait left değerini kullanarak çalıştı Apple Documentation

+0

Teşekkürler, deneyeyim. * Her cihaz ve yönelim için * sihirli piksel değerlerini girmeyi gerektirmeyen bir çözüm arıyorum. –

+1

Örneğiniz (btw'de bahsettiğim gibi, btw'yi kullanıyorum) gerçekten de * tüm kenar boşluklarını * alır. Ancak, 'UILabel' widget adının konumunu (ekran görüntüsümdeki kırmızı çizgili çizgi) nasıl hesaplayacağımı yanıtlamıyor. –

+0

Teşekkürler, bu benim için çözüldü. –

5

: iPhone 5S ekran boyutları üzerinde, iOS varsayılan takvim widget olarak aynı girinti (almak için kullanılabilir zaman etiketin sağ kenar) mavi çizgi ile aynı hizaya dikkat:

5S Portrait

5S Landscape

iPhone 6'da benzer sonuçlar elde edersiniz, aynı zamanda hizalar. Ancak, iPhone 6 Plus üzerinde, takvim Widget nasılsa girinti ölçekler: peyzaj versiyonunda, zaman ne çizgiler ne bir şey hizaya gelecek

6P Portrait

6P Landscape

Not.

Sonuç olarak, iyi sonuç almak için defaultMarginInset.left'u güvenle kullanabileceğinizi söyleyebilirim.


Swift kodu şu şekildedir:

class TodayViewController: UIViewController, NCWidgetProviding { 

    var defaultLeftInset: CGFloat = 0 
    var marginIndicator = UIView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     marginIndicator.backgroundColor = UIColor.whiteColor() 
     view.addSubview(marginIndicator) 
    } 

    func widgetMarginInsetsForProposedMarginInsets(var defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { 
     defaultLeftInset = defaultMarginInsets.left 

     defaultMarginInsets.left = 0 
     return defaultMarginInsets 
    } 

    func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) { 
     marginIndicator.frame = CGRectMake(defaultLeftInset, 0, 10, view.frame.size.height) 
     completionHandler(NCUpdateResult.NewData) 
    } 
} 
+0

Bu iyi, ama kesin değil. Apple bir şekilde hizalamayı yapıyor, nasıl olduğunu merak ediyorum. Bahse girerim, her cihaz ve yönelim için sabit bir piksel değerleri kümesine sahip değildir. –

+0

Bundan emin olmayacağım. Ayrıca, 6 Plus'ta gördüğünüz gibi, gerçekten hiçbir şeye uymuyor. Ayrıca, Hatırlatıcı küçük aracının içeriklerini takvim widget'ına karşılaştırırsanız, hiçbir şeyin hizalanmadığını fark edeceksiniz. Bana öyle geliyor ki, bu kadar katı değiller ... – fabian789

+0

iPhone 6 Plus manzarasında, "Yarın için planlanmış bir etkinliğiniz yok." "Yarın" widget başlığıyla mükemmel bir şekilde uyumludur (Apple'ın Bugünkü Widget'ı). –

4

Benim geçici bir çözümdür gider. Sol ve üst kenar boşluklarını ayarlamak için sabit değerler kullanıyorum. Bu şekilde içeriği tam olarak olduğu gibi hizalayabilirim, örneğin, Tomorrow Özet widget'ında.

(this answer uyarlanmıştır) cihazı tipinin belirlenmesi için bir yardımcı yöntemler Ana:

struct ScreenSize { 
    static let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width 
    static let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height 
    static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, 
     ScreenSize.SCREEN_HEIGHT) 
    static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, 
     ScreenSize.SCREEN_HEIGHT) 
} 

struct DeviceType { 
    static let iPhone4 = UIDevice.currentDevice().userInterfaceIdiom == .Phone 
     && ScreenSize.SCREEN_MAX_LENGTH < 568.0 
    static let iPhone5 = UIDevice.currentDevice().userInterfaceIdiom == .Phone 
     && ScreenSize.SCREEN_MAX_LENGTH == 568.0 
    static let iPhone6 = UIDevice.currentDevice().userInterfaceIdiom == .Phone 
     && ScreenSize.SCREEN_MAX_LENGTH == 667.0 
    static let iPhone6Plus = UIDevice.currentDevice().userInterfaceIdiom == .Phone 
     && ScreenSize.SCREEN_MAX_LENGTH == 736.0 
    static let iPad = UIDevice.currentDevice().userInterfaceIdiom == .Pad 
} 

sonra widgetMarginInsetsForProposedMarginInsets: kullanılarak aşağıdaki gibi sol ve üst-parçalar üzerine önerilen:

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) 
     -> UIEdgeInsets { 
    var insets = defaultMarginInsets 
    let isPortrait = UIScreen.mainScreen().bounds.size.width 
     < UIScreen.mainScreen().bounds.size.height 

    insets.top = 10.0 
    if DeviceType.iPhone6Plus { 
     insets.left = isPortrait ? 53.0 : 82.0 
    } else if DeviceType.iPhone6 { 
     insets.left = 49.0 
    } else if DeviceType.iPhone5 { 
     insets.left = 49.0 
    } else if DeviceType.iPhone4 { 
     insets.left = 49.0 
    } else if DeviceType.iPad { 
     insets.left = isPortrait ? 58.0 : 58.0 
    } 

    return insets 
} 

Ancak Bu aradığım çözüm değil - Oryantasyon başına cihaz başına piksel değerlerinden kurtulmak istiyorum.

+1

iPad Portait için 58 yerine 54 kullanmalısınız, aksi halde benim için çalıştı – mohlendo

İlgili konular