2016-05-20 13 views
13

Etiket etiketlemenin ve ekranın diğer görünümlerinin boş bırakılan yeri kullanmasına izin vermenin basit bir yolu bilen var mı? Ve bu görüşü geri çekerken tersini yap. Android setVisibility = katmanları için GONE gibi bir şey.görünürlük ayarlamak IOS GDA android gibi nasıl?

Bildiğim kadarıyla gerçek setHidden = sadece ekrandan görünümü gizlemek ama çevresinde şey yeniden düzenlenmemesi kullanarak, bildiğimiz gibi.

youe uygulama ios 9 ve üstü destekleyip desteklemediğini

+0

bunu Android'de çok beğenemezsiniz, ancak bir UIStackView kullanıyorsanız, – Fonix

+0

UIStackView uygulamasını kullanarak çalışabilirsiniz? @Fonix –

+0

Eğer bu konuyla ilgili herhangi bir referans kodunuz varsa lütfen yorum yapınız –

cevap

11

tek yolu daha gizlemek istediğiniz Yani eğer View

Yükseklik Constaint eklerseniz iOS'ta Androidler .GONE işlevselliği elde etmek için dinamik Stack View'in İçerik T değiştirme Apples documentation

yoluyla UIStackView

kullanmaktır O otomatik görüntüleme ilave kaldırılabilir veya arrangedSubviews dizisine eklenen ya da her ne zaman düzenini günceller görünümü yığını her düzenlenmiş subviews gizli özellik değişimlerinin bir.

SWIFT 3:

// Appears to remove the first arranged view from the stack. 
// The view is still inside the stack, it's just no longer visible, and no longer contributes to the layout. 
let firstView = stackView.arrangedSubviews[0] 
firstView.hidden = true 

SWIFT 4:

let firstView = stackView.arrangedSubviews[0] 
firstView.isHidden = true 
+0

için teşekkürler cevap mükemmel çalışıyor @Fonix –

+0

Mükemmel cevap. –

1

Sen UIStackView kullanabilirsiniz ederiz.

ancak uygulama desteği ios 8 de You have daha autoLayout kullanarak başarmak için ve sadece belirlenen yükseklik constrain değeri 0.

2

Bu kolayca kullanarak AutoLayout kısıtlamaları elde edebilirsiniz.

böyle üç görünümü olduğunu varsayalım:

+-----+ 
| A | 
+-----+ 
+-----+ 
| B | 
+-----+ 
+-----+ 
| C | 
+-----+ 

ve görünümü B bazı durumlarda ortadan yapmak istiyorum. aşağıdaki gibi

ayarlama kısıtlamaları (bunlar sadece örnek değerlerdir):

B top space to A: 4 
C top space to B: 4 
B height: 20 

Sonra B'nin yükseklik için kodunuzda bir NSLayoutConstraint çıkış oluşturun. IB'deki kısıtlamayı sürükleyip bırakarak bunu yapın. Nihayet

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bHeight; 

, sadece aşağıdakileri yapın görünümü yok etmek için: Bir tableview hücre için böyle yapıyorsun, sen B görünmesini istediğiniz durumlarda olabileceğini

self.bHeight = 0; 

Not Bazı hücreler, ancak başkalarında değil. Bu durumda

, size görünür olmak isteyen hücreler için onun "normal" değerine yüksekliği sıfırlamak zorunda kalacaktır.

self.bHeight = 24; 
+0

sadece "self.bHeight = 0;" 'i ayarlarsanız, A ve C arasında bir çift boşluk olacak, üst boşluklardan birini 0 yapmalısınız, aksi takdirde 3'ten fazla görünüm varsa Eğer ARC kullanıyorsanız düzensiz – Fonix

+0

bakmak ve hata var: > Eğer 'self.bHeight.constant = 24 kullanmalıdır " 'NSLayoutConstraint *' için 'int' ARC ile izin verilmeyen örtük dönüştürme";' – Bubu

1

Basit bir çözüm arıyordum ve buldum.UIStackView'ı kullanmam veya kısıtlama için çıkış oluşturmam gerekmiyor.

class GoneConstraint { 
    private var constraint: NSLayoutConstraint 
    private let prevConstant: CGFloat 

    init(constraint: NSLayoutConstraint) { 
     self.constraint = constraint 
     self.prevConstant = constraint.constant 
    } 

    func revert() { 
     self.constraint.constant = self.prevConstant 
    } 
} 


fileprivate struct AssociatedKeys { 
    static var widthGoneConstraint: UInt8 = 0 
    static var heightGoneConstraint: UInt8 = 0 
} 


@IBDesignable 
extension UIView { 

    @IBInspectable 
    var gone: Bool { 
     get { 
      return !self.isHidden 
     } 
     set { 
      update(gone: newValue) 
     } 
    } 

    weak var widthConstraint: GoneConstraint? { 
     get { 
      return objc_getAssociatedObject(self, &AssociatedKeys.heightGoneConstraint) as? GoneConstraint 
     } 
     set(newValue) { 
      objc_setAssociatedObject(self, &AssociatedKeys.widthGoneConstraint, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 
    weak var heightConstraint: GoneConstraint? { 
     get { 
      return objc_getAssociatedObject(self, &AssociatedKeys.heightGoneConstraint) as? GoneConstraint 
     } 
     set(newValue) { 
      objc_setAssociatedObject(self, &AssociatedKeys.heightGoneConstraint, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 

    private func update(gone: Bool) { 
     isHidden = gone 
     if gone { 
      for constr in self.constraints { 
       if constr.firstAttribute == NSLayoutAttribute.width { 
        self.widthConstraint = GoneConstraint(constraint: constr) 
       } 
       if constr.firstAttribute == NSLayoutAttribute.height { 
        self.heightConstraint = GoneConstraint(constraint: constr) 
       } 
       constr.constant = 0 
      } 
     } else { 
      widthConstraint?.revert() 
      heightConstraint?.revert() 
     } 
    } 
} 

Şimdi, view.gone = true çağırabilir ve bu kadar: Sadece bu kullanın.

+0

olduğunu tablo üstbilgisini dinamik olarak ayarlamak için çalışır? –

+1

@siddharth shah Bunu test etmedim. –

+0

tamam, Sorun değil, sonra cevap vereceğim Btw teşekkürler @DanielQ –

İlgili konular