2016-05-20 17 views
13

Bất kỳ ai biết cách đơn giản để ẩn nhãn và để các chế độ xem khác của màn hình sử dụng địa điểm bị bỏ trống? Và làm ngược lại khi hiển thị lại chế độ xem đó. Một cái gì đó như Android setVisibility = GONE cho các lớp.cách đặt chế độ hiển thị GONE như android trong IOS?

Theo như tôi biết, việc sử dụng setHidden = true chỉ ẩn chế độ xem khỏi màn hình nhưng không sắp xếp lại bất kỳ thứ gì xung quanh màn hình.

Cảm ơn bạn

+0

bạn không thể làm điều này trong iOS giống như android, nhưng nếu bạn đang sử dụng UIStackView, bạn có thể – Fonix

+0

Sử dụng UIStackXem công việc của nó? @Fonix –

+0

nếu bạn có bất kỳ mã tham chiếu nào về vấn đề này, vui lòng nhận xét –

Trả lời

11

Cách duy nhất để đạt được chức năng Androids .GONE trên iOS là sử dụng một UIStackView

qua Apples documentation

động Thay đổi độ xem ngăn xếp Content T chế độ xem ngăn xếp của mình sẽ tự động cập nhật bố cục của nó bất cứ khi nào lượt xem được thêm, xóa hoặc được chèn vào mảng sắp xếpSubviews hoặc bất cứ khi nào một trong các thay đổi thuộc tính ẩn của các phụ đề được sắp xếp được sắp xếp.

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

Cảm ơn trả lời nó hoạt động hoàn hảo @Fonix –

+0

Câu trả lời hoàn hảo. –

1

Bạn có thể sử dụng UIStackView nếu ứng dụng youe hỗ trợ ios 9 trở lên.

nhưng nếu ios hỗ trợ ứng dụng của bạn 8 cũng hơn Bạn có để đạt được nó bằng cách sử Autolayout và thêm Chiều cao Constrain cho Xem

Vì vậy, nếu bạn muốn che giấu hơn chỉ cần thiết lập chiều cao giá trị Constrain 0.

2

Bạn có thể đạt được điều này dễ dàng sử dụng hạn chế AutoLayout.

Giả sử bạn có ba quan điểm như thế này:

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

và bạn muốn chắc xem B biến mất trong một số trường hợp.

Thiết lập hạn chế như sau (đây là những giá trị chỉ là ví dụ):

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

Sau đó tạo một ổ cắm NSLayoutConstraint trong mã của bạn cho chiều cao của B. Làm điều này bằng cách kéo và thả ràng buộc trong IB.

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

Cuối cùng, để làm cho quan điểm biến mất, chỉ cần làm như sau:

self.bHeight = 0; 

Lưu ý rằng nếu bạn đang làm điều này cho một tế bào tableview, bạn có thể có trường hợp bạn muốn B xuất hiện trong một số tế bào, nhưng không phải ở những người khác.

Trong trường hợp này, bạn sẽ phải đặt lại chiều cao thành giá trị "bình thường" cho các ô mà bạn muốn hiển thị ở độ cao.

self.bHeight = 24; 
+0

nếu bạn chỉ đặt 'self.bHeight = 0;' thì sẽ có một khoảng trống đôi giữa A và C, bạn sẽ cần phải tạo một trong các khoảng trống 0, nếu không, nếu có nhiều hơn 3 chế độ xem, nó sẽ trông không đồng đều – Fonix

+0

Nếu bạn đang sử dụng ARC và có lỗi: > "chuyển đổi ngầm của 'int' thành 'NSLayoutConstraint *' là không được phép với ARC" bạn phải sử dụng 'self.bHeight.constant = 24;' – Bubu

1

Tôi đang tìm kiếm giải pháp đơn giản và tìm thấy nó.Tôi không phải sử dụng UIStackView hoặc tạo ổ cắm để hạn chế. Chỉ cần sử dụng điều này:

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

Bây giờ, bạn có thể gọi view.gone = true và đó là nó.

+0

là nó hoạt động để thiết lập bảng headerview động? –

+1

@siddharth shah Tôi không thử nghiệm điều này. –

+0

ok, OK, tôi sẽ cố gắng trả lời bạn Btw cảm ơn bạn @DanielQ –

Các vấn đề liên quan