autolayout - tạo chiều cao của chế độ xem tương đối với một nửa chiều cao giám sát


136

gần đây đã bắt đầu tự động và tôi bị mắc kẹt với những gì có vẻ như là một ví dụ thực sự tầm thường. Tôi có một quan điểm rằng tôi muốn ngồi ở phía trên màn hình và chiếm một nửa chiều cao màn hình. Đơn giản trước khi tự động thanh toán - chỉ cần giải quyết nó tại chỗ và bảo nó mở rộng theo chiều dọc khi giám sát thay đổi kích thước.

Bây giờ, tôi không thể cho cuộc sống của tôi thấy làm thế nào để làm điều đó. Đây là những gì tôi nhận được khi tôi cố gắng thiết lập điều này:

blues tự động

Giới hạn không gian phía dưới được đặt thành "bằng 284", điều này hoàn toàn và hoàn toàn vô dụng đối với tôi khi tôi thay đổi bố cục iPhone4, vì nó giữ cho không gian 284 điểm ở dưới cùng của màn hình và thu nhỏ tầm nhìn xuống không còn một nửa kích thước của màn hình. Và không có cách nào để thiết lập ràng buộc đó bằng một phần nhỏ của chiều cao của bất kỳ chế độ xem nào khác ..

Sau khi vật lộn một lúc, cách duy nhất tôi có thể nghĩ để làm điều này là giới thiệu một góc nhìn khác bên dưới khung nhìn này, ghim chiều cao của chúng bằng nhau, để chúng ngồi phía trên và bên dưới nhau và sau đó đặt chế độ xem thứ hai (phía dưới) thành vô hình .. có vẻ hơi xấu xí!

Tôi có thiếu một cái gì đó rõ ràng? ..


1
Tôi không nghĩ nó xấu, nhưng một mẹo thông minh để có được những gì bạn muốn bằng IB. Tôi đã làm điều này, và khi bạn sử dụng tên thành phần thích hợp, bạn có thể làm rõ những gì đang xảy ra. Bạn thậm chí có thể có một yếu tố thứ ba trên một vị trí hoặc trung tâm khác nhau, thay đổi kích thước dựa trên hai lần xem xét này.
Jelle

Câu trả lời:


167

Điều này hiện có thể có trong IB kể từ [ít nhất] Xcode 5.1.1. Mặc dù đôi khi tôi phải nhận ra rằng nó thực sự siêu đơn giản:

Đầu tiên tạo một ràng buộc căn chỉnh trên cùng cơ bản (bạn cũng sẽ cần thiết lập các ràng buộc dưới, trái và phải, như bình thường). Sau đó chọn ràng buộc và điều hướng đến thanh tra thuộc tính :

Trình diễn các bước trên

Sau đó, bạn có thể điều chỉnh hệ số nhân. Nếu bạn muốn nó 50% số lượt xem siêu hãy để nó ở 1, vì nó được căn chỉnh theo trung tâm của siêu. Đây cũng là một cách tuyệt vời để tạo các chế độ xem cũng là tỷ lệ phần trăm khác (như 25% siêu lượt xem)

Trình diễn bước thứ hai ở trên


hay :) Tôi nghĩ bài đăng này nên được đánh dấu là câu trả lời được chấp nhận :) Nhà phát triển iOS thường thích Giải pháp Trình tạo giao diện hơn là giải pháp giống như mã
hqt

@hqt, Cảm ơn. Tôi nghĩ rằng khi câu trả lời được chấp nhận đã được viết thì phương pháp này không có sẵn. Đôi khi người hỏi không xem lại câu hỏi cũ hoặc quan tâm để thay đổi câu trả lời được chấp nhận. Nhưng cuối cùng tôi chỉ ở đây để giúp đỡ, rất vui vì điều đó đã làm!
Firo

3
Tôi hơi bối rối. Tôi đã thử điều này nhưng nó chỉ tập trung tầm nhìn vào giám sát, nó không điều chỉnh chiều cao của chế độ xem.
Trưởng khoa

@Dean, bạn cần phải chắc chắn rằng First ItemView.Topkhông View.Center Y. Nếu không, có nó sẽ chỉ trung tâm nó. Bạn cũng sẽ cần đảm bảo các ràng buộc khác được đặt đúng để xử lý các cạnh khác của khung nhìn.
Firo

1
View.Top tương đương với Superview.Center Y số nhân 1 cho bạn không có chiều cao. Câu trả lời này không đầy đủ. Tất cả bạn phải làm là suy nghĩ về những gì bạn đang nói và bạn có thể thấy nó cung cấp cho bạn một đường ngang qua trung tâm! Tôi sẽ chỉnh sửa câu trả lời này để làm rõ những hạn chế khác mà bạn đang nói đến.
cườiBot

184

Giải pháp Storyboard nơi bạn có thể đặt tỷ lệ chính xác giữa mọi chế độ xem:

Đặt ràng buộc bình đẳng chiều cao

Hiện nay:

Chỉnh sửa hệ số nhân của ràng buộc

LỢI NHUẬN!!!

Kết quả

PS Cũng lưu ý rằng phương pháp này hoạt động với các chế độ xem ở các mức lồng khác nhau và (rõ ràng) áp dụng cho chiều rộng

PPS đôi khi có thể hữu ích để "đảo ngược mục thứ nhất và mục thứ hai" của ràng buộc hoặc đặt hệ số nhân đảo ngược (ví dụ 2 thay vì 0,5) (nhưng các phương pháp này không hữu ích nếu bạn không hiểu cách các quan điểm liên quan với nhau).


1
Bước 2 dường như không hiệu quả với tôi. Tôi không thể chọn bất cứ điều gì trong bảng điều khiển ngoại trừ bật 'Hạn chế lề'. Tôi đang cố gắng đặt độ rộng của UIImageView trong UITableViewCell thành 50% chế độ xem nội dung.
DrMickeyLauer

2
CẬP NHẬT: Rõ ràng trình xây dựng giao diện không cho phép chế độ xem nội dung là mục tiêu rõ ràng của bất kỳ ràng buộc bố cục tự động nào. Tôi phải chèn một khung nhìn giả như con của chế độ xem nội dung để thực hiện công việc này.
DrMickeyLauer

1
Nó làm việc cho tôi. Bạn cần chọn hai chế độ xem trong danh sách chứ không phải màn hình trình tạo. đối với tỷ lệ phần trăm chia chế độ xem nhỏ hơn cho chế độ xem lớn hơn để lấy ví dụ về giá trị số nhân nhỏ hơn 25, chế độ xem lớn hơn 135 - 25/135 = 0,185. Đặt giá trị này làm giá trị số nhân để có chế độ xem tại x1 và x2 = 25 nhưng tăng tỷ lệ với 6 và 6 cộng lớn hơn, v.v.
latenitecoder

1
Điều này hiệu quả với tôi, nhưng xin lưu ý rằng tôi cũng phải thêm ba ràng buộc để đặt các ràng buộc lề của
khung nhìn phụ

Đây phải là câu trả lời được chấp nhận. Đầu tiên tôi thử chấp nhận câu trả lời. Nó không hoạt động sau đó tôi cuộn xuống và tôi thấy câu trả lời này và nó đã hoạt động. Cảm ơn!
Mihir Oza

31

Sau một thời gian nữa tôi đã nghĩ ra những điều sau.

Tôi nhận thấy đây là một câu trả lời nhưng nó không thỏa mãn lắm, vì nó cho rằng bạn thực sự không thể làm điều này trong Trình tạo giao diện, nhưng có thể thêm các ràng buộc chính xác vào mã sau đó như sau:

- (void) viewWillAppear:(BOOL)animated
{

    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview
                                                                 attribute:NSLayoutAttributeHeight 
                                                                 relatedBy:0 
                                                                    toItem:self.view
                                                                 attribute:NSLayoutAttributeHeight
                                                                multiplier:.5 
                                                                  constant:0];
    [self.view addConstraint:constraint];

}

Về cơ bản, nó đặt hệ số nhân là 0,5 so với chiều cao của self.view, hoạt động trên upperview. Tôi đã phải đặt mức độ ưu tiên của ràng buộc không gian dọc dưới cùng trong IB xuống dưới 1000 để tránh một loạt các thông báo thời gian chạy về việc phá vỡ các ràng buộc.

Vì vậy, nếu bất cứ ai có thể chỉ ra cách thực hiện điều này trong Trình tạo giao diện, điều đó sẽ trả lời tốt hơn câu hỏi của tôi, nếu không tôi đoán điều này cũng tốt như bây giờ (bây giờ) ???


3
Tôi nghĩ rằng điều này là tốt như bây giờ. Sẽ thật tuyệt nếu Apple cấp cho chúng tôi quyền truy cập vào giá trị số nhân trong IB, do đó có thể được đặt cũng như hằng số.
ndelmar

3
Đối với bất kỳ ai đang xem câu trả lời này, Xcode 5.1 hiện cho phép bạn đặt hệ số nhân thông qua Trình tạo giao diện. Bây giờ tôi có thể định cấu hình các chế độ xem bằng một nửa chiều cao của giám sát của họ thông qua IB.
Mark Krenek

9

Hơi dễ dàng và dễ dàng hơn so với phương pháp so với câu trả lời của Fyodor Volchyok. -Nhấp nút điều khiển và bấm vào khung nhìn phụ. -Làm giữ nút lệnh, kéo con trỏ đến giám sát rồi bấm vào giám sát. -Chọn "Tỷ lệ khung hình".

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

-Sau đó bấm vào Trình kiểm tra kích thước. -Sau đó nhấp đúp chuột vào ràng buộc. nhập mô tả hình ảnh ở đây

-Hãy chắc chắn rằng "chiều cao" được chọn cho cả hai mục. nhập mô tả hình ảnh ở đây

-Sau đó thay đổi "Hệ số nhân" thành 0,5 cho một nửa màn hình hoặc bất kỳ phần nào của giám sát mà bạn mong muốn. nhập mô tả hình ảnh ở đây


Cách tiếp cận dễ dàng và nhanh chóng! Cảm ơn người bạn đời
Abdullah Saeed

7

Ngoài ra tôi cũng có một khả năng khác trong mã trong trường hợp bạn có 2 chế độ xem cả hai nên có cùng chiều cao: chỉ cần đặt chiều cao của view2 thành chiều cao của view1 (mẹo ở đây không đặt rõ chiều cao của view1).

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];

Không nhận ra bạn có thể tham chiếu các chế độ xem khác cho chiều rộng / chiều cao như thế. Đây là câu trả lời rõ ràng nhất IMO nếu bạn đã sử dụng ngôn ngữ định dạng trực quan.
loeschg

Ví dụ @brainray cũng được giải thích tại developer.apple.com tại đây
alecs.popa

0

Phiên bản Swift của câu trả lời của Mete:

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.



    upperView.translatesAutoresizingMaskIntoConstraints = false


    var constraint = NSLayoutConstraint(item: upperView,
                                        attribute: NSLayoutAttribute.top,
                                        relatedBy: NSLayoutRelation.equal,
                                        toItem: self.view,
                                        attribute: NSLayoutAttribute.top,
                                        multiplier: 1,
                                        constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.height,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.height,
                                    multiplier: 0.5,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.leading,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.leading,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.trailing,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.trailing,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


}
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.