Arabirim Oluşturucu'da UIScrollView'ı nasıl kullanırım?


95

UIScrollViewGeçmişte onu programlı olarak işleyerek başarılı bir şekilde kullanmış olsam da, özel olarak Interface Builder'da kurarak onu çalıştırmakta sorun yaşıyorum.

İPhone uygulamamda basit bir "hakkında" sayfam var. Bir UITextView, bazı simgeleri ve diğer uygulamalarıma bağlantılar var. Tüm bu görünümleri UIScrollView, toplam boyutları> 480 olacak şekilde düzenleyerek kendi görünümüme ekledim. Uygulamamı başlattığımda, kaydırma görünümü yalnızca ekrana sığan içerikleri görüntülüyor ve hiçbir şey kaydırılmıyor.

Bunu tamamen IB aracılığıyla yapmak mümkün mü yoksa contentSize'ı kod yoluyla mı değiştirmeliyim?

Yanıtlar:


130

UIScrollView öğesinin contentSize özelliğini ayarlamayı unuttunuz. Garip bir şekilde, bunu Interface Builder'dan yapamazsınız. Bunu, bu kaydırma görünümünü yöneten görünüm denetleyicisinden yapmanız gerekecek.


42
Vay canına, IB'yi daha çok anlamsız yapıyor ... Bu hile yaptı, teşekkürler.
George Armhold

20
(0,0) 'da yalnızca bir alt görünüm olup olmadığını kontrol eden ve ardından bu alt görünüme göre contentSize'yi otomatik olarak ayarlayan bir UIScrollvView alt sınıfı oluşturabilirsiniz.
Stefan Arentz

1
Bir süredir aldığım en iyi tavsiye bu. Kaydırma görünümümün neden çalışmadığını anlayamadım ve contentSize ile ilgili bu bilgiyi başka hiçbir yerde bulamadım. Teşekkürler.
Drew C

46
Interface Builder'da contentSize'nin nasıl ayarlanacağını anlamaya çalışıyordum ve bu tartışmayı buldum. En azından benim için, Xcode 4.5'te, “Kullanıcı Tanımlı Çalışma Zamanı Nitelikleri” kullanarak contentSize, type adında bir giriş ekleyerek Sizeve istenen değeri ayarlayarak bunu ayarlayabilirim.
nlogax

5
İOS'un neden bir kaydırma görünümünü otomatik olarak contentSizealt görünümlerinin boyutlarına göre , en azından varsayılan davranış olarak ayarlamaması konusunda hala şaşkınım .
2014

113

Boby_Wan'ın cevabı beni düşündürdü ve UIScrollView'ün contentSize'sini Interface Builder'dan yapılandırmak için aşağıdaki çözümü buldum:

  1. Seç UIScrollViewStoryboard sahnede
  2. Git Kimlik denetçisi yeni oluşturmak, Kullanıcı Tanımlı Süre Özellik (+ düğmesini tıklayın)
  3. Nitelik değiştirme Anahtar Yolu içincontentSize
  4. Öznitelik Türünü şu şekilde değiştirin:Size
  5. Şimdi Değeri { istenen içerik genişliği , istenen içerik yüksekliği } olarak ayarlayın.

Örneğin, değeri {320, 920} olarak ayarlamak, kullanıcının iPhone'da fazladan bir ekran aşağı kaydırmasına olanak tanır.

(Xcode 4.3.3 kullanıyorum, projenin iOS Dağıtım Hedefi 5.1)

Bunu ilk yaptığımda aşağıdaki hatayı aldım:

Hatalı Yapılandırma:
     Boyut türü kullanıcı tanımlı çalışma zamanı öznitelikleri, 4.3
     MainStoryboard.storyboard'dan önceki Xcode sürümleri ile

Siz de bu hatayı alırsanız düzeltmek kolaydır: Proje Gezgini'nde Öykü Panosu'nu seçin ve Dosya denetçisini açın . Arayüz Oluşturucu Belgesi bölümünü bulun / genişletin ve Geliştirme için bir açılır menü vardır . Bunun olarak ayarlandığından emin olunXcode 4.3


7
Harika bul! Not: Apple'ın yapabileceği en iyi şeyin bu olduğuna şaşırdım. Sanırım bu, Apple çalışanlarının bile asla kendi araçlarını (arayüz oluşturucu) kullanmadıklarını gösteriyor :).
Adam

Harika, bu benim için Xcode 4.4'te çalıştı. Ama şimdi kaydırma görünümünün IB'de "göremediğim" kısmına düğmeleri nasıl koyabilirim?
Robert Atkins

1
Az önce hallettim - işaretçi hala "ekranın" içindeyken sürüklemeyi bırakmalısınız, aksi takdirde başladığınız zamana geri dönecektir. Ne acı.
Robert Atkins

Bu şekilde denedim ama bir hata alıyorum "this class is not key value coding-compliant for the key keyPath", neyi yanlış yapıyorum bana yardım eder misin? xamarin-ios-c # kullandığımı lütfen unutmayın
SoftSan

25

Otomatik Düzen (iOS6 +) ile ayar yapmaktan kaçınabilirsiniz contentSize. Bunun yerine aşağıdaki kısıtlamaları ayarlayın:

  1. Kaydırma görünümünün üstünü, en üstteki alt öğesinin üstüne sabitleyin.
  2. Ve altını en alttaki çocuğunun altına sabitleyin.

1
Teşekkürler - ayar contentSizeXcode 5 ve iOS 7 ile çalışmıyor
colincameron

18

Bunu yalnızca Arabirim Oluşturucu kullanarak yapabilir, Kimlik Denetçisi'ne (üçüncü denetçi sekmesi) gidebilir ve yeni bir Kullanıcı Tanımlı Çalışma Zamanı özniteliği ekleyebilirsiniz.

  • Anahtar Yol: contentSize
  • Tür: Boyut
  • Değer: {genişlik, yükseklik}

14

Artık Storyboard'danUIScrollView ayrılmadan bir kaydırma yapmanın bir yolu var :

  1. Seç UIScrollViewFilm Şeridi'nde, gidin Boyut denetçisi ve değişim Dip değeri (veya ne olursa olsun değişim gereken başka değer) İçerik Insets içerik alanının yüksekliğine bölümünde.
  2. Şimdi Kimlik denetçisine gidin ve yeni bir Kullanıcı Tanımlı Çalışma Zamanı Özniteliği oluşturun (+ düğmesini tıklayarak) ve adlandırın contentSize. Hangi Tür veya Değer'i girdiğiniz önemli değil (varsayılan değerlerini bile bırakabilirsiniz).

UIScrollViewİkinci adımın neden gerekli olduğunu bilmesem de (tesadüfen öğrendim) bu, çalışmayı doğru bir şekilde yapacak. :(


Alt değer neye değiştirilsin?
zakdances

İçerik alanının yüksekliğine değiştirin. Çalışıyor gibi görünüyor ve kullanıcı tanımlı "contentSize" özelliği için sağladığınız değeri geçersiz kılıyor.
Reid Ellis

Evet Reid, haklısın: Alt değeri içerik alanının yüksekliğine değiştirmelisin. Orijinal yazımı bunu yansıtacak şekilde düzenledim. Teşekkür ederim!
RoberRM

4

Geçmişte kullandığım bir yaklaşım, kaydırma görünümünü arayüz oluşturucudaki içerdiği görünümün dışına sürüklemek ve gerçek boyutunu contentSize'nin olmasını istediğine ayarlamaktır.

Arayüz oluşturucu hakkında doğası gereği açık olmayan şey, uçta depolanan, ancak ucun esas olarak kullanıldığı ana görünümün bir parçası olmayan ilişkisiz görünümlere sahip olabilmenizdir.

kaydırma görünümünün yaşamasını istediğiniz yere, yer tutucu olarak kullandığınız basit bir UIView yerleştirin. (Bu, sadece konumunu görsel olarak tasarlayabilmeniz içindir. Yalnızca tüm görünümü kullanıyorsanız, bu adımı atlayabilir ve bu cevabın sonunda sağladığım ikinci kod parçacığını kullanabilirsiniz).

daha sonra kaydırma görünümünü kontrollerle doldurabilir ve nasıl olmasını istediğinizi görsel olarak düzenleyebilirsiniz. çalışma zamanında onlara erişebilmeniz için görünüm denetleyicinizin içinde hem yer tutucuyu hem de kaydırma görünümü özelliklerini verin.

çalışma zamanında - (void) viewDidLoad

scrollView.contentSize = scrollView.frame.size;
scrollView.frame = placeholder.frame;
[placeholder.superview addSubView:scrollView];
[placeholder removeFromSuperview];

alternatif olarak (bir yer tutucu kullanmadıysanız):

CGRect f = self.view.frame;
scrollView.contentSize = f.size;
f.origin.x = 0;
f.origin.y = 0;
scrollView.frame = f;
[self.view addSubView:scrollView];

son olarak, arayüz oluşturucudaki kaydırma görünümünüzü "kaybederseniz" (onu kapatmak mümkündür, böylece tasarım kılavuzundan kaybolur), panik yapmayın. tasarım kılavuzunun solundaki nesne listesinde ona tıklamanız yeterlidir.


1
Teşekkürler - bu iyi çalıştı. Ayrıca, yer tutucu ve kaydırma görünümleri için YourViewController.h'de IBOutlets bildirmeniz ve bunları Arabirim Oluşturucu'da bağlamanız gerekir. Ve son olarak, dot.notation 3. satır için xCode tarafından beğenilmedi, bu yüzden normal mesaj gönderme sözdizimi kullanıldı - sonra her şey harika çalıştı!
jiy

telaşa gerek yok. Kod parçacıkları gönderirken, her durumda "tam" kodun çalışmasını beklemek yerine, bazı kişilerin konsepti anlamak için bunları kullanamaması tehlikesi her zaman vardır.
senkronize edilmemiş

Aslında kullandığım yöntem bu. Bu programı yeniden boyutlandırmam bile gerekmiyor. Bence yapılması amaçlanan yol bu. Tek doğru cevap bu.
user4951

Dışarıda çizdikten sonra, onu süper görünüme taşıyacağım. Tada.
user4951

Aslında karalama tahtaları için bir sahne dışında bazı görünümler tasarlamaya başladım ve bu, bununla ilgisi olmayan bazı durumlarda hayatı çok daha kolaylaştırıyor. Bu cevap için teşekkürler.
Benjamin

4

Autolayout kullanan Xcode 4.5'te, boyut denetçimde Content Insets bölümü yok. Bu yüzden onu Kullanıcı Tanımlı Çalışma Zamanı Öznitelikleri altına eklemek zorunda kaldım ve sonra iyi çalıştı.

"Kullanıcı Tanımlı Çalışma Zamanı Öznitelikleri" ne eklediğiniz, "Rect" türünde (Rect ile aynı girdiye sahip UIEdgeInsets) ve {top, left}, {bottom, right} olarak tanımlanan keyPath == contentInset'dir. ContentSize yalnızca kaydırma görünümü penceresinin bölgesini tanımlar. contentInset kaydırılabilir alanı tanımlar.

Umarım bu aynı durumda olan birine yardımcı olur.


UITextView için "textContainerInset" anahtaryolunu kullanın
Dima Deplov

4

Yukarıdaki cevapların çoğu yanıltıcıdır veya geçerliliğini yitirmiştir. 2017 itibariyle (muhtemelen çok daha erken) arayüz oluşturucu , otomatik olarak boyutlandırılmış içeriğe sahip kaydırma görüntülemelerini desteklemektedir. İşin püf noktası, XCode'un kaydırma görünümü ile içindeki içerik arasındaki kısıtlamalara özel, standart olmayan bir anlam vermesidir. Bu "içe" kısıtlamalar olacak değil başka türlü tahmin olarak aslında içeriğin boyutunu etkiler.

Bu, örneğin kaydırma görünümünüzü sıfır kenar boşluğuyla ana görünümün altına sabitleyebileceğiniz ve ayrıca kaydırma görünümünüzün içeriğini kaydırma görünümünün altına sıfır kenar boşluğu ile sabitleyebileceğiniz anlamına gelir, ancak içerik gerçekte bu şekilde genişletilmez. Bunun yerine içerik, kendi belirlediği boyutunu (daha fazla aşağıda) alacaktır ve bu aynı zamanda kaydırma görünümündeki kaydırılabilir alanın boyutu olacaktır.

Şöyle düşünün - Bir kaydırma görünümüne bağlanma kısıtlamalarında bir asimetri vardır: Kaydırma görünümünden "dış" (üst) dünyaya yönelik kısıtlamalar, her zamanki gibi kaydırma görünümünün boyutunu ve konumunu belirler. Ancak kaydırma görünümünün "içindeki" kısıtlamalar, kaydırma görünümünün kaydırılabilir alanının boyutunu ve konumunu içeriğe bağlayarak gerçekten ayarlıyor.

Bu tamamen açık değildir çünkü kısıtlamaları ayarlamaya gittiğinizde XCode her zaman geçerli aralığı önerecektir ve içe ve dışa dönük kısıtlamaları çakışacak şekilde kasıtlı olarak değiştirmek asla aklınıza gelmeyebilir. Ancak yapabilirsiniz ve yukarıda açıklanan anlamı vardır: biri kaydırma görünümü düzenini, diğeri kaydırılabilir içerik alanı boyutunu kontrol eder.

Buna tesadüfen rastladım ve sonra nasıl çalıştığını görünce beni tamamen açıklayan ve bunun için Apple dokümanları kaynağına atıfta bulunan bu makaleye götürdüm:

https://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/

İçeriğin kendi belirlediği boyutla ilgili son bir kritik bilgi parçası: Burada bir yakalama 22'de olduğunuzu hissedebilirsiniz çünkü normalde içeriğinizi örneğin ana görünümün genişliğine göre boyutlandırırsınız, ancak bu durumda üst öğe kaydırma görünümüdür ve yukarıda açıklandığı gibi - kısıtlama içerik boyutunuzu etkilemeyecektir. Buradaki cevap, öğeleri görünüm hiyerarşinizde doğrudan komşu olmayan öğelerle sınırlayabileceğinizi hatırlamaktır: örneğin, içerik görünümünüzün genişliğini ana görünümün genişliğine ayarlayarak bunu yapmak için kaydırma görünümünü elde etmeye çalışmak yerine senin için.


2

Arayüz Oluşturucu'da herhangi bir Görünüm Denetleyicisinin Özellikler simgesini tıklarsanız, Simüle Edilmiş Metrikler'de bunu bir "Serbest Biçim" boyutuna ayarlayabilir ve ana Görünümün boyutunu istediğiniz içerik boyutuna değiştirebilirsiniz.

Bu şekilde ScrollView içeriğinizi tek bir büyük görünüm gibi oluşturabilirsiniz. Yalnızca simüle edilmiş bir metrik olduğundan, Görüntüleme Denetleyiciniz yüklendiğinde pencerenin sınırlarına göre yeniden boyutlandırılacaktır.


2

Arabirim Oluşturucu aracılığıyla bir UIScrollView kurmak sezgisel değildir. İşte onu kurmak için kontrol listem:

  1. UIViewController'ın XIB dosyasını seçin. Arabirim oluşturucunun "Kimlik Denetçisi" nde, UIView öğesini UIScrollView sınıf türüne değiştirin

  2. "Dosya Denetçisi" altında, Otomatik Düzen'in işaretini kaldırın

  3. "Attributes Inspector" altında, boyutu Serbest Biçim olarak değiştirin. Daha sonra Kaydırma Görünümünü manuel olarak uzatabilir veya "Boyut Denetçisi" altında özel bir genişlik ve yükseklik belirtebilirsiniz.

  4. "Identity Inspector" da, "Size" türünde "contentSize" adlı yeni bir Kullanıcı Tanımlı Çalışma Zamanı Özniteliği ekleyin ve {320, 1000} gibi bir değere değiştirin. Bunu artık programlı olarak ayarlayamazsınız ve bu nedenle Kaydırma Görünümünün Kaydırma Görünümü içeriğinin pencereden daha büyük olduğunu bilmesi için bu adıma ihtiyacınız vardır.


2

Kaydırma görünümünüzden autoLayout'u kaldırmanız yeterlidir. o zaman kod bu kadar basittir:

scrollviewName.contentSize = CGSizeMake(0, 650);

sadece .h dosyasında bir iboulet özelliği oluşturun ve ardından .m dosyasında sentezleyin. Kaydırmanın etkinleştirildiğinden emin olun.


1

Evet, st3fan haklı, UIScrollView'in contentSize özelliği ayarlanmalıdır. Ancak bu amaç için otomatik düzeni kapatmamalısınız. UIScrollView içerik boyutunu, herhangi bir kod olmadan yalnızca IB'de otomatik düzen ile kolayca kurabilirsiniz.

UIScrollView öğesinin otomatik düzenini kullanırken contentSize doğrudan ayarlanmadığında, UIScrollView’un tüm alt görünümlerinin kısıtlamalarına göre hesaplandığını anlamak önemlidir. Ve tek ihtiyacınız olan, her iki yön için de alt görünümler için uygun kısıtlamalar sağlamaktır.

Örneğin, yalnızca bir alt görünümünüz varsa, yüksekliğini ve boşluğunu yukarıdan ve aşağıdan denetlemeye ayarlayabilirsiniz (yani bizim durumumuzda scrollView) contentSize.height, toplam olarak hesaplanır

Vertical Space (aSubview.top to Superview.top) + aSubview.height + Vertical Space (aSubview.top to Superview.top)

contentSize.width, yatay kısıtlamalardan benzer şekilde hesaplanır.

ContentSize düzgün bir şekilde hesaplamak için çok az kısıtlama varsa, düzen belirsizliği hakkında bilgi vermek için Küçük kırmızı düğme View Controller Scene öğesinin yanında gösterilir.

Çok sayıda alt görünüm varsa, bu kısıtlamalar "zinciri" olabilir: Danyal Aytekin'in yanıtında olduğu gibi yukarıdan en üste alt görünüm, alt görünümler arasındaki yükseklikler ve boşluklar ve en alttan alt görünümden aşağıya .

Ancak pratikte çoğu durumda, gereken boyutta boş bir görünüm eklemek ve scrollView'ın üst, sol, alt, sağındaki boşlukları 0'a ayarlamak daha uygundur. kaydırma Görünümünün Bu görünümü "içerik Görünümü" olarak kullanabilirsiniz, yani diğer tüm alt görünümleri yerleştirebilirsiniz. üzerinde veya zaten birçok alt görünümünüz varsa ve bunları taşımak ve düzeni tekrar ayarlamak istemiyorsanız, bu yardımcı görünümü mevcut alt görünümlere ekleyebilir ve gizleyebilirsiniz.

ScrollView kaydırılabilir hesaplanan contentSize yapmak için, scrollView boyutundan büyük olmalıdır.


1

Autolayouts ile StoryBoard'da UIScrollView'a sahip olabilirsiniz. Temel olarak ihtiyacınız olan şey:

  1. UIScrollView ekle
  2. Tüm kısıtlamaları ona ekleyin (üst, sol, sağ, alt kenarlardan girintiler gibi)
  3. UIScrollView'a bir 'kapsayıcı' UIVView ekleyin
  4. Yalnızca tek yönlü kaydırma (örneğin, dikey) istiyorsanız: yüksekliği açıkça (örnek için, 600) ve bağlantı genişliğini UIScrollView genişliğine ayarlayın.
  5. İki yönlü kaydırma istiyorsanız, sadece hem genişliği hem de yüksekliği ayarlayın.

film şeridi kurulumu



0

Daha uygun bir yol buluyorum.

1: Kaydırma görünümünün boyutunu, içindeki tüm kullanıcı arayüzlerini içerecek şekilde ölçekleyin.

2: Kaydırma görünümüne bir iboutlet ekleyin.

3: viewDidLoad'da, kaydırma görünümünün çerçeve boyutunu kaydedin.
(ör. _scrollSize = _scrollView.frame.size;)

4: viewWillAppear'da, daha önce kaydettiğiniz CGSize ile contentSize değerini ayarlayın.
(ör. _scrollView.contentSize = _scrollSize;)

5: Bitti ~


0
  1. UIViewController ekleyin
  2. UIViewController'da 'Öznitelik Denetçisi -> Simüle Edilmiş Metrikler' ayar boyutu Serbest Biçim
  3. UIViewController'da 'Size Inspector -> View Controller' yüksekliği 800 olarak ayarlayın
  4. UIViewController'a UIScrollView ekleyin
  5. Tüm kısıtlamaları UIScrollView'a (üst, sol, sağ, alt) ekleyin ve X = merkez hizalamasını ekleyin
  6. UIScrollView'da UIView ekle
  7. Tüm kısıtlamaları UIView'a (üst, sol, sağ, alt) ekleyin ve X = merkez hizalamasını ekleyin. Evet, # 3'teki UIScrollView ile aynı, ancak UIView için
  8. UIView'a yükseklik kısıtlaması ekleyin. Örneğin 780
  9. Çalıştırmak

Storyboard


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.