UIScrollview'imde kısıtlamalar ayarlamak için Otomatik Yerleşimi nasıl kullanabilirim?


176

Autolayout'tan önce önemsiz bir scrollview kurulumuna ulaşmak için Karışık ve Saf Autolayout yaklaşımlarının çeşitli çözümlerini denemek için iki gün geçirdim ve şimdi resmi - çok aptal olmalıyım. Bunu çoğunlukla Storyboard'da ayarlıyorum (iyi, sadece olduğu gibi).

İşte benim yardım isteğim.

Viewtree:

UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton

Düğmeler yatay olarak kaydırılmalıdır (soldan sağa ve tersi). Birisi saf Autolayout kullanarak bunu başarmak için kısıtlamaları nasıl ayarlayacağını lütfen bana bildirin ???

-

Karışık yaklaşımı denedim, şöyle:

UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton

... ve Apple TechNote'a göre contentviewve translatesAutoresizingMaskIntoConstraintsayarları için sabit genişlik ve yükseklik kısıtlamaları ayarlama. Düğmeler ve kaydırma görünümü kısıtlamalar kullanılarak ayarlanır. Bu scrollview kaydırma (yay) alır ama ne yazık ki, çok ileri kaydırır! Bildiğim kadarıyla, kaydırma genişliği bir şekilde contentview ne ??? !!! ???

Saf autolayout yaklaşımını hem birlikte hem de contentviewolmadan denedim . Tüm görünümler translatesAutoresizingMaskIntoConstraints=NOhariç self.view. Düğmeler sabit genişlik / yükseklik kısıtlamalarına sahiptir ve kaydırma görüntüsünün dört kenarına sabitlenir. Hiçbir şey kayar.

Bu yüzden neden düzgün çalışamadığım konusunda şaşkınım. Herhangi bir yardım çok takdir ve başka bir bilgiye ihtiyacınız varsa, lütfen sorun!

Çözüm ile yükseltilmiş ekran görüntüsü - buttonZ kısıtlamaları:

resim açıklamasını buraya girin

@ Jamie Forrest DÜZENLEME Böylece çözüm son düğme yanlış takip kısıtlaması olduğu ortaya çıkıyor. 6441 yerine, verdiğim değer negatifti, -6441. Zor olan şey, film şeridinde değeri ayarlarken, Pin araç çubuğunda iki seçenek olmasıdır:

resim açıklamasını buraya girin

Geçerli Tuval Değeri negatiftir (kaydırmaya neden olmaz) ve aşağıdaki seçenek pozitiftir (kaydırmayı etkinleştirir). Bu aptal değilim ama en azından yarı kör olduğum anlamına geliyor. Her ne kadar savunmam için XCode'un "yanlış" ayar için bir hata göstermemesi biraz rahatsız edici değil mi?

TEKRAR DÜZENLENDİ Şimdi bu komik ... sondaki değeri -6441'den (kaydırma yok) 6441 etkin kaydırma olarak değiştiriyor. Ancak eski arkadaşım "çok fazla içerik boyutu" geri döndü ve olması gerekenden iki kat daha büyük bir içerik boyutuna yol açtı! Doğru içerik kaydırmasını elde etmenin çözümü, izleyen kısıtlamayı SIFIR olarak ayarlamaktı! Storyboard'da çalışırken ancak @Infinity James'in koduna bakarken bu açık değildir, olması gereken şey budur.


Kaydırma görünümünüzün içerik boyutunu nerede hesaplar / ayarlarsınız? Bir contentView kullanarak ilk denemenize atıfta bulunarak çok fazla kaydırıldığını söylediniz.
Tim

2
Gibi bildiğim kadarıyla, sen ayarlayamıyor contentSizebir ait UIScrollViewkullanan tek oto düzeni. Ve contentSizene kadar kaydırma yapabileceğinizi tanımlar. Bu yüzden sonunda bunu manuel olarak bir yere ayarlamanız gerekecek. Geri kalanı için, görünüm çerçevelerini birbirine göre ayarlamak için düzen kısıtlamalarını kullanabilirsiniz.
Guillaume

@ Jeff, içerik boyutu sabittir, asla değişmez. İçerik görüntüleme için doğru yüksekliği ve genişliği manuel olarak girerek film şeridindeki içerik boyutunu ayarladım ve yüksekliği ve genişliği film şeridindeki kısıtlamalarla sabitliyorum.
user1459524 26:13

Çalışma zamanında boyutunuzu girin, girdiğiniz değerlerle eşleşip eşleşmediğine bakın. ContentSize ne kadar kaydırma yapılacağını belirler, bu nedenle ilk denemenizle ilgili sorun contentSize ile ilgilidir.
Tim

@Guillaume, öyleyse "saf otomatik yerleşim" yaklaşımı sonuçta o kadar da saf değil mi? Ancak contentSize'i manuel olarak NASIL ayarlayabilirim? Yukarıda belirttiğim gibi, içerik görünümünün yüksekliğini / genişliğini sabit değerlere (film şeridinde) ayarlıyorum. Ancak çok fazla kaydırıyor (2x).
user1459524

Yanıtlar:


68

Kısıtlamalarınızın tam değerlerini ve kurulumunu buraya yapıştırdığınızda görmek zor, bu yüzden yanlış yaptığınız ekran görüntülerinize bakmaktan emin değilim.

Kurulumunuzda neyin yanlış olduğuna dair bir açıklama yerine, açıkladığınızla çok benzer bir görünüm hiyerarşisine ve kısıtlama kurulumuna sahip temel bir örnek proje oluşturdum . Yatay kaydırma, Apple'ın Teknik Notta açıkladığı "Pure AutoLayout" yaklaşımını kullanan örnek projede beklendiği gibi çalışır .

Ayrıca başlangıçta Auto Layout ile çalışmak için çok fazla sorun yaşadım UIScrollView. Çalıştırmanın anahtarı, kaydırma görünümündeki tüm öğelerin birlikte alındığında, sonunda kaydırma görünümünün tüm taraflarına bağlanan ve AutoLayout sisteminin bir içeriği belirleyebilmesine katkıda bulunan kısıtlamalara sahip olduğundan emin olmaktır. çerçevesinden daha büyük olacak kaydırma görünümü. Kodunuzda bunu yapmaya çalıştığınız anlaşılıyor, ancak belki de içeriğin boyutunu çok küçük yapan bazı gereksiz kısıtlamalar vardı.

Ayrıca, diğerlerinin de belirttiği gibi, AutoLayout ve UIScrollview ile artık contentSize öğesini açıkça ayarlamıyorsunuz. AutoLayout Sistemi, contentSize değerini kısıtlamalarınıza göre hesaplar.

Ayrıca bu e-kitap bölümünü tüm bunların nasıl çalıştığını anlamamda çok yardımcı buldum . Umarım tüm bunlar yardımcı olur.


2
Örnek proje için teşekkür ederiz! Çalışıyor ve bakarken, ilk başta projemde herhangi bir fark bulamadım! Görüşleri projeme kopyaladım, kısıtlamalardan başka bir ortam olduğundan şüphelendim, ama çalışmaya devam etti. Bu, projemdeki son düğmenin sonundaki kısıtlamanın negatif olduğunu fark ettim - önünüzde, sizinki olumlu bir değere sahipken! - değerini pozitif olarak değiştirmek kaydırmayı etkinleştirdi! Sabitle araç çubuğunu açtığımda iki seçenek var: Negatif olan Geçerli Tuval değerini ve pozitif olan Kaydırma Görünümü'nü (geçerli değeri kullan) kullanın ...?!
user1459524

Ah evet. Negatif değeri aslında arka kenar bitmeli gerçeğini maç için, daha küçük kaydırma görünümünün contentSize yapacak önce düğme uçları. Örnek proje yardımcı sevindim!
Jamie Forrest

Çok şey yaptı. Güncellenmiş cevabımı kontrol et. İzleyen değer aslında 0 (sıfır) olmalıdır.
user1459524

6
Kod yerine ekran görüntülerini paylaşmak zorunda olduğumuz üzücü bir şey. Bunun nedeni, elma geliştiricileri daha iyi API sağlamak yerine geliştiriciyi kullanmaya teşvik etmesidir.
Vladimír Slavík

4
Tamamen anlamsız. Geliştiriciler, XCode'un içerik oluşturucularının zihninde neler olup bittiğini anlamak için saatlerce saat harcamak zorunda.
Josh

49

LOL aptallık kulübüne hoş geldiniz. Ben kuruculardan biriyim. : D

DİKEY kaydırma için : çalışabilmemin tek yolu (iOS 8, Xcode 6 ve saf otomatik yerleşim) Kaydırma Görünümüme (tümü denetim ile ilgili) aşağıdaki kısıtlamaları eklemekti:

  • Eşit Genişlikler
  • Eşit Yükseklikler
  • Merkez Y Hizalama
  • Merkez X Hizalama

Yapım:

  UIView
   - ScrollView
    - Subview
    - Subview
    - Subview
    - Subview
    - ...

Bu nihai sonuç:

gösteri

Kurulum budur:

Kurmak Tam ekran

Ve işte proje .

Umarım bu birileri 05:00 UYKU GİTMEK için kurtaracak. : D


Yardımınız için çok teşekkürler! "Subview" türünün alt görünümünü nasıl aldınız ?? Ben Xcode 6.2 projenize bakıyorum ve bu küçük dikdörtgenler "Subview" olarak adlandırır tek kısıtlaması 63 piksel yüksek olmasıdır.
Andrew K

1
Selamlar! Bu "Alt görünüm" aslında bir UIVIew. Bu sadece bir isim ... Oraya her şeyi yazabilirsiniz. Bu görüntüye göz atın: cl.ly/image/291f1K2N0V3p Kısıtlama konusunda, alt görünümlerde yalnızca bir yükseklik kısıtlaması vardır. Bu görünümler için tüm kısıtlama listesini kontrol edin: cl.ly/image/3l061i123j2i
backslash-f

1
Hala kaydırma çalışmasını sağlayamıyorum - Alt görünümlerinizin projenizde "gri renkte" olduğunu fark ettim. Biraz araştırma yaptıktan sonra, 'boyut sınıfları' kullandığınızdan kaynaklanıyor gibi görünüyor. Bu kaydırmayı nasıl etkiler? Bunu kullanmadan kaydırmanın çalışmasının bir yolu var mı?
Andrew K

Ayrıca, gözetiminizi varsayılan uzunluktan daha uzun hale nasıl getirdiniz? "Ekranın alt kısmında" (veya ekran dışında) görünecek düğmeler eklemeye çalışıyorum, ancak yeterince büyük olmadığı için onları sürükleyip denetim ekranına bırakamadığımda açıkçası onları denetime ekleyemiyorum.
Andrew K

1
arama ve bu aptallık düzeni yapmaya çalışırken uzun bir gün sonra, bu cevabı buldum ve ilk denemede çalışır .. Teşekkürler adam .. sen benim günümü kurtarmak .. keşke bu cevap için bin kadar oy verebilir ..: )
Bobby Stenly

32

Basit Müstakil Örnek

Soruya verilen yüksek oy sayısına ve cevaplara verilen düşük oy sayısına bakıldığında, insanlar burada anlaşılabilir ve hızlı bir çözüm bulamıyorlar. Bir tane eklemeye çalışayım. Bu proje, tamamen Interface Builder'da yapılan bağımsız bir örnektir. 10 dakika veya daha kısa bir süre içinde üzerinde çalışabilmelisiniz. Daha sonra öğrendiğiniz kavramları kendi projenize uygulayabilirsiniz.

resim açıklamasını buraya girin

Orijinal soru kaydırma düğmelerini soruyor. Burada sadece UIViews kullanıyorum ama sizin istediğiniz görünümü temsil edebiliyorlar. Film şeridi ekran görüntüleri bu format için daha kompakt olduğu için yatay kaydırmayı da seçtim. Prensipler dikey kaydırma için aynıdır.

Anahtar kavramlar

  • UIScrollViewSadece bir subview kullanmalıdır. Bu, kaydırmak istediğiniz her şeyi tutmak için içerik görünümü olarak hizmet veren bir 'UIView'.
  • İçerik görünümünün ve kaydırma görünümünün üst öğesinin yatay kaydırma için eşit yüksekliklere sahip olmasını sağlayın. (Dikey kaydırma için eşit genişlikler)
  • Kaydırılabilir içeriğin tümünün ayarlanmış bir genişliğe sahip olduğundan ve tüm kenarlarına sabitlendiğinden emin olun.

Yeni bir proje başlat

Sadece tek bir görünüm uygulaması olabilir.

Film Şeridi

Bu örnekte yatay kaydırma görünümü yapacağız. Görünüm Denetleyicisini seçin ve ardından Boyut Denetçisinde Serbest Biçim'i seçin. Genişliği 1,000ve yüksekliği yapın 300. Bu, bize kaydırılacak içerik eklemek için film şeridinde yer açar.

resim açıklamasını buraya girin

Kaydırma Görünümü Ekleme

UIScrollViewDört tarafı da ekleyin ve görünüm denetleyicisinin kök görünümüne sabitleyin.

resim açıklamasını buraya girin

İçerik Görünümü Ekleme

Bir ekleme UIViewkaydırma görünümünde bir subview. Bu anahtar. Kaydırma görünümüne çok sayıda alt görünüm eklemeye çalışmayın. Sadece bir tane ekleyin UIView. Bu, kaydırmak istediğiniz diğer görünümler için içerik görünümünüz olacaktır. İçerik görünümünü dört taraftaki kaydırma görünümüne sabitleyin.

resim açıklamasını buraya girin

Eşit Yükseklikler

Şimdi Belge Anahattı'nda, Commandikisini de seçmek için hem içerik görünümünü hem de kaydırma görünümünün üst görünümünü tıklayın . Ardından yükseklikleri eşit olacak şekilde ayarlayın ( Controlİçerik Görünümü'nden Kaydırma Görünümü'ne sürükleyin). Bu da anahtar. Yatay olarak kaydırdığımızdan, kaydırma görünümünün içerik görünümü, bu şekilde ayarlamadığımız sürece ne kadar yüksek olması gerektiğini bilemez.

resim açıklamasını buraya girin

Not:

  • İçerik dikey olarak kaydırılıyor olsaydı, içerik görünümünün genişliğini kaydırma görünümünün üst öğesinin genişliğine eşit olacak şekilde ayarlardık.

İçerik ekle

Üç UIViews ekleyin ve onlara tüm kısıtlamaları verin. Her şey için 8 puan boşluk kullandım.

resim açıklamasını buraya girin

Kısıtlamalar:

  • Yeşil görünüm: üst, sol ve alt kenarları sabitleyin. Genişliği 400 yapın.
  • Kırmızı görünüm: üst, sol ve alt kenarları sabitleyin. Genişliği 300 yapın.
  • Mor görünüm: dört kenarın kenarlarını sabitleyin. Genişliği kalan alan ne olursa olsun yapın (bu durumda 268).

Genişlik sınırlamalarını ayarlamak, kaydırma görünümünün içerik görünümünün ne kadar geniş olacağını bilmesi için de önemlidir.

bitmiş

Bu kadar. Projenizi şimdi çalıştırabilirsiniz. Bu cevabın üst kısmındaki kayan görüntü gibi davranmalıdır.

Dikey kaydırma için, bu örnekteki tüm genişlik ve yükseklik yönlerini değiştirin (test edilmiş ve çalışıyor).

İlerideki çalışma


9

ContentSize, UIScrollView içindeki kısıtlamalar uygulanarak örtük olarak ayarlanır.

Örneğin, bir UIView içinde bir UIScrollView var gibi (farkında olduğunuzdan eminim gibi) şöyle görünecektir:

    UIView *containerView               = [[UIView alloc] init];
    UIScrollView *scrollView            = [[UIScrollView alloc] init];
    [containerView addSubview:scrollView];
    containerView.translatesAutoresizingMaskIntoConstraints = NO;
    scrollView.translatesAutoresizingMaskIntoConstraints    = NO;
    NSDictionary *viewsDictionary       = NSDictionaryOfVariableBindings(containerView, scrollView);

    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|"
                                                                          options:kNilOptions
                                                                          metrics:nil
                                                                            views:viewsDictionary]];
    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|"
                                                                          options:kNilOptions
                                                                          metrics:nil

Bu, scrollView öğesini containerView boyutunu dolduracak şekilde ayarlayacaktır (böylece containerView belirli bir boyutta olmalıdır).

Daha sonra UIScrollView öğesinin contentSize öğesini, düğmeleri şu şekilde tutacak kadar büyük olacak şekilde dolaylı olarak ayarlayarak ayarlayabilirsiniz:

    UIButton *buttonA                   = [[UIButton alloc] init];
    UIButton *buttonB                   = [[UIButton alloc] init];
    UIButton *buttonC                   = [[UIButton alloc] init];
    [scrollView addSubview:buttonA];
    [scrollView addSubview:buttonB];
    [scrollView addSubview:buttonC];
    buttonA.translatesAutoresizingMaskIntoConstraints       = NO;
    buttonB.translatesAutoresizingMaskIntoConstraints       = NO;
    buttonC.translatesAutoresizingMaskIntoConstraints       = NO;

    viewsDictionary                     = NSDictionaryOfVariableBindings(scrollView, buttonA, buttonB, buttonC);

    [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonA]-|"
                                                                       options:kNilOptions
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
    [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonA]-[buttonB]-[buttonC]-|"
                                                                       options:NSLayoutFormatAlignAllBaseline
                                                                       metrics:nil
                                                                         views:viewsDictionary]];

Yani, scrollView ve düğmeler değil, scrollView ve düğmeler arasındaki kısıtlamaları ayarladım? Kodunuzla şu anda storyboard aracılığıyla ne yaptığım arasında spor yaptığım tek fark hakkında olduğunu düşünüyorum.
user1459524 26:13

Sadece ikinci okumadan sonra bir CONTENTview değil, bir CONTAINERview ayarladığınızı anladım. Kodunuza dayanarak, her şeyi tam olarak film şeridinde yeniden oluşturdum ve kaydırma yapmıyor. Sorumu bazı ekran görüntüleri ile düzenleyeceğim.
user1459524

1
Yani, senaryodaki kodu yeniden oluşturma girişimim% 100 doğru değildi. Son düğmenin arka değeri tam olarak sıfır olmalı ve H yansıtma: | - [düğmeA] - [düğmeB] - [düğmeC] - | Bu, film şeridinde çalışırken (veya en azından bana göre değildi) çok açık değil, ancak şimdi gerçeği önemsiz görünüyor. Ben autolayout seviyorum ama o küçük şeyler ya ...
user1459524

@ User1459524'ten bahsettiğim şey benim için bir sorundu. Benim alt görüşüm bir düğme ve alt kısıt IB tarafından -32 idi. Bunu 0 olarak ayarladım ve IB'de Bottom Space için şu şekilde güncellendi: denetleme. İşe yarayacak, aynı zamanda çalıştığınız olumlu tarafta olduğunuz sürece görünüyor. Görünüşe göre IB ile ilgili bir hata olabilir. Umarım başka birine yardım eder. Ayrıca tüm görünümleri kaldırdım ve bu onları ortaya çıkarmaya çalışırken yardımcı olan yeniden kablolanmış ve genellikle uzun sürmez.
Michael

8

AutoLayout'u UIScrollView ile kullanma hakkında o kadar çok soru var ki, görmezden geldiğimiz önemli nokta, UIScrollView'un iç görünümlerinin UIScrollView'ın kendisi değil, İçerik Görünümü'ne kısıtlamalar getirmesidir . Bakınız Teknik Not TN2154 , şunları bulabilirsiniz:

UIScrollView sınıfı, sınırlarının kaynağını değiştirerek içeriğini kaydırır. Bu işlemin Otomatik Mizanpaj ile çalışması için, kaydırma görünümünde üst, sol, alt ve sağ kenarlar artık içerik görünümünün kenarları anlamına gelir.

Aşağıdaki şekil bunu tasvir edecektir: resim açıklamasını buraya girin

İzleyen alanın 500 nokta olduğunu bulabilirsiniz, eğer kısıtlama UIScrollView için yapılmışsa, görünüm kaçırılır ve çerçevesini güncellemelidir. Ancak, uyarı yok ve hata yok. Çünkü tüm kısıtlamalar içerik görünümüne aykırıdır.

UIScrollView, iç görünümün kısıtlamalarına göre içerik görünümünün boyutunu hesaplar. (Örneğin, içerik boyutu: genişlik = 100 (ön boşluk) + 200 (görünümün genişliği) + 500 (arka boşluk), yükseklik = 131 (üst boşluk) + 200 (yükseklik) + 269 (alt boşluk)

UIScrollView uygulamasında görünümler için kısıtlamalar nasıl eklenir:

  1. İçerik görünümündeki görünümlerin konumlarını görüntüleme.
  2. İçerik görünümünün kenarlarına üst, sağ, alt, sol boşlukları ve ayrıca bu görünümlerin genişliğini ve yüksekliğini ekleyin.

Ve hepsi bitti.

Kaydırma görünümü ile Otomatik Düzen ile başa çıkmanın kolay bir yolu, kaydırma görünümünde tüm alt görünümleri içeren bir kapsayıcı görünümü eklemektir.

Sonuç: UIScrollView ile AutoLayout'u anlamak için kilit nokta, iç görünümlerin içerik görünümünde kısıtlamalar oluşturmasıdır, ancak UIScrollView'ın kendisi değildir.

ekli örnek kod


5

Aşağıdaki çözüm , autolayout ve contentSize olmadan scrollView için benim için çalıştı :

  1. ViewController öğesine bir scrollView sürükleyin ve istediğiniz alanı kaplamak için herhangi bir kısıtlamayı uygulayın.
  2. ScrollView içinde bir UIView sürükleyin ve bırakın ve scrollView alanının tamamını kaplamasını sağlayın ve scrollView öğesinde üst, sol, sağ, alt boşluk olacak şekilde kısıtlamalar uygulayın .
  3. Set yüksekliği kaydırma ihtiyacı başına iç görünümü (yatay kaydırma ve gerektiği takdirde, genişlik). Bu bölüm gerektiğinde koddan da yapılabilir.
  4. Kritik . Yüksekliği nokta (3) 'te büyük bir değere ayarladıktan sonra, nokta (2)' ye geri dönün ve Xcode zorladığınızda sizin için değiştirmiş olabileceğinden üst, sol, sağ, alt değerleri sıfıra ayarladığınızdan emin olun yüksekliği değiştirdi (3).

Ve işiniz bitti. Şimdi, bu görünüme istediğiniz sayıda denetim ekleyebilir ve birbiriyle ilişkili (bu görünüm olmadan çalışmıyor gibi görünen) kısıtlamaları uygulayabilirsiniz. Bu görünümü kullanmak istemiyorsanız, scrollView (birbiriyle ilişkili olmayan) ile ilgili her kontrol için kısıtlamalar uygulamanız gerekir.


Ezici ipucu ..............

Kritik . Açıkça söylemek gerekirse UIScrollView 1000 geniş ve 100 yüksek. (Aslında normalde bu değerler cihazın genişliğine bağlı olarak dinamik olacaktır. Ama şimdilik sadece 1000 geniş ve 100 yüksek diyelim.) Diyelim ki yatay bir kaydırma yapıyorsunuz. Bu yüzden UIScrollView içine bir UIView koyun. (Bu "içerik görünümü" dür.) İçerik görünümünün dört kısıtlamasının tümünü üst, alt, öndeki, sondaki kaydırma görünümüne ayarlayın. Yanlış görünse bile hepsini sıfır yapın. İçerik UIView'in yüksekliğini 100 olarak ayarlayın ve unutun. Şimdi yatay olarak kaydırmak istiyorsunuz, bu nedenle içerik görünümünün genişliğini 1225 diyelim.

İçerik görünümünün genişliğinin artık üst kaydırma görünümünün genişliğinden 225 daha büyük olduğuna dikkat edin. Sorun değil: Aslında bunu YAPMALISINIZ. Bunu not et

... Eğer do DEĞİL negatif 225 genişlik sondaki set ...

genişlikleri normalde yaptığınız gibi "eşleştirmeniz" gerektiğini düşünürsünüz . Ama bunu yaparsanız , hiç işe yaramaz.

Baştaki ve sondaki numaraları SIFIR olarak ayarlamalısınız , asla negatif (genişlik "daha büyük" olsa bile)

İlginç bir şekilde, önde gelen / sondaki sayıları herhangi bir pozitif değere ayarlayabilirsiniz ("50" deyin) ve size hemen hemen bir sıçrama payı verir. (Genellikle harika görünür: deneyin.) Her iki uçtaki herhangi bir negatif değer "sessizce" bozulur.

Rahatsız edici bir şekilde, genellikle Xcode'un (yine de 7.3.1'den itibaren),

'yararlı bir şekilde' sizin için bu değerleri negatif sayılara ayarlar!

çünkü bu sizin için otomatik olarak hesaplanmaya çalışıyor. Eğer öyleyse sessizce kırılacaktır. İlk örnekte dört değerin tümünü sıfıra ayarlayın. Ve içerik görünümünün genişliğini örnekte "1000" den çok daha geniş olarak ayarlayın.


Düzenlendi: İhtiyacımın çoğu için UIScrollView yerine UITableView kullanıyorum. TableView bana çok daha esnek ve dinamik gibi görünüyor.


Aslında buradaki en iyi cevap bu. Teşekkürler!
Fattie

4

Sanırım ile ilgili sorunlar yaşıyorsanız contentSize. "Saf" bir Otomatik Düzenleme yaklaşımı kullanıldığında nasıl ele alınacağına ilişkin bu blog yayınına göz atın contentSize. Bunun özü, kısıtlamalarınızın içerik boyutunu örtük olarak tanımlamasıdır. AutoLayout kullanırken ASLA açıkça ayarlamamışsınız. Nasıl çalıştığını göstermek için blog yazısının sonuna örnek proje ekledim


3

Teknik notlarda gözden geçirmiş olabileceğiniz bir parça var. Kaydırma görünümünün kenarlarına sabitlenmiş kısıtlamaları kullanarak kaydırma görünümünün içerik boyutunu dolaylı olarak ayarlayabilirsiniz.

İşte basit bir örnek. Bir kaydırma görünümü olan bir görünümle bir storyboard oluşturun. Görünüm kaydırma sınırlarını, içine koyduğunuz görünümün boyutuna sığacak şekilde ayarlayın.

Bu kaydırma görünümünün içine tek bir görünüm ekleyin. Kısıtlamaları kullanarak bu görünümün boyutunu açıkça ayarlayın (ve boyutun kaydırma görünümünden daha büyük olduğundan emin olun).

Şimdi, iç görünümün dört kenarını ana kaydırma görünümüne kilitleyen o iç görünüme dört kısıtlama daha ekleyin. Bu dört kısıtlama, içerik boyutunun iç görünüme uyacak şekilde genişlemesine neden olur.

Kaydırma görünümüne eklemek istediğiniz birden çok görünümünüz varsa (örneğin yatay olarak düzenlenmişse), ilk alt görünümün sol tarafını kaydırma görünümünün soluna kilitler, alt görünümleri yatay olarak ve sağa kilitlersiniz alt görünümün yan tarafına kaydırın. Bu kısıtlamalar, kaydırma görünümünün içerik boyutunu tüm alt görünümleri ve kısıtlamalarını içerecek şekilde genişletmeye zorlar.


3

Sorunuz "Dikey olarak kayan bir UIScrollView'a bir grup UITextField öğesini nasıl koyarsam, odaklandıklarında klavyenin dışına çıkacaklarsa", en iyi cevap:

Yapma.

Bunun yerine statik hücreler içeren bir UITableViewController kullanın.

Bu kaydırma yolu davranışını ücretsiz olarak alırsınız ve görünüm denetleyiciniz bir UINavigationController içinde görüntüleniyorsa, tüm içerik eklenir.


3

Düzeninizi
ViewControllerViewiçerdiği ScrollView, ScrollViewiçerdiği ContainerView, ContainerViewiçerdiği gibi düzenlemelisiniz 2Labels
resim açıklamasını buraya girin

ArdındanScrollView , kaydırma yapmak için 3 adımı izleyin

  1. Ayar ScrollViewpimi (üst / sağ / alt / sol)ViewControllerView
    • Ayar ContainerViewpimi (üst / sağ / alt / sol)ScrollView
    • Set Horizontally in Container( yok set Vertically in Container)
    • Label1sabitlemek için ( üst / sağ / sol)ContainerView
    • Label1pim (sağ / sol / alt ) için ContainerViewve üst içinLabel1

resim açıklamasını buraya girin

HERE demo projesi

Umarım bu yardım


1

Saf otomatik yerleşim yaklaşımı güzel bir şekilde çalışır, ancak otomatik olmayan düzenlemeden geçiş yapıyorsanız kurulum yapmak oldukça acı vericidir. Şimdi birkaç kez yaptım ve birkaç genel ipucum var:

  • Küçük başlayın: film şeridi görünümlerinizi yeniden oluşturmak anlamına gelse bile, yalnızca birkaç öğe ile başlayın ve görünümlerinizi yavaşça oluşturun, birkaç öğe ekledikten sonra kaydırmanın çalıştığını test ettiğinizden emin olun.
  • TranslatesAutoresizingMaskIntoKonulardaki her şeyi kısıtlar: Bu her zaman benim için kısıtlama çatışmalarının sebebiydi.
  • UIScrollView kısıtlamalarınızı doğru şekilde ayarlayın: kaydırma görünümünün üst görünüme her taraftan bağlı olduğundan emin olun, aksi takdirde hiç genişlemez.

1

Bu sorunu ele aldıktan bir süre sonra nihayet bir çözüm buldum. Evrensel sınıf boyutlarındaki film şeritleriyle (600x600) çalışıyorum. ScrollView boyutunda bir UIView (contentView) oluşturdum ve scrollView için Top, Bottom, Leading ve Trailing için kısıtlamalar oluşturdum. Daha sonra içeriğin boyutunu manuel olarak kırptım 600x600'e. Film şeridi her şeyi yeniden boyutlandırmayı denedi ve çalışabilirdim ama görünüm gerçek cihazda veya simülatörde korkunç görünüyordu. Bu kırpılmış boyutlardan 2 kısıtlama çıkışı yaptım.

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewWidthConstraint; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewHeightConstraint;

Sonra viewDidLoad'da

CGSize viewSize = self.view.frame.size;
self.contentViewWidthConstraint.constant = viewSize.width;
self.contentViewHeightConstraint.constant = viewSize.height;

Harika çalışıyor.


1

Ekranı, tüm ekranı / ekran boyutlarını ve ekran döndürmeyi çalıştıran görünür ekranda ortalamak için AutoLayout görünümünü katıştırılmış bir Scrollview'in nasıl kullanılacağına dair bir çözüm bulmaya çalıştım.

Günleri sadece Autolayout ile yapmaya çalıştım ve yaklaştım ama asla yeterince yakın olmadım. Sonunda viewDidLoad'da ekran başına 3 satır kod eklemek zorunda kaldım.

Aşağıdaki çözüme bakın:

  1. Kaydırma görünümünü oluşturun ve istediğiniz nesnelerle doldurun
  2. Otomatik düzeni aç
  3. Ardından ScrollView'ı Dikey ve Yatay Olarak Ortalayın Orta Kaydırma Görünümü
  4. Görünüm'ü ve ardından 'Eksik kısıtlamalar ekle'yi seçin - bu daha sonra işini yapar
  5. Sonuç, çok fazla kısıtlamanın oluşmasıdır. Görünüm için oluşturulmuş 2 yenisi vardır: 'Görüntüye yatay alan kaydırma görünümü' ve 'Görüntülemek için dikey alan kaydırma görünümü' veya tam tersi.
  6. 'Görünüm için Horiz alanı kaydırma görünümünü' silin, böylece artık Görünüm'de 3 kısıtlama kalmıştır. Görünümde kaydırma görünümüne girmek için 2 ve kaydırma görünümü ile görünüm arasında dikey boşluk ayarlamak için 2
  7. Şimdi Vert kısıtlamasını kodunuza, tıklatarak ve Ctrl başlık dosyasına sürükleyip bir NSLayoutConstraint IBOutlet (mine constraintVertVtoSV olarak adlandırdım) oluşturarak kodunuza bağlayın
  8. Şimdi .m dosyasına gidin ve bu kod satırlarını viewDidLoad'a ekleyin (doğru dikey ortalamayı elde etmek için dolgu miktarı ile oynayın)

    if (IPAD)

    {self.constraintVertVtoSV.constant = 150.0; }

  9. bunun artık tüm cihazlarda çalışması ve düzgün bir şekilde ortalanması ve yine de düzgün bir şekilde kaydırılması gerekir.


1

Eğer benim gibi, alt görünümde sorunlar olmadan statik içerik kullanıyorsunuz, şöyle yapabilirsiniz:

override func viewDidLayoutSubviews() {
    scrollView.contentSize = CGSizeMake(320, 800)
}

1

Benzer sorun bugün iOS 8.4, Xcode 6.4 ile yaşıyorum

Alt görünümleri içeren bir contentView (UIView) içeren bir kaydırma görünümü içeren bir görünüm var.

Her şey her yerde otomatik düzen. Kaydırma görüntüsü kenarları, üst görünüm kenarlarına kısıtlamalarla sabitlenir. İçerik görünümü kenarları, kaydırma görünümü kenarlarına kısıtlamalarla sabitlenir.

Başlangıçta içerik görünümü, kaydırma görünümünün tam genişliği olarak boyutlandırmayı reddeder. Genişliğinin üst kaydırma görünümü ile eşleşmesi için içerik görünümüne ek bir kısıtlama eklemek zorunda kaldım. Veya bir contentView.centerX == scrollView.centerX kısıtlaması ayarlayabilirim. Kenarlardan iğnelemeye ek olarak, bunlardan biri, içerik görünümünü düzgün bir şekilde boyutlandırdı.

// Either one of these additional constraints are required to get autolayout to correctly layout the contentView. Otherwise contentView size is its minimum required size
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: .CenterX, relatedBy: .Equal, toItem: scrollView, attribute: .CenterX, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0.0))

İçerik görünümünün kenarlarını formun görsel kısıtlamalarını kullanarak kaydırma görünümüne sabitlemek,

let cvConstraints = ["H:|[contentView]|", "V:|[contentView]|"]

Dizi üzerinden yineleme ve scrollView onları eklemek için bir rutin kullanın.


1

Benzer bir sorunla karşılaştım. Her kısıtlamayı ayarladım ve neden hala bazı alt görünümleri yeniden boyutlandırdığını merak ediyordum. Benim çözümüm clipToBounds'u YES olarak ayarlamaktı.


1

Gelen Swift , bu çalışma çözümü kullanabilirsiniz.

contraints

ScrollView: Lider, Sondaki, Üst, Alt = Denetim

ContentView: Lider, Sondaki, Üst, Alt = ScrollView. Yükseklik sabit / içeriğe göre.

Genişlik kısıtlamasını (contentView) eşit kaydırmalı görüntüleme denetimine ayarlayabilirsiniz, ancak bu kısıtlamayı programlı olarak ekleyeceğiniz için derleme zamanında kaldır'ı seçin. Bu IB'nin uyarılardan şikayetçi olmamasıdır.

extension UIView {

    func setupContentViewForViewWithScroll(contentView vwContent : UIView) {
        //Set constraint for scrollview content
        let constraint = NSLayoutConstraint(item: vwContent, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.bounds.size.width)
        vwContent.addConstraint(constraint)
        self.layoutSubviews()
    }

}

Ve View Controller'da viewDidLayoutSubviewssadece bu yöntemi çağırıyorum:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.view.setupContentViewForViewWithScroll(contentView: vwContent)
}

0

Bunun bir layman çözümü olduğunu ve Apple'ın docuda önerdiğini bilmiyorum, ancak farklı içeriklerle iki kez benim için çalıştı ve çok hızlı bir şekilde kurulabilir: Film şeridi görünümü denetleyicisine UIView ekleyin. UIView içine bir Tablo Görünümü, Dinamik, 0 Prototip hücre, Stil Düz veya Gruplanmış ekleyin. Tablo Görünümü'ne bir Kaydırma Görünümü ekleyin, Kaydırma Görünümü'ne içerik ekleyin. Bu, özel görünüm denetleyicisinde ayar yok.

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.