autolayout - membuat ketinggian pandangan relatif terhadap setengah superview tinggi

telah masuk ke autolayouts baru-baru ini dan saya'm terjebak pada apa yang tampaknya seperti benar-benar masalah sepele misalnya. Saya memiliki pandangan yang ingin saya duduk di bagian atas layar, dan mengambil setengah dari layar-tinggi. Sederhana sebelum autolayout - hanya taktik itu di tempat dan mengatakan itu untuk memperluas secara vertikal ketika superview mengubah ukuran.

Sekarang, saya dapat't untuk kehidupan saya, melihat bagaimana untuk melakukan itu. Berikut ini's apa yang saya dapatkan ketika saya mencoba untuk mengatur ini:

Ruang bawah kendala diatur ke "sama dengan 284", yang mutlak dan benar-benar berguna untuk saya ketika saya mengubah ke iPhone4 tata letak, karena itu membuat 284 poin ruang di bagian bawah layar, dan menyusut pandangan untuk tidak lagi menjadi setengah ukuran layar. Dan ada's tidak ada cara untuk menetapkan bahwa kendala yang sama beberapa fraksi lain yang melihat's tinggi..

Setelah berjuang untuk sementara waktu, satu-satunya cara saya bisa berpikir untuk melakukan hal ini akan memperkenalkan anda lihat di bawah ini lihat, pin ketinggian mereka sama-sama, mereka duduk di atas dan di bawah satu sama lain dan kemudian set kedua (bawah) tampilan yang akan terlihat.. yang tampaknya sedikit jelek!

Aku kehilangan sesuatu yang jelas?..

Mengomentari pertanyaan (1)

Storyboard solusi di mana anda dapat mengatur rasio yang tepat antara setiap pandangan:

Sekarang:

KEUNTUNGAN!!!

P. S. Juga dicatat bahwa metode ini bekerja dengan pemandangan yang berbeda bersarang tingkat dan (jelas) yang berlaku untuk lebar

P. P. S. kadang-kadang ini mungkin bisa membantu untuk "reverse pertama dan kedua item" kendala atau mengatur reverse multiplier (misalnya 2 bukan 0,5) (tapi metode ini tidak membantu jika anda don't memahami bagaimana pandangan berhubungan antara satu sama lain).

Komentar (5)
Larutan

Ini sekarang mungkin di IB pada [setidaknya] Xcode 5.1.1. Meskipun butuh beberapa waktu untuk mencari tahu hal ini benar-benar sangat sederhana:

Pertama buat atas dasar keselarasan kendala (anda juga akan perlu untuk setup bawah, kiri, dan kanan kendala, seperti normal) . Kemudian pilih kendala dan arahkan ke Atribut inspektur:

Kemudian anda dapat mengatur multiplier. Jika anda ingin 50% super view meninggalkannya di 1, sejak itu selaras per super's pusat. Ini juga merupakan cara yang bagus untuk menciptakan pandangan yang lain persentase terlalu (25% super view)

Komentar (6)

Setelah sedikit lebih banyak waktu untuk aku've datang dengan berikut ini.

I'm mencatat itu sebagai jawaban tapi itu's sangat tidak memuaskan, karena ini mengasumsikan anda dapat't benar-benar melakukan hal ini dalam Interface Builder, tapi yang benar kendala dapat ditambahkan pada kode sesudahnya sebagai:

- (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];

}

Pada dasarnya, set multiplier dari 0,5 terhadap ketinggian mandiri.lihat, yang bekerja pada upperview. Aku harus mengatur prioritas dari bawah ruang vertikal kendala di IB yang lebih rendah dari 1000 untuk menghindari sekelompok runtime pesan tentang melanggar kendala juga.

Jadi jika ada yang bisa menunjukkan bagaimana untuk melakukan hal ini dalam Interface Builder, yang akan lebih baik menjawab pertanyaan saya, kalau tidak saya kira ini adalah sebagai baik karena mendapat (untuk saat ini)???

Komentar (2)

Sedikit lebih mudah dan lebih lurus ke depan dari metode dari Fyodor Volchyok's jawaban. -Tahan tombol control dan klik pada subview. -Masih menekan pada tombol perintah, tarik kursor ke superview kemudian klik pada superview. -Pilih "Aspek Rasio".

-Kemudian klik Ukuran Inspektur. -Kemudian double klik pada kendala.

-Pastikan bahwa "tinggi" dipilih untuk kedua item.

-Kemudian mengubah "Multiplier" 0,5 untuk setengah layar, atau apapun fraksi superview yang anda inginkan.

Komentar (1)

Di sana aku juga kemungkinan lain di kode dalam kasus anda memiliki 2 pandangan yang kedua harus memiliki ketinggian yang sama: hanya mengatur ketinggian view2 dengan tinggi 1 (kuncinya di sini adalah tidak menetapkan ketinggian 1 eksplisit).

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

Swift versi Mete's jawaban:

    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)

}
Komentar (0)