2016-05-20 7 views
13

誰かがラベルを隠す簡単な方法を知っていて、画面の他のビューに空白のままの場所を使用させることはできますか?そして、その視点を見せて逆にする。レイヤーの場合、AndroidのようなものsetVisibility = GONEどのように可視性を設定するIOSのアンドロイドのようにGONE?

私が知る限り、setHidden = trueを使用すると、画面からの表示は非表示になりますが、周囲のものは並べ替えられません。

はyoueアプリは、IOS 9以上をサポートしている場合は、

+0

あなたはUOSでこれを行うことはできませんが、あなたはUIStackViewを使用している場合は – Fonix

+0

UIStackViewを使用していますか? @Fonix –

+0

これについての参照コードがあればコメントしてください –

答えて

11

よりも、唯一の方法を非表示にしたいのであればビュー

のための高さ拘束を追加する必要がありますよりも8アプリのサポートIOSの場合iOSのアンドロイド.GONE機能を実現するためには、動的にスタックビューのコンテンツTを変更するApples documentation

経由UIStackView

を使用することですスタックビュー は、ビューが追加、削除、またはがalignedSubviews配列に挿入されたとき、またはサブビューの非表示プロパティが変更されたときに自動的にそのレイアウトを更新します。

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

ありがとうそれは完全に動作する答え@Fonix –

+0

完璧な答え。 –

1

あなたはUIStackViewを使用することができますありがとうございました。

が、あなたは自動レイアウトを使用して、それをachiveし、あなただけの設定の高さの制約値を0

2

あなたは簡単に自動レイアウトの制約を使用してこれを達成することができます。

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

、あなたは、ビューBは、いくつかのケースで消えるようにしたい:

は、あなたがこのような3つのビューがあるとします。次のように

は(これらは単なる例の値です)制約を設定します。

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

次にBの高さのために、あなたのコード内でNSLayoutConstraintアウトレットを作成します。これを行うには、IBの制約をドラッグアンドドロップします。最後に

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

、ビューが消えるように、単に次の操作を行います。あなたはテーブルビューのセルのためにこれをやっている場合、あなたはBの中で表示する例を有することができること

self.bHeight = 0; 

注意をいくつかの細胞が、他の細胞には存在しない。

この場合、表示させたいセルの高さを「通常」の値にリセットする必要があります。

self.bHeight = 24; 
+0

'self.bHeight = 0;'のみを設定し、AとCの間に二重スペースがある場合は、トップスペースの1つを0にする必要があります。そうでなければ、3つ以上のビューがある場合、あなたはARCを使用して、エラーを持っている場合は – Fonix

+0

不均一見る: >「『NSLayoutConstraint *』から 'int型の暗黙の変換は、ARCで許されていません」 あなたは 'self.bHeight.constantを使用する必要があります= 24;' – Bubu

1

私は単純な解決策を探していました。私はUIStackViewを使用したり、コンセントを制約のために作成したりする必要はありません。ただ、この使用:今

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() 
     } 
    } 
} 

を、あなたはview.gone = trueを呼び出すことができますし、それはそれです。

+0

があります動的にテーブルヘッダービューを設定しますか? –

+1

@siddharth shah私はこれをテストしなかった。 –

+0

ok、問題はありません私はあなたに答えてくださいBtwありがとう@ダニエルQ –

関連する問題