Kakao Otomatik Yerleşimi: içerik sarılma ve içerik sıkıştırma direnci önceliği


643

İçerik sarılması ve sıkıştırma direnci arasındaki fark hakkında Cocoa Autolayout ile ilgili Apple belgelerinde net bir cevap bulamıyorum.

Birisi kullanımlarını ve farklılıklarını açıklayabilir mi?


49
Hayatın en büyük gizemli nedenlerinden biri, buna sadece "Genişleme Direnci" demedikleri nedenidir. İki nitelik "Genleşme Direnci" ve "Sıkıştırma Direnci" den başka bir şey değildir . "Sarılma" terminolojisi deliliktir.
Fattie

3
Eğer o zaman çok fazla oda var content-hugging: boşluk olan mücadele ederim. Sadece manzarayı etrafınızda dolaşmaya zorlardı. Ama eğer sen çok fazla yer var ve bunun yerine daha sonra çok az yer yok content-compressions-resistancetüm içeriğini göstermek mümkün olmayan adresinin görünümü karşı mücadele edeceklerini, örneğin etiketler kesilmiş olacaktı.
Bal

Yanıtlar:


1319

Kavramların kısa bir özeti:

  • Hugging => içerik büyümek istemiyor
  • Sıkıştırma Direnci => içerik küçülmek istemiyor

Misal:

Diyelim ki böyle bir düğmeniz var:

[       Click Me      ]

ve kenarları 500 önceliği olan daha büyük bir denetime sabitlediniz.

Daha sonra, Hugging önceliği> 500 ise şöyle görünür:

[Click Me]

Hugging önceliği <500 ise şöyle görünür:

[       Click Me      ]

Denetim şimdi küçülürse, Sıkıştırma Direnci önceliği> 500 ise, şöyle görünür

[Click Me]

Sıkıştırma Direnci önceliği <500 ise, şöyle görünebilir:

[Cli..]

Bu şekilde çalışmazsa, muhtemelen iyi işinizi bozan başka kısıtlamalarınız vardır!

Örneğin, önceliği 1000 olan denetime sabitleyebilirsiniz. Veya genişlik önceliğiniz olabilir. Öyleyse, bu yardımcı olabilir:

Editör> İçeriğe Uygun Boyut


37
Sarılma önceliği == 500 ise?
bradley.ayers

1
Ben ediyorum varsayalım (ama bu genellikle iyi bir fikir değil) tipik yuvarlama davranışına gibi> 500 gibi muamele görürdü. Yine de test etmedim.
Joshua Nozzi

büyük olasılıkla çalışma zamanında "
Aynı

8
@ bradley.ayers MaxDesyatov'un yorumuna göre, bu yalnızca Gerekli öncelik (1000) ile çelişen kısıtlamalarınız varsa gerçekleşir. İki düşük öncelikli sınırlama çakışırsa, çözüm belirsizdir, bu nedenle Otomatik Düzen motoru yalnızca bir geçerli çözüm seçer ve göreceğiniz şeydir (uyarı yok). Açıkçası bu iyi değil, çünkü şimdi düzeninizin nasıl görüneceğini seçmek Otomatik Düzen motorunun dahili uygulamasına bağlı ve teorik olarak bu bir iOS sürümünden diğerine değişebilir!
smileyborg

İçerik sarılma önceliği varsayılan değeri 250 ve içerik sıkıştırma direnci varsayılan değeri 750'dir.
ZYiOS

292

Autolayout ile ilgili bu video eğitimine göz atın , dikkatlice açıklarlar

resim açıklamasını buraya girin


1
@fatuhoku tekrar kontrol edebilir, bu video ücretsiz
onmyway133

31
Sarılma ve Direnç tartışması videoda yaklaşık 13:15 noktada başlar.
Carl Smith

1
@ onmyway133 bu mükemmel bir video, ancak ne yazık ki Ray'in bunu nasıl kullandığına dair bir örnek yok.
Matrosov Alexander

@MatrosovAlexander Bence çok pratik bir örnek Autolayout ile Dinamik hücre yüksekliği olacaktır fantageek.com/1468/…
onmyway133 22:14

1
Sıkıştırma direncinin 18:05'te nasıl kullanılacağını gösterir
Brent Faust

187

resim açıklamasını buraya girin

Kaynak: mokagio

İçsel İçerik Boyutu - Oldukça açıklayıcıdır, ancak değişken içerikli görünümler, içeriklerinin ne kadar büyük olduğunun farkındadır ve bu özellik aracılığıyla içeriklerinin boyutunu açıklar. İçsel içerik boyutlarına sahip bazı açık örnek örnekleri UIImageViews, UILabels, UIButtons'dur.

İçerik Hugging Önceliği - Bu öncelik ne kadar yüksek olursa, bir görünüm gerçek içerik boyutundan daha fazla büyümeye direnir.

İçerik Sıkıştırma Direnci Önceliği - Bu öncelik ne kadar yüksek olursa, görünüm gerçek içerik boyutundan daha küçük küçülmeye daha fazla direnç gösterir.

Daha fazla açıklama için buraya bakın: OTO DÜZENİ BÜYÜSÜ: İÇERİK BOYUT ÖNCELİKLERİ


Resim güzel ama az söylemek yanıltıcı. En iyi adam "Büyümeyim (büyümeme izin ver)" demeli. Çocuk görüşü, içerik sarılma davranışı yoluyla büyümek istemediğini kendi başına tanımlar. Büyümesini durduran ekzojenik kuvvet (gösterilen eller gibi) yoktur. Bu büyük bir fark.
Manuel

6
Sadece illüstrasyonu sevdiğim için oy kullanıyorum.
James Bucanek

3
İşte bu yüzden Stack Overflow… Snowcrash'in açıklaması artı mokagio'nun bu resmi = bu özelliklerin her yerde en iyi açıklaması (Apple'ın kendi belgeleri dahil).
Kal

40

Diyelim ki "Beni tıkla" metnini içeren bir düğmeniz var. Bu düğme hangi genişlikte olmalı?

İlk olarak, düğmenin metinden daha küçük olmasını kesinlikle istemezsiniz. Aksi takdirde metin kırpılır. Bu yatay sıkıştırma direnci önceliğidir.

İkincisi, düğmenin olması gerekenden daha büyük olmasını istemezsiniz. Buna benzeyen bir düğme, [Beni tıkla] açıkçası çok büyük. Düğmenin çok fazla dolgu yapmadan içeriğini "sarmasını" istiyorsunuz. Bu, yatay içerik sarılma önceliğidir. Bir düğme için, yatay sıkıştırma direnci önceliği kadar güçlü değildir.


19

Öyleyse view.intrinsicContentSize.width != NSViewNoIntrinsicMetric, otomatik düzen özel bir tür kısıtlaması oluşturur NSContentSizeLayoutConstraint. Bu kısıtlama iki normal kısıtlama gibi davranır :

  • view.width <= view.intrinsicContentSize.widthyatay sarılma önceliği gerektiren bir kısıtlama ve
  • view.width >= view.intrinsicContentSize.widthyatay sıkıştırma direnci önceliği gerektiren bir kısıtlama .

Swift'te, iOS 9'un yeni düzen bağlantılarıyla, bunun gibi eşdeğer kısıtlamalar ayarlayabilirsiniz:

let horizontalHugging = view.widthAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalHugging.priority = view.contentHuggingPriority(for: .horizontal)

let horizontalCompression = view.widthAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalCompression.priority = view.contentCompressionResistancePriority(for: .horizontal)

Benzer şekilde, eğer view.intrinsicContentSize.height != NSViewNoIntrinsicMetricotomatik düzen NSContentSizeLayoutConstraintgörünümün yüksekliğinde iki kısıtlama görevi gören bir düzen oluşturur . Kod olarak, şöyle görünürler:

let verticalHugging = view.heightAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalHugging.priority = view.contentHuggingPriority(for: .vertical)

let verticalCompression = view.heightAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalCompression.priority = view.contentCompressionResistancePriority(for: .vertical)

Düzen çalıştıktan sonra NSContentSizeLayoutConstraintyazdırarak bu özel örnekleri (varsa) görebilirsiniz view.constraints. Misal:

label.constraints.forEach { print($0) }

// Output:
<NSContentSizeLayoutConstraint:0x7fd82982af90 H:[UILabel:0x7fd82980e5e0'Hello'(39)] Hug:250 CompressionResistance:750>
<NSContentSizeLayoutConstraint:0x7fd82982b4f0 V:[UILabel:0x7fd82980e5e0'Hello'(21)] Hug:250 CompressionResistance:750>

1
öyle değilse: let verticalCompression = view.heightAnchor.constraint (biggerThanOrEqualToConstant: view.intrinsicContentSize.height)
mc_plectrum

1
Evet, bir kopyala / yapıştır hatası yaptım. Ben düzelttim. Bana bildirdiğiniz için teşekkür ederim.
rob mayoff

15

İçerik Sarma ve İçerik Sıkıştırma Dayanımı Öncelikleri, içeriğe bağlı olarak boyutlarını kendiliğinden hesaplayabilen öğeler için çalışır.

Gönderen Elma docs :

resim açıklamasını buraya girin


Resim için artı1 (Y)
Noor Ali Butt

Kafam karıştı. Kaydırma özelliği etkin olmayan bir textView için. Bu, iç boyutu yazarak kullanıcı başına değişeceği anlamına mı geliyor?
Bal

@Honey Sanırım doğru kısıtlamalar ayarlanmış ve kaydırma devre dışı bırakılmış, metin görünümü iç yüksekliği söyleyebilmelidir.
dev gr

Soruma cevap vermedi. Çok fazla yazdığımda, textView'in şu anki boyutundan çok daha fazla ...
Bal

Kendin dene. Metin görüntüsüne sabit bir genişlik verin ve kaydırmayı devre dışı bırakın ve istediğiniz davranışı kontrol edin. Daha fazla yanıt için stackoverflow.com/a/21287306/1526629 adresine bakın .
dev gr

11

Content hugging priorityBir gibidir Kauçuk bant bir görünüm etrafına yerleştirilir. Öncelik değeri ne kadar yüksek olursa, lastik bant o kadar güçlü olur ve içerik boyutuna daha fazla sarılmak ister. Öncelik değeri lastik bandın "mukavemeti" gibi düşünülebilir

Ve Content Compression Resistancebir görünüm küçülmeye ne kadar “direnir” Yüksek direnç öncelik değerine sahip Görünüm, sıkıştırmaya direnecek olan görünümdür .

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.