2016-09-12 13 views
6

ben dairesel bir görünüm yapmak için bu tekniği kullandım:iOS10 SDK'de ne zaman çerçeve boyutu ayarlanır? Swift ve objc birkaç yıldır

viewDidLoad bu kodu koyarak hiçbir sorun olmamıştır Film Şeridi'nde UILayoutConstraints genişlik/yükseklik sabittir
view.layer.cornerRadius = view.frame.size.width/2 
view.clipsToBounds = true 

veya viewWillAppear'da. iOS9.3SDK Dahili o iOS10 iyi çalışır vb

iOS10SDK bile viewWillAppear kadar framesize Film Şeridi'nde sabit boyuta tamamen farklı gösterir ve vb viewDidLayoutSubviews My Seçenekler şunlardır:

1) do Bu viewDidAppear (korkunç çözelti) içinde 2)

Bu Film Şeridi'nde belirlenen sabit bir genişlik/yükseklik olarak (bir hata gibi görünen en az bir uyarı olmadan değişmiş asla CornerRadius() ince ama korkunç işleri hardcode konsol). Öyle mi, yoksa şu anda bu kod için farklı bir yer var mı? Bu bana bugün bütün gün rahatsız oldu

enter image description here

+1

IB tarafından oluşturulan tüm görünümlerimde displayDidLoad öğesinde başlatılmamış yeni {1000,1000} çerçeve boyutu ve kodun diğer birçok parçası var. cellForRowAtIndexPath – Miro

+0

dahil olmak üzere, çerçeve genişliği yüksekliği yerine doğrudan kısıtlama genişliğini/yüksekliğini kullanarak makul bir çözüm olduğunu buldum. http://stackoverflow.com/questions/39475456/ios10-viewdidload-frame-width-height-not-initialized-correctly-anymore-1000-10 – Miro

+0

Merhaba @Miro - tam olarak gördüm (1000 varsayılan). Ben de yüksekliği doğrudan ayarlıyorum.Ayrıca, Apple'ın görünüm düzeni kodunda bir sürü şey değiştirdiğini ima eden NSLayoutConstraints ile ilgili sorunlar yaşadım :-) – Peter

cevap

5

iOS 10'da, bu sorun, Xcode 8'i june, beta olduğunda kullanmaya başladığımdan hemen sonra karşılaştım. Bu çözüm gereklidir:

sağ katman modifikasyonlar önce layoutIfNeeded() koyun:

self.view.layoutIfNeeded() 

view.layer.cornerRadius = view.frame.size.width/2 
view.clipsToBounds = true 

VEYA

yer kodu köşe yarıçapı için viewDidLayoutSubviews() yönteme:

override func viewDidLayoutSubviews() { 

    view.layer.cornerRadius = view.frame.size.width/2 
    view.clipsToBounds = true 

} 
3

(Test kodunun ekran görüntüsü ektedir). Birkaç noktadan aynı sorunu yaşadım, özel UI öğeleri çizmek için doğru çerçeve boyutuna ihtiyacım vardı veya özellikle köşe yarıçapını değiştirerek görünümlere stil uygulamak. Bulduğum çözüm aşağıdaki uygulaması ile UIViewController alt sınıf oluşturma: Bu storyboard ile tüm sorunlar giderildi

class BaseViewController: UIViewController { 

    /** 
     This is a helper property and a helper method that will be called 
     when the frame is calculated, but will prevent the formatting code 
     being called more than once 
    */ 
    private var didCalculateInitialFrame = false 
    private func checkIfFrameWasCalculated() { 
     if self.didCalculateInitialFrame == false { 
      self.viewDidCalculateInitialFrame() 
      self.didCalculateInitialFrame = true 
     } 
    } 

    //-- This is where you will tie your helper method with the view lifecycle 
    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     self.checkIfFrameWasCalculated() 
    } 

    /** 
     This is an overridable function that you will implement 
     in your subclasses, in case you need to use this approach 
     in multiple places of your app. 
    */ 
    func viewDidCalculateInitialFrame() { 

    } 
} 

. Umarım bu yardımcı olur.

+0

Merhaba Alex - bu çok yararlı (upvoted). Ben sadece bunu yapmak için 'uygun' bir yol olması gerektiğini düşündüğüm cevap olarak kabul ettim ve bu geçici bir çözüm gibi görünüyor. Cevabınız için teşekkürler. – Peter

+0

Peter, teşekkürler - tamamen seninle! Doğru yol belgelenirse, kesinlikle bu cevabı güncelliyorum. Her durumda, yeni görüntü denetleyici yaşam döngüsü ile oynadığım projeyi paylaştım ve çerçeveler nasıl ve ne zaman iOS 10/Xcode 8.0 GM'de hesaplanır. Burada bulabilirsiniz: [link] (https://github.com/al7/TestViewDidLoad). –

0

budur ios10

’de sorun görünüyor

, boyutlarını almadan önce gereksinim duyabileceğiniz boyut görünümü için denetleyici yöntemi viewDidLayoutSubviews() veya çağrı yöntemi layoutIfNeeded() öğesini geçersiz kılarak çözülebilir. Amaç-C: [viewObject layoutIfNeeded] Swift: boyut değeri hala doğru değildir viewObject.layoutIfNeeded()

o zaman görünüşüdür nesnenin üst görünümü için layoutIfNeeded yöntemi kullanılır.

İlgili konular