UIScrollView Kaydırılabilir İçerik Boyutu Belirsizliği


510

Diğer geliştiriciler, Arayüz Oluşturucu'da (Xcode 5 / iOS 7) AutoLayout ile sorun yaşıyorum. Bu çok basit ve önemli, bence herkes bunun nasıl düzgün çalıştığını bilmeli. Bu Xcode'da bir hata ise, kritik bir hata!

Yani, böyle bir görünüm hiyerarşisine sahip olduğum zaman başım belaya girer:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

UIScrollView'ın katı kısıtlamaları vardır, örneğin her taraftan 50 piksel (sorun yok). Daha sonra UILabel'e bir Üst Alan kısıtlaması ekliyorum (sorun yok) (ve etiketin yüksekliğini / genişliğini bile sabitleyebilirim, hiçbir şey değiştiremiyorum, ancak Etiketin iç boyutu nedeniyle gereksiz olmalı)

UILabel için bir sınırlama eklediğinizde sorun başlar:

Örneğin, Sondaki Boşluk: Denetim Eşittir: 25

Şimdi iki uyarı var - ve nedenini anlamıyorum:

A) Kaydırılabilir İçerik Boyutu Belirsizliği (Kaydırma Görünümünde belirsiz kaydırılabilir içerik yüksekliği / genişliği var)

B) Yanlış Yerleştirilen Görünümler (Etiket Beklenen: x = -67 Gerçek: x = 207

Bu minimal örneği indirebileceğiniz yeni bir projede yaptım ve bir ekran görüntüsü ekledim. Gördüğünüz gibi, Arayüz Oluşturucu Etiketin UIScrollView sınırının (turuncu kesikli dikdörtgen) dışında kalmasını bekler. Etiketin çerçevesini Sorunları Çözme Aracı ile güncellemek, tam buraya taşır.

Lütfen dikkat: UIScrollView öğesini bir UIView ile değiştirirseniz, davranış beklendiği gibi olur (Etiket'in çerçevesi doğrudur ve kısıtlamaya göre). Yani ya UIScrollView ile ilgili bir sorun var gibi görünüyor ya da önemli bir şey eksik.

Ben IB tarafından önerilen Etiket çerçevesini güncellemeden App çalıştırdığımda, tam olarak olması gerektiği yerde ve UIScrollView kaydırılabilir olduğunu gayet iyi konumlandırılmış. Çerçeveyi güncellersem Etiket görünmez olur ve UIScrollView kaydırılmaz.

Bana yardım et Obi-Wan Kenobi! Neden belirsiz düzen? Neden yanlış görüş?

Örnek projeyi buradan indirebilir ve neler olup bittiğini anlayabiliyorsanız deneyebilirsiniz: https://github.com/Wirsing84/AutoLayoutProblem

Illustration of the problem in Interface Builder


8
UILabel'ı bir içerik görünümüne yerleştirmeyi ve ardından etiketin arka kenarını içerik görünümüne ayarlamayı deneyin (normal UIView). Bu video size çok yardımcı olabilir: youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be
erdekhayser

1
Harika bir video ama benim için uyarıları düzeltmedi. :(
Bay Rogers

Video için çok teşekkür ederim - ondan çok şey öğrendim (oldukça şaşırtıcı)! Ancak, videonun bilgilerini stackoverflow.com/questions/18953617/… ile birleştirdiğimde uyarıları düzeltebilirim. Geriye kalan soru şudur: scrollView'un contentView boyutunu sadece gerektiği kadar büyük hale getirmek nasıl?
Wirsing

Bu videoya bir göz atın . XCode 5 / iOS 7 ile UIScrollLayout ve otomatik yerleşimin nasıl kullanılacağını gösterir.
jaxvy

Benim önerim UIScrollViewdoğrudan kullanmamak . Bunun yerine UICollectionViewveya UITableViewmümkün olduğunca, bu elemanla çoğunlukla her şey mümkündür ve aynı zamanda basitlik, okunabilirlik ve tekrar kullanılabilirlik sağlar !!!
Spatel

Yanıtlar:


1093

Yani ben sadece bu şekilde dizildi:

  1. İçinde UIScrollView eklemek bir UIView(biz böyle hitap edebilir contentView);

  2. Burada contentView, üst, alt, sol ve sağ kenar boşluklarını 0 olarak ayarlayın (elbette scrollViewhangisi olduğu superView); Ayrıca merkezi yatay ve dikey olarak hizalayın ;

bitmiş .

Şimdi bu tüm görüşlerinizi ekleyebilir contentViewve contentSizebirscrollView otomatik ile göre yeniden ayarlanacak contentView.

Güncelleme:

Aşağıdaki yorumlarda @Sergio tarafından yayınlanan bu video bazı özel durumları kapsamaktadır .


33
Kaydırma görüntüsünün artık içeriğinizin uzunluğunu tahmin edememesi ve içeriğine göre yeniden boyutlandırması dışında neredeyse mükemmeldir. Yükseklik (kısıtlama yoluyla) değişir contentView içinde bir tableview var ve scrollview kaydırma izin vermez.
CyberMew

28
Belki bu video kalan tüm sorunların üstesinden gelmeye yardımcı olabilir.
Sergio

46
bu tho kaydırmak yapmaz.
dorian

2
@MatteoGobbi Bu kadar! Hile yaptı! ScrollView autoLayout delilik 2 gün boyunca bu tür sorunlar ile mücadele oldu .... Teşekkürler dostum !!!
polo987

56
ScrollView'un kaydırılabilir olmamasıyla ilgili sorun yaşayan herkes için contentView'in alt ve orta merkezini dikey olarak kısıtlayın düşük öncelikle hizalamak benim için hile yaptı!
jimmy0251

98

Bu hata beni takip etmek için biraz zaman aldı, başlangıçta ScrollView'ın boyutunu sabitlemeye çalıştım ama hata mesajı açıkça "içerik boyutu" diyor. ScrollView'ın tepesinden sabitlediğim her şeyin de dibe sabitlendiğinden emin oldum. Bu şekilde ScrollView, tüm nesnelerin ve kısıtlamaların yüksekliğini bularak içerik yüksekliğini hesaplayabilir. Bu, belirsiz içerik yüksekliğini çözdü, genişlik oldukça benzer ... Başlangıçta X ScrollView merkezli birçok şey vardı, ama aynı zamanda nesneleri ScrollView yan sabitlemek zorunda kaldı. Bunu beğenmedim çünkü iPhone6 ​​daha geniş bir ekrana sahip olabilir, ancak 'belirsiz içerik genişliği' hatasını kaldıracak.


31
Cevabınız için teşekkür ederim! Doğru anlıyorsam, ScrollView'daki her bir alt görünümü üste ve alta sabitleyerek hatayı kaldırmayı başarabilirsiniz. Ancak, bu gerekli değildir. Sadece, kaydırma görüntüsünün üstünden altına kadar sürekli bir sınırlama çizgisi oluşturmanın bir yolu olduğundan emin olmanız gerekir. [-XXX] Umarım bu anlaşılabilir;>
Wirsing

1
Görünümün değişken bir yüksekliği varsa sorunu nasıl düzeltebilirim? Daha sonra kaydırma görüntüsünün boyutları hesaplayabilmesi için kısıtlamaları nasıl ayarlarım?
hashier

2
'Sadece kaydırma görüntüsünün üstünden altına kadar sürekli bir sınırlama çizgisi oluşturmanın bir yolu olduğundan emin olmalısın' <- bu cümle için teşekkürler
Adam Waite

3
Bana yardımcı olan, kaydırma görünümünün üst veya alt düzen kılavuzlarına değil, denetim ekranına sabitlendiğinden emin olmaktı. Alt düzen kılavuzu için kısıtlamayı kaldırdım ve arayüz oluşturucu yerine menüden geçtim. Editör -> Pin -> Denetlemek için Alt Boşluk.
Alberto Lopez

2
Kaydırma görünümünün genişliğinin telefonunuzun ekranının genişliğini veya UI'nizdeki herhangi bir öğeyi (içeren UIView gibi) izlemesini istiyorsanız, ölçüm için kaydırma görünümünün dışında başka bir öğe kullanarak "eşit genişlik" ayarlamanız gerekir.
Departamento B

89

Xcode 11+

Kullanmanın en basit yolu autolayout:

  1. Ekle UIScrollViewve onu pin 0,0,0,0Superview (veya istediğiniz boyut)
  2. UIViewScrollView'a ekleyin , 0,0,0,04 tarafın tümüne sabitleyin ve ortalayın horizontallyve vertically.
  3. Boyut denetçisinde, değişikliği bottomve align center Yönceliği 250 olarak değiştirin. (Yatay kaydırma değişikliği için trailingve align center X)
  4. İhtiyacınız olan tüm görünümleri bu görünüme ekleyin. Alt kısıtlamayı en düşük görünümde ayarlamayı unutmayın .
  5. Öğesini UIScrollViewseçin, boyut denetçisini seçin ve seçimi kaldırın Content Layout Guides.

1
Kaydırma görünümünün içerik yüksekliğini ayarlayamadım, ancak çalışıyor. :)
Kör Ninja

2
İpucu: benim için sadece merkezi yatay ve dikey olarak kaldırırsam ve eşit genişlikle değiştirirsem (scrollView + scrollView içinde görünüm) VE yüksekliği içeriğe ekleyerek, görünümün son öğesinin bir alt kısıtlamaya ihtiyacı olduğu anlamına gelir. Daha fazla bilgi için buraya bakın: stackoverflow.com/a/54577278/5056173
Sean Stayns

1
Sean, bunu her gün kelimenin tam anlamıyla kullanıyorum ve dikey ve yatay kaydırma görünümü kaydırma söz konusu olduğunda asla bu yaklaşımla ilgili bir sorun yaşamadım. Belki de en alt / son elemana alt sınır koymayı unutmuşsunuzdur. Bu olmadan, bu işe yaramaz.
Đorđe Nilović

7
Sayı 4 - ikinci cümle büyüktür.
Nitish

2
bu cevap benim için mükemmel çalıştı
satvinder singh

63

Kendi cevabım UIScrollView + Ortalanmış Görünüm + Belirsiz Kaydırılabilir İçerik Boyutu + birçok iPhone boyutunun cevabı .

Ama davanızı tamamen kaplıyor!

Yani, en basit durum için başlangıç ​​durumu:

  1. Tüm kenarlara 0 kısıtlamalı scrollView
  2. Düğme yatay ve dikey merkezli ile sabit Genişlik ve Yükseklik kısıtlamaları
  3. Ve tabii ki - can sıkıcı uyarılar Has ambiguous scrollable content width ve Has ambiguous scrollable content height.

1

Tek yapmamız gereken:

  • 2 ek sınırlama ekleyin, örneğin izleyen nokta için "0" ve görünümümüz için alt alan (aşağıdaki ekran görüntüsündeki örneğe bakın).

Önemli: sondaki ve / veya alttaki kısıtlamaları eklemeniz gerekir . "Lider ve üst" değil - işe yaramıyor!

2

Bu sorunun nasıl düzeltileceğini gösteren örnek projemde kontrol edebilirsiniz .

PS

Mantığa göre - bu eylem "çelişkili kısıtlamalara" neden olmalıdır. Ama hayır!

Neden çalıştığını ve Xcode'un hangi kısıtlamanın daha öncelikli olduğunu nasıl algıladığını bilmiyorum (çünkü bu kısıtlamaların açıklığı için öncelik ayarlamıyorum). Birisi, aşağıdaki yorumlarda neden işe yaradığını açıklarsa minnettar olacağım.


Harika bir ipucu! Sonunda sadece alt kenara bir kısıtlama getirdim ve önceliği orta veya düşük olarak ayarladım
Dean

Vaov! Bu ciddi bir anlam ifade etmiyor, işe yarıyor! Teşekkür ederim! Bence son öğe 0 ve BANG bir alt kısıtlama ayarlayın. Sonunda çalıştı.
Jakob Hviid

60

Xcode 11+, Swift 5

Tüm yanıtların neden artık işe yaramadığını merak ediyorsanız , içerik görünümünü (kaydırma görünümünün içine koyduğunuz görünüm) kaydırma görünümündeki İçerik Düzeni Kılavuzu'na değil, Çerçeve Düzeni Kılavuzu'na sabitlediğinizden emin olun.

İçerik görünümü kenarları (satır aralığı, arka, üst, alt) görüntüde satır aralığı gibi sabitlenmemelidir - Çerçeve Düzeni Kılavuzu

Böyle değil

ancak bunun gibi - İçerik Düzeni Kılavuzu'na.

Açılır listeden İçerik Düzeni Kılavuzu'nu seçin

resim açıklamasını buraya girin

Ve sonra cevapların çoğu sizin için çalışacaktır.

Şimdi en basit yaklaşım şu şekildedir:

  1. Kaydırma görünümünü kök görünümüne yerleştirin
  2. Kaydırma görünümünün tüm kenarlarını denetime sabitleme
  3. Başka bir UIView alın (içerik görünümü olarak adlandırılır) ve kaydırma görünümünün içine koyun
  4. Görünümün İçerik Düzeni Kılavuzu'nu kaydırmak için içerik görünümünün tüm kenarlarını sabitleyin
  5. İçerik görünümünün genişliğini kaydırma görünümünün Çerçeve Düzeni Kılavuzu'na eşit olacak şekilde sabitleyin
  6. İçerik görüntüleme yüksekliğini istediğiniz şekilde düzeltin (aşağıdaki örnekte yalnızca sabit yükseklik kısıtlaması kullandım)

Genel olarak en basit uygulamadaki yapınız şöyle görünecektir

resim açıklamasını buraya girin


@WantToKnow Yükseklik kısıtlamasını almaya gerek yok, sadece önceliğini düşük (250) olarak değiştirin
Reckoner

Xcode 11+, Swift 5. @WantToKnow cevabına göre sorunumu çözdüm, [video] [1] ve [kod] [2] [1] hazırladım: youtube.com/watch?v=qMrH5_Yj5hM [2]: github.com/AhmAbdallah/CustomCollectionView
Ahmed Abdallah

1
Bu harika bir cevap, teşekkürler.
Konstantin

1
Bu doğru cevap. Teşekkürler.
Vincent Joy

Bu, yalnızca içerik görünümünün son öğesine alt sınır eklediğimde benim için çalıştı
D.Zotov

49

Aşağıda açıklandığı UIViewgibi bir alt görünümü olarak bir oluşturmanız gerekir UIScrollView:

  • UIViewController
  • UIView 'Ana görünüm'
    • UIScrollView
      • UIView 'Kapsayıcı Görünümü'
        • [İçeriğiniz]

İkinci adım UIScrollViewkısıtlamaları yapmaktır . Bunu superView için üst, alt, önde gelen ve sondaki kısıtlamalarla yaptım.

Sonra konteyner için kısıtlamaları ekledim UIScrollViewve burada sorun başlıyor. Aynı kısıtlamaları (üst, alt, öndeki ve sondaki) koyduğunuzda, Storyboard bir uyarı mesajı verir:

"Belirsiz kaydırılabilir içerik genişliğine sahip" ve "Belirsiz kaydırılabilir içerik yüksekliğine sahip"

Yukarıdaki aynı kısıtlamaları ile devam edin ve sadece kısıtlamaları eklemek Equal Heightve Equal Widthsizin için Konteyner Görüntüle ilişkin Main View ve değil SİZİN UIScrollView. Başka bir deyişle, Kapsayıcı Görünümü'nün kısıtlamalarıUIScrollView 'denetimine bağlıdır.

Bundan sonra Storyboard'unuzda uyarı olmayacak ve alt görünümleriniz için kısıtlamalar eklemeye devam edebilirsiniz.


2
Kabul edildi - Bence bir konteyner görünümü eklemek en iyi, en sürdürülebilir çözümdür.
Andrew Ebling

1
Bu çözüm, yönetmek için gezinme çubuğunuz olmadığında çalışır.
Leena

26

Aynı sorunu yaşadım. Bu onay kutusunun işaretini kaldırın. Kodda içerik boyutunu ayarladığınızdan. resim açıklamasını buraya girin


24

Sonunda bunu anladım, umarım bunun anlaşılması daha kolaydır.

Bu uyarıyı, daha önce de belirtildiği gibi, kaydırma görünümüne bir "içerik görünümü" olarak temel bir UIView ekleyerek ve onu kaydırma görünümünüzle aynı boyutta yaparak ve bu içerik görünümünde bu 6 parametreyi ayarlayarak atlayabilirsiniz.

resim açıklamasını buraya girin

Gördüğünüz gibi, toplam 6 parametreye ihtiyacınız var! Hangi .. normal şartlar altında, 2 kısıtlama çoğaltırsınız ama bu film şeridi hata önlemek için bu yoldur.


1
Yukarıdakiler neredeyse benim için çalıştı, 3 farklı ekran genişliği (4/5, 6, 6+) konusunda endişeliyim. İçerik görünümünü ve kaydırma görünümünü eşit genişliklere ayarladım. Haklısın, içerik görünümüne zaten 0 önde ve bitiş alanına sahip olduğunu söylediğim için bu bir kopya.
Stuart

8
Sabit değerler yerine içerik görünümünden kaydırma görünümüne eşit genişlik ve yükseklik kısıtlamaları ayarlayabilirsiniz. Bu tüm kararlar üzerinde çalışacaktır.
Kumar C

Ben de uygulamak zorunda, bu yüzden hem içerik görünümü hem de kaydırma görünümü için eşit yükseklik ve genişlik ayarlamak zorunda bana yardımcı olabilir misiniz?
Urmi

Hala bunu yapmak zorunda olup olmadığınızı kontrol etmeye değer olabilir. Geçenlerde bir Scrollview bir imageView kurmak ve sadece hata Xcode 8.3 kaybolur yapmak için üst kısmında gösterilir 4 sınırlamalar ayarlamadan paçayı başardı
William T.

1
@Honey bu 3 yıl önce gönderildi. O zamandan beri kesinlikle storyboard'ları geliştirdiler. Artık içerik görünümü olmadan da uzaklaşabileceğinizi fark ettim. Cevabımı ayarlayacağım.
William T.

16

Ben geç olabilir biliyorum, ama sonraki çözüm ek senaryo olmadan , sadece film şeridi kullanarak bu tür sorunları çözer :

İçerik görünümünüz için kaydırma görünümünde önde gelen / sondaki / üst / alt boşluklar için kısıtlamalar ayarlamanız gerekir; bu, içerik görünümü çerçevesini şu şekilde değiştirmez :resim açıklamasını buraya girin

Tabii ki kaydırma görünümünün içerik boyutunu bilmesi için içerik görünümü için ek kısıtlamalar oluşturmanız gerekir. Örneğin, sabit yükseklik ve merkez x'i ayarlayın.

Bu yardımcı olur umarım.


7

Benim için bir contentViewönerilen eklemek gerçekten işe yaramadı. Ayrıca, eklenen görünüm nedeniyle bir ek yük oluşturur (her ne kadar bu büyük bir sorun olarak görmüyorum). Benim için en iyi olan şey, benim için belirsizlik kontrolünü kapatmaktıscrollView . Her şey güzelce düzenleniyor, bu yüzden benim gibi basit durumlarda iyi olduğunu düşünüyorum. Ama diğer kısıtlamalar takdirde, akılda tutmak scrollViewaradan, Arayüz-Oluşturucu olacak değil size bu konuda bir daha uyarmak.

resim açıklamasını buraya girin


5
Bu, uyarıyı kaldırır ve sorunu çözmek için hiçbir şey yapmaz.
Predrag Manojlovic

Sen. vardır. benim. kahraman. Bunun var olduğunu fark etmedim ve bulduğum için çok mutluyum! Bilmiyorum, sadece konumu doğrulamak için beklediğiniz "Yalnızca konumu doğrula" denedim ama hayır bu buggy "içerik boyutu" sorunu da izin verir. "Asla Doğrulama" ile gitmeliyim. Teşekkürler!
Dustin

Programlı olarak çocuk görüşünü oluşturuyorsanız, bunun doğru cevap olduğunu düşünüyorum. Teşekkürler!
Florian Kusche


3

Aşağıya bakın: dikey ve yatay kaydırma görünümünde içerik görünümü. belirsizlik hatası var, her zaman içerik görünümünüzden scrollview'a eklenen iki öğenin 1) olduğundan emin olun. 1) kapsayıcıya kadar alan. 2) ekran görüntüsünde vurgulanan kısıtlamaya kadar olan boşluk,

kaydırmadaki bu kısıtlama, içerik görüntüleme yüksekliğinizden veya genişliğinizden sonra ne kadar kaydırma yapabileceğinizdir.

resim açıklamasını buraya girin

size yardımcı olabilir.


3

Seçili Görünüm için "Otomatik düzen sorunlarını çöz"> "Eksik kısıtlamalar ekle" seçeneğini kullanarak görünümüm için bu tür bir sorunu çözdüm resim açıklamasını buraya girin

Aşağıdaki iki kısıtlama sorunumu çözdü:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

hangi: izleyen, alt izleyen, UIScrollView altındaki


Bu benim için bir "alt" kısıtlama ekleyerek çalıştı. Şimdi düşündüğüme göre, bu mükemmel bir mantıklı.
SilverWolf - Monica'yı

3

ContentView (kullanarak UViewkonteyner içine gibi) UIScrollViewkenarlarına, çubuk ( top, bottom, trailing, leading) Superview ait ( UIScrollView) ve contentViewolmalı equalwidthve equalheightSuperview için. Bunlar kısıtlamalar. Ve yöntemin çağrısı:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

Benim için sorunları çözdü.


3

Swift 4+ yaklaşımı:

1) UIScrollView üst, alt, sol ve sağ kenar boşluklarını 0 olarak ayarlayın

2) UIScrollView içinde bir UIView ekleyin ve üst, alt, satır başı, sondaki kenar boşluklarını 0 (UIScrollView kenar boşluklarına eşit) olarak ayarlayın.

3) En önemli kısım, yükseklik sınırının düşük önceliğe sahip olması gereken genişlik ve yüksekliği ayarlamaktır .

private func setupConstraints() {

    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}

2

@Matteo Gobbi'nin cevabı mükemmel, ama benim durumumda, kaydırma görünümü kaydırılamıyor, " Y merkezini hizala " yı kaldırıyorum ve " height> = 1 " ekliyorum , kaydırma görünümü kaydırılabilir hale gelecektir


2

Uiscrollview ile kaydırma yapmayla mücadele eden kişiler, içerik görünümünüzün alt sınırını son görünümünüzün alt düzeniyle (içerik görünümünüzün içinde) ayarlar. Merkez Y kısıtlamasını kaldırmayı unutmayın.

Geri kalan tüm kısıtlamalar yukarıda tanımlandığı gibidir. Scrollview yalnızca içerik görünümünden maksimum yükseklik elde etmekten endişe duyuyor ve bunu son görünümün alt kısıtlaması olarak ayarlıyoruz, yani scrollview otomatik olarak içerik ofsetini değiştirecektir.

Benim durumumda son görünüm satır sayısı özelliği olmadan UILable oldu (içeriğine bağlı olarak yüksekliğini otomatik olarak ayarlar), böylece uilable'ın yüksekliğini dinamik olarak artırır ve sonunda uilable'ın alt düzeni içerik görünümümüzün alt kısmına hizalandığı için kaydırılabilir alanımız artar, bu da kaydırma görünümünü içerik dengesini artırmaya zorlar.


2

XTube'da yalnızca Storyboard'u kullanarak YouTube Scroll StackViews üzerinde bir video yaptım

Bence burada 2 tür senaryo ortaya çıkabilir.

ScrollView içindeki görünüm -

  1. yapısal içeriğe sahip Boyut (ör. UIView)
  2. kendine özgü içeriğe sahip Boyut (örneğin UIStackView)

Her iki durumda da dikey olarak kaydırılabilir bir görünüm için şu kısıtlamaları eklemeniz gerekir:

  1. Üst, sol, alt ve sağdan 4 sınırlama.

  2. Kaydırma görünümüne eşit genişlik (yatay kaydırmayı durdurmak için)

Kendi içsel içerik yüksekliğine sahip görünümler için başka herhangi bir kısıtlamaya ihtiyacınız yoktur.

resim açıklamasını buraya girin


İçsel içerik yüksekliği olmayan görünümler için bir yükseklik kısıtlaması eklemeniz gerekir. Görünüm yalnızca yükseklik kısıtlaması scrollView yüksekliğinden fazla olduğunda kaydırılır.

resim açıklamasını buraya girin


2
import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let lipsumLbl: UILabel = { // you can use here any of your subview

        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.

        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.

        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()

    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()

        setupViews()
        setupAutoLayout()
    }

    func setupViews() {

        title = "ScrollView Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }

    func setupAutoLayout() {

        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        lipsumLbl.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

Çıktı:

resim açıklamasını buraya girin


Zaten terk ettiğinde neden leadAnchor'a ihtiyacın var?
ShadeToD

leftAnchor bu amaçla kullanılamaz, bu yüzden aynı şeyi elde etmek için leadAnchor kullanmalıyız ..
iAj

her ikisini de örneğinizde kullandınız.
ShadeToD

@ShadeToD izin ver kontrol etmek
iAj

2

Benim durumumda iPad'de yanlış içerik boyutu ve içerik Boyutu Belirsizliği sorunu aldım, ancak iPhone durumunda çalışıyordum. Sorunu çözmek için film şeridinde aşağıdaki değişiklikleri yaptım.

  1. UIView'e scrollview ekleyin ve 0,0,0,0'a kadar önden, üstten, sondan ve alttan kısıtlamalar ekleyin.
  2. Kaydırma görünümünün yüksekliğini, örneğin gereksinimlere göre ayarlayın. 100.
  3. Görünümü kaydırmak ve 0,0,0,0'a kadar önden, üstten, arkadan ve alttan kısıtlamalar eklemek ve orta (X) ve orta (Y) kısıtlamaları hizalamak için UIView ekleyin.
  4. Kaydırma görünümünün boyut denetçisinde "İçerik Mizanpaj Kılavuzları" nın seçimini kaldırın.

1

Dikey kaydırma

  1. Denetlemek için 0,0,0,0 kısıtlamalarına sahip bir UIScrollView ekleyin.
  2. Denetlemek için 0,0,0,0 kısıtlamaları ile ScrollView'a bir UIView ekleyin.
  3. UIView için UIScrollView'a aynı genişlik sınırlamasını ekleyin.
  4. UIView'e Yükseklik Ekleyin.
  5. UIView'e kısıtlamaları olan öğeler ekleyin.
  6. Dibe en yakın eleman için, UIView'in alt kısmında bir kısıtlama olduğundan emin olun.

0

Yaptığım burada gösterildiği gibi ayrı bir içerik görünümü oluşturmak.

İçerik görünümü serbest şekildedir ve tüm alt görünümleri, contentView ile ilgili olarak kendi kısıtlamaları ile eklenebilir.

UIScrollView, ana görünüm denetleyicisine eklenir.

Programlı olarak sınıfa IBOutlet ile bağlı contentView ekleyin ve UIScrollView contentView ayarlayın.

Interface Builder ile ContentView ile UIScrollView


0

Aynı hatayı alıyordum .. takip ettim

  1. Görünüm (Superview)
  2. ScrollView 0,0,600,600
  3. ScrollView içinde UIView: 0,0.600,600
  4. UIView resim görünümü, etiket içeriyor

Şimdi scrollView (2) ardından UIView (3) için öndeki / arka / üst / alt ekleyin.

Görünüm (1) ve Görünüm (3) eşit yükseklik ve ağırlık ayarlayın .. seçin benim sorunum çözüldü.

Yardımcı olacak videoyu yaptım:

https://www.youtube.com/watch?v=s-CPN3xZS1A


0

[XCode 7.2 ve iOS 9.2 için test edilmiştir]

Benim için Storyboard hatalarını ve uyarılarını engelleyen şey , kaydırma görünümünün ve içerik görünümünün (benim durumumda, bir yığın görünümü) gerçek boyutunu Yer Tutucu olarak ayarlamaktı . Bu ayar, Storyboard'daki Boyut denetçisinde bulunur. Ve diyor ki - Bir tasarım zamanı içsel içerik boyutu ayarlamak sadece Arayüz Oluşturucu'da düzenleme yaparken bir görünümü etkiler. Görünüm, çalışma zamanında bu içerik boyutuna sahip olmaz.

Yani, sanırım bunu ayarlayarak yanlış gitmiyoruz.

Not: Film şeridinde, kaydırma görüntüsünün tüm kenarlarını denetim ekranına ve yığın görünümünün tüm kenarlarını kaydırma görünümüne sabitledim. Benim kodunda, ben belirledik translatesAutoresizingMaskIntoConstraints Scrollview ve stackview ikisi için yanlış olarak. Ve bir içerik boyutundan bahsetmedim. Yığın görünümü dinamik olarak büyüdüğünde, film şeridinde ayarlanan kısıtlamalar yığının kaydırılabilir olmasını sağlar.

Film şeridi uyarısı beni deli ediyordu ve sadece uyarıyı bastırmak için işleri yatay veya dikey olarak ortalamak istemedim.


0

Herhangi biri sağ kaydırmada kaydırma çubuğunu fark ettiğiniz bir davranışla karşılaşıyorsa, ancak içerik hareket etmiyorsa, bu gerçek muhtemelen göz önünde bulundurulmaya değer:

Ayrıca, kaydırma görünümünün içeriği ile kaydırma görünümünün dışındaki nesneler arasındaki kısıtlamaları kullanarak kaydırma görünümünün içeriği için sabit bir konum sağlayarak bu içeriğin kaydırma görünümü üzerinde süzülmesini sağlar.

Bu Apple'ın belgelerinden . Örneğin, üstteki Label / Button / Img / View öğenizi yanlışlıkla contentView yerine kaydırma alanının dışındaki görünüme sabitlediyseniz (belki üstbilgi veya scrollView'in hemen üzerinde bir şey?), Tüm contentView öğenizi yerinde dondurursunuz.


0

Önceki yanıtlarda belirtildiği gibi, kaydırma görünümünde özel bir görünüm eklemelisiniz:

Özel görünüm, resimde işaretlenmiş ContentView

Tüm alt görünümlerinizi içerik görünümüne ekleyin. Bir noktada kaydırma içerik görünümünün belirsiz içerik boyutu uyarısı olduğunu görürsünüz, içerik görünümünü seçmeli ve "Otomatik düzen sorunlarını çöz" düğmesini (IB düzeninin sağ alt köşesinde) tıklamalı ve "Kayıp ekle kısıtlamalar "seçeneğini tıklayın.

resim açıklamasını buraya girin

Bundan sonra, projeyi çalıştırdığınızda, kaydırma görünümü otomatik olarak içerik boyutunu güncelleyecektir, ek kod gerekmez.


0

Sadece, kaydırma görüntüsünün üstünden altına kadar sürekli bir sınırlama çizgisi oluşturmanın bir yolu olduğundan emin olmanız gerekir. [-XXX]

Benim durumumda - yatay kaydırma kaydırma görünümü - Apple'ın teknik notu size bunu söylemese de, kaydırma görünümünün her alt öğesi için genişlik ve yükseklik kısıtlamaları eklemem gerekiyordu .



0

UIScrollView ile ilgili hala sorun yaşıyorsanız, İçerik Düzeni Kılavuzlarını kapatın (xcode Interface Builder'da ScrollView'ınızı seçin -> sağ panelde Boyut denetçisini seçin -> 'İçerik Düzeni Kılavuzları' seçimini kaldırın) Veya şu adımları deneyin: xcode 11 kaydırma görünümü düzenleri - yeni düzen stili için yararlı olabilir. 05.02.2020 için macOS 10.15.2, Xcode 11.3.1'de iyi çalışıyor

ekran görüntüsüne bakın


0

Otomatik Yerleşimi Kullanma

Kaydırma görünümünüzü iyi tanımlanmış bir görünüme ekleyin ve ardından yığın görünümünü kaydırma görünümünün içine ekleyin

Kaydırma görünümünden ve yığın görünümünden ilgili süper görünümlerine üst, sol, sağ, alt, orta X ve orta Y kısıtlamaları ekleyin

Geçerli varsayılan ayar, bir Üst Boşluk yerine Üst Hizalama kısıtlaması eklemek olduğundan, kısıtlamaların yığın görünümünden doğru denetime (kaydırma görünümü) bağlandığından emin olun.

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.