2015-10-28 13 views
7

Stanford Winter 2015 Swift/iOS kursuna katılıyorum ve ödevleri yaparken bir davranışla karşılaşıyorum. Değişmeyi severim.UILabel text özelliği nil olarak ayarlandığında veya "" UILabel'ı görünmez yapar (Swift/Autolayout/iOS9.1)

Videolarda açıklanan şekilde (görüntü pimini önden ve arkadan görünüm kenarlarına getirerek) ve Hesaplama uygulamasının "Ekranı" olarak Otomatik Düzenlemeyi kullanıyorum UILabel, başlangıç ​​değeri 0 ile ve ayarlanan değer her ne zaman olursa (a String) sıfır olmayan ve "" olmayan.

Ya nil veya "" ise, UILabel'ın tamamı kaybolur. Yapmaya çalıştığım şey, görüntülenecek bir değer olmadığı zaman ya da nil ile sonuçlanan yanlış bir hesaplama olduğunda ekranı "temizlemek" dir.

Bu konuda genel olarak kiminle başa çıkacağınız hakkında ipuçları var mı? Ekran boyutlarını değiştirmeden bir UILabel'ı "temizlemek"?


Düzenleme (teşekkürler Rob) UILabel tam metin için henüz Opsiyon tıklamalı, UIView içeren sürükle sol seçilen 1. çalışmaya gidip bir şey ("lider" kontrol edemez aşağıdaki sınırlamaları vardır 2. Aynı yöntem (1), sürükle sağ kenara doğru ve "sondaki" 3. Seçeneği yukarı sürükleyin. Yukarıdan yukarıya sürükleyin, "dikey" menü seçeneğini seçin. 3) Bu sürgü, UILabel'ın altındaki GUI üzerindeki UIButton'a aittir.

Bu ayarlarda, bir numara içerdiğinde etiket her zaman v metin ve eğer (anlaşılırsa, doğrulamak için renklendirir) metin bile olsa, ekran boyunca uzanır.

Düzen, UILabel'ın içeriği boş olmadığı sürece profil ve manzaralarda doğru görünüyor. Boşsa, aşağıdaki düğmelerin en üste doğru yukarı doğru hareket etmesi için "uyacak şekilde küçültmek" görünüyor.

90'lı yılların ortalarından beri bir C++ dev oldum ancak küçük bir kullanıcı arabirimi deneyimim var ve iOS/Swift geliştirmede birkaç haftadan fazla deneyimim yok.

Teşekkürler!

+0

düzenleyin soru onun konumunu ve boyutunu kontrol etmek için etiket görünümü üzerinde ayarladığınız kısıtlamaları tanımlamak için. –

+0

"label.sizeToFit()' aramayı denediniz mi? – Pranav

+0

Eğer countDown zamanlayıcı == 0 ise "" (etiketi temizleyerek) döndüren bir if ifadesi oluşturmayı denediniz mi? @Varsuuk – lukaivicev

cevap

1

UILabel'a her zaman etiketin sol ve sağ tarafını tutan bir minimum genişlik ve min yükseklik veya sınırlamalar verebilirsiniz. Bu, etiketin boyutlarını sıfıra değiştirmesini sağlamalıdır. böylece benim durumumda ben bunu bir boşluk verme sona erdi yılında

+0

Teşekkür ederim Mac'te bunu kontrol edin, ancak iOS tarafından kontrol edilen en geniş genişliğin görünüm genişliği olmasını sağlamanın bir yolu var mı? Kontrol seçeneğinin sol ve sağ kenarlarına sürükle tıklatıldığında, yaptığım şeyin bu olduğuna inandım. Bu yeni belki de tam genişliğidir ama belki de bahsettiğiniz gibi, bu da küçülmüş olabilir - daha fazla bilgi almak için UILabel'ı farklı bir şekilde renklendireceğim. – Varsuuk

+0

Yapmanız gereken şey bence – Moriya

+0

Teşekkürler @animal, bu benim düşünmüyordu ama benim çılgın başım ile iPad'de yazarak bana bir önceki satırda çok kısa bir süre önce bir satır girin. Kontrol ve güncelleyin. – Varsuuk

0

UILabel içsel içerik boyutunu geçersiz kılmak Interface Builder >> Identity inspector >> Custom Class >> Class atanmış özel bir UILabel sınıfını kullanın.

Gereksiz otomatik düzen kısıtlamaları oluşturmanıza gerek yoktur.

Swift:

class UILabelNonCompressible: UILabel 
{ 
    private static let NonCompressibleInvisibleContent = " " 

    override var intrinsicContentSize: CGSize 
    { 
     if /* zero-width */ text == nil ? true : text!.isEmpty 
     { 
      // prefer mirror-and-calculate over modify-calculate-restore due to KVO 
      let doppelganger = createCopy() 

      // calculate for any non-zero -height content 
      doppelganger.text = UILabelNonCompressible.NonCompressibleInvisibleContent 

      // override 
      return doppelganger.intrinsicContentSize 
     } 
     else 
     { 
      return super.intrinsicContentSize 
     } 
    } 
} 

Ayrıca "How do copy for UILabel?" gerekir:

extension UILabel 
{ 
    func createCopy() -> UILabel 
    { 
     let archivedData = NSKeyedArchiver.archivedData(withRootObject: self) 
     return NSKeyedUnarchiver.unarchiveObject(with: archivedData) as! UILabel 
    } 
}