iOS tương đương cho Android View. chế độ hiển thị GONE


79

Tôi đang phát triển một ứng dụng cho iOS và tôi đang sử dụng Bảng phân cảnh khi BẬT Tự động thanh toán. Một trong những bộ điều khiển chế độ xem của tôi có một bộ 4 nút và trong một số trường hợp nhất định, tôi muốn làm cho nút đầu tiên biến mất.

Nếu tôi sử dụng setHidden:TRUEphương pháp UIButton trở nên vô hình nhưng rõ ràng là nó vẫn chiếm không gian trong chế độ xem và kết quả là một "lỗ hổng" mà tôi không thể lấp đầy khiến UIButton còn lại trôi về phía trên cùng của chế độ xem chính.

Trong Android, tôi sẽ chỉ đơn giản sử dụng View.GONEthay vì View.INVISIBLE, nhưng trong iOS, tôi bị mắc kẹt với hành vi này và tôi không muốn tin rằng giải pháp duy nhất là di chuyển các phần tử còn lại lên đầu theo cách thủ công (vâng, ý tôi là theo lập trình).

Tôi đã nghĩ rằng tôi sẽ có thể làm điều đó khi thiết lập một số loại Ràng buộc để làm cho mọi thứ tự động như trong Android nhưng tôi đã không gặp may.

Trước khi tôi TẮT Tự động thanh toán, ai đó có thể chỉ tôi đi đúng hướng không?

Tôi đang sử dụng IB, nhưng tôi cũng thấy thoải mái với những thứ có lập trình.

CẬP NHẬT:

Đặt chiều cao thành phần thành 0 cũng không hữu ích.

Tôi đã thử một cái gì đó như thế này:

UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;

Làm thế nào về việc thiết lập chiều cao của nút thành 0?
cahn

Tôi đã thử một cái gì đó như thế này: UIButton * b; CGRect frameRect = b.frame; frameRect.size.height = 0; b.frame = frameRect; Không may mắn :(
elbuild

Tôi biết đây là một câu hỏi quá cũ nhưng liên quan đến việc cập nhật của bạn, việc đặt khung thành 0 sẽ không hữu ích nếu bạn đang sử dụng tự động thanh toán. Bạn phải đặt giới hạn chiều cao thành 0
wyu

Câu trả lời:


40

Việc thêm một ràng buộc (NSLayoutAttributeHeight) đặt chiều cao của chế độ xem thành 0 đã phù hợp với tôi:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];

11
Phiên bản Swift:self.view.addConstraint(NSLayoutConstraint(item: self.captchaView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 0))
iStar

1
Đây lẽ ra phải là câu trả lời
Rick Royd Aban

2
Điều gì sẽ xảy ra nếu tôi không biết chiều cao thực tế của chế độ xem mong muốn (ví dụ: chế độ xem vùng chứa được hiển thị sau một chút)?
A. Petrov

Cảm ơn rất nhiều vì câu trả lời tuyệt vời! Đối với ai đó có thể cần nó. Tôi có một lỗi Unable to simultaneously satisfy constraints. trong khi tôi đã có những ràng buộc đối với chế độ xem. Tôi giải quyết nó bằng stackoverflow.com/a/38625419/1270901
Nevin Chen

@iStar Tôi đã sử dụng cùng một mã nhưng nó không hoạt động ... stackoverflow.com/questions/45454992/…
Sanjay Mangaroliya

20

Tất cả các câu trả lời cho câu hỏi này đều không hiệu quả. Cách tốt nhất để công bằng Android setVisibility: Phương pháp Gone trên iOS là StackViewđầu tiên chọn các thành phần sau đó trong trình chỉnh sửa, nhúng vào, Chế độ xem ngăn xếp,

kết nối chế độ xem ngăn xếp mới với IBOutlet, sau đó:

ẩn:

UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
        firstView.hidden = YES;

hiển thị:

UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
        firstView.hidden = NO;

khi sử dụng chế độ xem ngăn xếp, tất cả các ràng buộc sẽ được lưu giữ!

Tài liệu


Thực ra có vẻ như là một giải pháp thực sự tốt, nhưng điều đáng lưu ý là nó cần iOS9 +.
dùng3533716

Tôi đã sử dụng giải pháp tuyệt vời của bạn (+1 cho bạn, cảm ơn rất nhiều !!) nhưng tôi đã kết nối trực tiếp qua IBOutlet chế độ xem mà tôi muốn hiển thị và ẩn, vì vậy tôi chỉ phải nhập một dòng mã! :)
Cristina De Rito

1
Câu trả lời này thực sự không chính xác. Android View.GONE xóa chế độ xem trên giao diện người dùng. Ví dụ: nếu bạn đặt View.GONE một phần tử, các chế độ xem bên dưới wiew đó sẽ chuyển lên. Vì vậy, đề xuất của bạn chỉ ẩn chế độ xem bằng với View.HIDE. Hãy xem câu trả lời này: stackoverflow.com/questions/11556607/…
emin denz

Tôi không tìm kiếm trên api android ... Nhưng tôi là nhà phát triển thiết bị di động, vì vậy tôi biết thợ máy ... Trong Android với chế độ xem cờ boolean có thể xem được hoặc không (Bỏ qua, hiển thị) Nếu nó bị xóa khỏi ui thì sẽ khó thêm một lần nữa ... nhưng trong ios, nó trong bố trí nhưng không có dấu cách .... Hơn nữa có đã chính thức iOS sở hữu ẩn đó diễn ra ... UIStackview tài sản ẩn như android View.Gone
Ucdemir

16

thêm giới hạn chiều cao vào chế độ xem của bạn như sau:nhập mô tả hình ảnh ở đây

sau đó tạo một lối thoát cho giới hạn chiều cao trong tệp viewController của bạn như sau:nhập mô tả hình ảnh ở đây

& sau đó trong phương thức viewDidLoad của bạn thay đổi chiều cao ràng buộc thành 0 như sau:

override func viewDidLoad() {
    super.viewDidLoad()
nsLcButtonHeight.constant = 0
}

1
Chiều cao không đổi rất tệ, tôi sử dụng chiều cao và hệ số bằng nhau, ví dụ: lấy 25% chế độ xem của phụ huynh, có ví dụ nào cho nó không?
user924

8

Để đạt được chức năng Androids.GONE trên iOS là sử dụng UIStackView. Sau đó giấu trẻ theo vị trí. ( Tài liệu về Táo )

SWIFT 4:

let firstView = cell.rootStackView.arrangedSubviews[0]
    firstView.isHidden = true // first view gone

Đó là một ví dụ về ô bảng, chỉ cần đặt cả hai bên trong Stack viewvà lấy mục cho GONEđứa trẻ.

nhập mô tả hình ảnh ở đây


6

Những gì bạn có thể làm là nhóm các chế độ xem của mình dưới chế độ xem ngăn xếp. Sau đó, khi bạn ẩn một chế độ xem cụ thể, các chế độ xem còn lại sẽ được chuyển tự động để lấp đầy khoảng trống.

Bạn có thể muốn xem Tài liệu Apple trên Chế độ xem ngăn xếp: https://developer.apple.com/reference/uikit/uistackview

hoặc các hướng dẫn trực tuyến như: https://www.appcoda.com/stack-views-intro/


1

1) Nếu các nút của bạn được đặt theo chiều dọc thì bạn phải đặt thành height0 và trong trường hợp các nút được đặt theo chiều ngang, hãy thử đặt widththành 0 hoặc bạn có thể đặt cả hai thành 0.

HOẶC LÀ

2) bạn có thể thử cách tiếp cận này đặt button2trên button1:

- (void)viewDidLoad
{
[super viewDidLoad];

UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button1 setTitle:@"hello" forState:UIControlStateNormal];

UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setTitle:@"world" forState:UIControlStateNormal];

[button1 sizeToFit]; [button2 sizeToFit];
[button2 setFrame:CGRectMake(button1.frame.origin.x, button1.frame.origin.y, button2.frame.size.width, button2.frame.size.height)];

[self.view addSubview:button1];
[self.view addSubview:button2];

}


1

Câu hỏi này khá cũ nhưng điều tôi đã tìm thấy là thiết lập các ràng buộc bổ sung (vì vậy các khung nhìn xung quanh chế độ xem "đã biến mất" biết phải làm gì khi nó bị thiếu)

A  which you want to be     A
|  after setting B to gone  |
B                           C
|                               
C                               
  1. Đặt ràng buộc mức độ ưu tiên thấp hơn (750) từ C đến A.
  2. Thêm các ràng buộc trên cùng và dưới cùng của B (hoặc trái và phải nếu bạn muốn chế độ xem của mình thu gọn theo chiều ngang) vào một mảng NSLayoutConstraint bConstraints. Làm điều này bằng cách:
    1. Điều khiển nhấp và kéo từ ràng buộc vào ViewController
    2. Thay đổi kết nối từ Outlet sang Outlet Collection
    3. Để đặt tên bConstraints.
    4. Nhấn kết nối. Điều này sẽ tạo một @IBOutlet var bConstraints: [NSLayoutConstraint]!trong ViewController của bạn
    5. Để thêm các ràng buộc bổ sung: kéo từ ràng buộc trong Storyboard đến tên biến @IBOutlet
  3. Sau đó ẩn B

    B.hidden = true
    NSLayoutConstraint.deactivateConstraints(bConstraints)
    
  4. Để hiện

    B.hidden = false
    NSLayoutConstraint.activateConstraints(bConstraints)
    

Rõ ràng là bạn càng có nhiều chế độ xem thì điều này càng phức tạp hơn, vì bạn cần các ràng buộc bổ sung từ mỗi chế độ xem


nó sẽ hữu ích hơn nếu bạn giải thích lý do tại sao bạn không thể thực hiện
wyu

Điểm thứ hai. Tôi đang làm việc ở Xamarin. Vẫn chưa tìm ra giải pháp cho vấn đề này. Không biết bạn nên xây dựng một mảng NSLayoutConstraint với các ràng buộc B. Tôi cho rằng nó được thực hiện theo chương trình, sẽ rất vui khi xem mã cho điều đó. Phương pháp của bạn dường như đối với tôi là cách hợp lý nhất của việc giải quyết vấn đề này, tuy nhiên không phải dễ thực hiện chỉ với pseudo-code
Gustavo Baiocchi Costa

Tôi chưa sử dụng Xamarin. Cách thực hiện trong XCode là: ctrl-click và kéo từ ràng buộc vào ViewController (điều này tương tự như cách bạn tạo IBOutlet trong xcode). Trong cửa sổ bật lên xuất hiện (trông giống với i.stack.imgur.com/JegLK.png ), hãy thay đổi trình đơn thả xuống "Kết nối" từ Outletthành Outlet Collection. Đối với các ràng buộc bổ sung, hãy kéo ctrl trực tiếp đến tên biến. Tôi có thể tải lên ảnh chụp phong cảnh sau ngày hôm nay (trong ~ 8 giờ)
wyu

vì vậy mảng NSLayoutConstraint là bộ sưu tập cửa hàng, có một chút bị mất ở đây haha, tks bạn đã dành thời gian trả lời câu hỏi của tôi :)
Gustavo Baiocchi Costa

vâng, tôi sẽ cập nhật câu trả lời để rõ ràng hơn. Vì vậy, giải pháp đang làm việc cho bạn?
wyu

0

Như nghiên cứu của tôi đã chỉ ra, ngay cả Tự động thanh toán cũng không thể giúp bạn. Bạn phải thay thế thủ công các chế độ xem bị ảnh hưởng bởi thành phần được hiển thị tùy chọn (trong trường hợp của tôi, tất cả các chế độ xem ở dưới cùng của chế độ xem tùy chọn, nhưng bạn chắc chắn rằng bạn có thể điều chỉnh điều này để xử lý tất cả các nút ở bên phải nút tùy chọn của bạn ):

- (IBAction)toggleOptionalView:(id)sender {
    if (!_expanded) {
        self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, _optionalHeight);
        self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y+_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
        _expanded = YES;
    } else {
        self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, 0);
        self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y-_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
        _expanded = NO;

    }
}

Không nên mã hóa cứng chiều cao / chiều rộng của các thành phần tùy chọn, nếu không, mã của bạn bị hỏng mỗi khi bạn chỉnh sửa XIB / Storyboard. Tôi có một trường float _optionalHeight mà tôi đã đặt trong viewDidLoad, vì vậy nó luôn được cập nhật.


0

Bạn cũng có thể xóa trang hoặc ít nhất một số ô nhất định của trang và xác định lại toàn bộ. Nó nhanh và hoạt động tốt. Tôi đã không viết mã nhưng tìm thấy nó trong dự án có sẵn này mà tôi đang làm việc. Tạo ManagementTableSectionManagementTableCellcác lớp để quản lý tất cả. Xin lỗi, tôi không thể cung cấp mã xác định rõ hơn.


0

Dựa trên câu trả lời do Deniz cung cấp, đây là một giải pháp sử dụng các ràng buộc trong Swift

Ví dụ: Nếu bạn có 3 chế độ xem, A_view B_view và C_view được căn chỉnh theo chiều dọc theo thứ tự đó và bạn muốn "Ẩn" B và cũng điều chỉnh sự khác biệt, hãy thêm một ràng buộc

B_view.removeFromSuperView()
var constr = NSLayoutConstraint(item: C_view, 
                                attribute: NSLayoutAttribute.Top, 
                                relatedBy: NSLayoutRelation.Equal, 
                                toItem: A_view, 
                                attribute: NSLayoutAttribute.Bottom,
                                multiplier: 1,
                                constant: 20)
view.addConstraint(constr)

hằng số là (trong trường hợp này) lượng không gian dọc giữa C_view và A_view


0

Tôi đã thêm một thuộc tính mới vào triển khai UIView tùy chỉnh được gọi là "hiển thị", khi được đặt thành false, sẽ thêm một ràng buộc để thu gọn chế độ xem (Tôi chỉ thêm một ràng buộc chiều rộng vì danh sách của tôi nằm ngang, nhưng cách tốt nhất có thể là thêm một hạn chế chiều cao của 0).

var visible:Bool = true{
        didSet{
            if(visible){
                clipsToBounds = false;
                removeConstraint(hideConstraint!)
            }else{
                clipsToBounds = true
                addConstraint(hideConstraint!)
            }
        }
    }

Bạn cần khởi tạo ràng buộc chiều rộng bằng không trên dạng xem và thêm nó dưới dạng một trường:

private var hideConstraint:NSLayoutConstraint?


func someInitFunction(){
    hideConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 0.0)
    ...
}

-3

setHidden: TRUE / FALSE tương đương gần nhất với Android View.GONE / VISIBLE.

Chế độ xem không nhất thiết phải chiếm không gian nếu không nhìn thấy!

Tôi đã tạo ComboBox-Alike với ListView đặt trên các chế độ xem khác. Tôi chỉ hiển thị khi chọn:

nhập mô tả hình ảnh ở đây


bạn quên rằng trong android chúng ta cũng có view.invisible ... view.gone không tương tự như setHidden ... view.invisible của nó tương tự như setHidden
Nav
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.