autolayout - yarı denetim yüksekliğine göre görüş yüksekliği yapın


136

son zamanlarda autolayouts'a giriyorum ve gerçekten önemsiz bir sorun örneği gibi görünüyor. Ekranın üstünde oturmak ve ekran yüksekliğinin yarısını almak istediğim bir görünüm var. Otomatik düzenlemeden önce basit - yerine takın ve denetim yeniden boyutlandırıldığında dikey olarak genişlemesini söyleyin.

Şimdi, hayatım boyunca nasıl yapılacağını göremiyorum. Bunu ayarlamaya çalıştığım zaman:

autolayout blues

Alt boşluk kısıtlaması "284'e eşittir" olarak ayarlanmıştır, bu da iPhone4 düzenine geçtiğimde mutlak ve kesinlikle işe yaramaz, çünkü ekranın altında 284 puan alan tutuyor ve görünümü artık ekranın yarısı olmayacak şekilde daraltıyor ekran boyutu. Ve bu kısıtlamayı başka bir görünümün yüksekliğinin bir kısmına eşit olacak şekilde ayarlamanın bir yolu yoktur.

Bir süre mücadele ettikten sonra, bunu yapmayı düşünebilmemin tek yolu, bu görüşün altına başka bir bakış açısı getirmek, yüksekliklerini eşit olarak sabitlemek, birbirlerinin üstüne ve altına oturtmak ve daha sonra ikinci (alt) görünümü görünmez olarak ayarlamak olacaktır. .. bu biraz çirkin gözüküyor!

Açık bir şey mi kaçırıyorum? ..


1
Çirkin olduğunu düşünmüyorum, ama IB'yi kullanmak istediğinizi elde etmek için akıllı bir numara. Bunu yaptım ve uygun eleman adlarını kullandığınızda neler olup bittiğini netleştirebilirsiniz. Farklı bir konumda veya merkezlerde üçüncü bir öğeye bile sahip olabilirsiniz, bu iki alt görünüme göre boyutu değiştirin.
Jelle

Yanıtlar:


167

Bu artık IB'de [en azından] Xcode 5.1.1'den itibaren mümkün. Anlamak bir zaman almamı rağmen aslında çok basit:

Öncelikle temel bir üst hizalama kısıtlaması oluşturun (normal gibi alt, sol ve sağ kısıtlamaları da ayarlamanız gerekir). Ardından, kısıtlamayı seçin ve Özellik denetçisine gidin :

Yukarıdaki adımların gösterilmesi

Sonra çarpanı ayarlayabilirsiniz. Süper görünümün% 50'sini istiyorsanız 1, süper merkezine göre hizalandığı için bırakın . Bu, diğer yüzdeler de olan görünümler oluşturmanın harika bir yoludur (süper görüntülemenin% 25'i gibi)

Yukarıdaki ikinci adımın gösterilmesi


güzel :) Ben bu yazı kabul edilen cevap olarak işaretlenmesi gerektiğini düşünüyorum :) iOS Geliştirici genellikle kod benzeri bir çözüm yerine Arayüz Oluşturucu Çözümü tercih ediyor
hqt

@hqt, Teşekkürler. Kabul edilen cevap yazıldığında bu yöntem mevcut değildi. Bazen sorulan sorular eski soruları tekrar ziyaret etmez veya kabul edilen cevabı değiştirmeye özen göstermez. Ama sonuçta ben sadece yardım için buradayım, sevindim!
Firo

3
Biraz kafam karıştı. Bunu denedim ama sadece görüntüyü denetime merkezliyor, görünümün yüksekliğini ayarlamıyor.
Dean

@Dean, emin olmak gerekir First Itemolduğunu View.Topdeğil View.Center Y. Aksi takdirde, evet sadece ortalar. Ayrıca, görünümün diğer kenarlarını işlemek için diğer kısıtlamaların doğru ayarlandığından da emin olmanız gerekir.
Firo

1
View.Top, Superview'e eşittir. Merkez Y çarpanı 1 size yükseklik kazandırmaz. Bu cevap eksik. Tek yapmanız gereken, söylediklerinizi düşünmek ve bunun size merkez boyunca bir çizgi verdiğini görebilirsiniz! Bu yanıtı, başka hangi kısıtlamalardan bahsettiğinizi açıklığa kavuşturmak için düzenlerim.
smileBot

184

Herhangi bir görünüm arasında tam oran ayarlayabileceğiniz film şeridi çözümü:

Yükseklik eşitliği sınırlamasını ayarlama

Şimdi:

Kısıtlamanın çarpanını düzenle

KAR !!!

Sonuç

PS Ayrıca, bu yöntemin farklı yuvalama düzeylerindeki görünümlerle çalıştığını ve (açıkçası) genişlik için geçerli olduğunu unutmayın

PPS bazen kısıtlamanın "birinci ve ikinci öğelerini tersine çevirmek" veya ters çarpanı (örneğin 0,5 yerine 2) ayarlamak yararlı olabilir (ancak görünümlerin birbirleriyle nasıl ilişkili olduğunu anlamadıysanız) bu yöntemler yardımcı olmaz.


1
Adım 2 benim için çalışmıyor gibi görünüyor. Panelde 'Kenar boşluğu kısıtlaması' arasında geçiş yapmak dışında hiçbir şey seçemiyorum. İçerik görünümü% 50 UITableViewCell bir UIImageView genişliğini ayarlamak çalışıyorum.
DrMickeyLauer

2
GÜNCELLEME: Açıkçası arayüz oluşturucu, içerik görünümünün herhangi bir otomatik düzen kısıtlamasının açık hedefi olmasına izin vermez. Bunu yapmak için içerik görünümünün alt öğesi olarak bir kukla alt görünüm eklemek zorundayım.
DrMickeyLauer

1
Benim için çalışıyor. Oluşturucu ekranını değil, listedeki iki görünümü seçmeniz gerekir. yüzdeler için, çarpan değeri örnek daha küçük görünüm 25, daha büyük görünüm 135 - 25/135 = 0.185 elde etmek için daha küçük görünümü daha büyük görünüme böler. X1 ve x2 = 25'te daha büyük 6 ve 6 artı
vb.İle

1
Bu benim için çalıştı, ancak alt görünümün kenar boşluğu sınırlarını 0'a ayarlayan üç kısıtlama da eklemem gerektiğini lütfen unutmayın. Teşekkürler
raddevus

Bu kabul edilen cevap olmalı. Önce kabul edilen cevabı deniyorum. İşe yaramadı sonra aşağı kaydırdım ve bu cevabı gördüm ve işe yaradı. Teşekkürler!
Mihir Oza

31

Biraz daha zaman geçirdikten sonra aşağıdakileri buldum.

Bunu bir cevap olarak görüyorum ama çok tatmin edici değil, çünkü aslında Arayüz Oluşturucu'da bunu yapamayacağınızı varsayar, ancak daha sonra kodda doğru kısıtlama eklenebilir:

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

}

Temel olarak, kendi bakış açısına karşı 0.5 çarpanını ayarlar. Kısıtlama kısıtlamaları hakkında bir sürü çalışma zamanı iletisinden kaçınmak için IB'deki alt dikey boşluk kısıtlamasının önceliğini 1000'den daha düşük bir değere ayarlamak zorunda kaldım.

Herkes bu Arayüz Oluşturucu bunu nasıl gösterebilir, bu daha iyi benim soruya cevap, aksi takdirde bu (şimdiye kadar) alır gibi iyi sanırım ???


3
Bence bu şu anki kadar iyi. Apple'ın IB'deki çarpan değerine erişmesini sağlaması iyi olurdu, böylece sabit de ayarlanabilir.
rdelmar

3
Bu cevaba bakan herkes için, Xcode 5.1 artık çarpanı Arayüz Oluşturucu aracılığıyla ayarlamanıza izin veriyor. Artık IB aracılığıyla denetimlerinin yarısı yükseklikte görünümler yapılandırabilirim.
Mark Krenek

9

Fyodor Volchyok'un cevabından biraz daha kolay ve daha basit bir yöntem. -Kontrol düğmesini basılı tutun ve alt görünüme tıklayın. -Komut düğmesini basılı tutarak imleci denetimin üstüne sürükleyin ve ardından denetimin üzerine tıklayın. - "En Boy Oranı" nı seçin.

resim açıklamasını buraya girin

-Ardından Müfettiş'i tıklayın. -Sonra kısıtlamaya çift tıklayın. resim açıklamasını buraya girin

-Her iki öğe için "yükseklik" seçili olduğundan emin olun. resim açıklamasını buraya girin

-Ardından ekranın yarısı veya istediğiniz denetimin herhangi bir kısmı için "Çarpanı" 0,5 olarak değiştirin. resim açıklamasını buraya girin


Kolay ve hızlı yaklaşım! Teşekkürler dostum
Abdullah Saeed

7

Ben de aynı yüksekliğe sahip olması gereken 2 görünüm olması durumunda kod başka bir olasılık var: sadece view2 yüksekliğini view1 yüksekliğine ayarlayın (burada hile view1 yüksekliği açıkça ayarlamıyor).

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

Bunun gibi genişlikler / yükseklikler için diğer görünümlere başvurabileceğinizi fark etmedim. Zaten görsel biçim dilindeyseniz, bu en temiz yanıt IMO'sudur.
loeschg


0

Mete'nin cevabının hızlı versiyonu:

    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)


}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.