Bir var UIScrollView
bir çok içeren UIImageView
vb s, UILabels ... etiketler bu kadar uzun olanUIScrollView
, ama app çalıştırdığınızda, ben tıklayın ve aşağı kaydırın olamaz ...
Bu neden olabilir?
Teşekkürler
Bir var UIScrollView
bir çok içeren UIImageView
vb s, UILabels ... etiketler bu kadar uzun olanUIScrollView
, ama app çalıştırdığınızda, ben tıklayın ve aşağı kaydırın olamaz ...
Bu neden olabilir?
Teşekkürler
Yanıtlar:
Tam bir çalışan kod pasajı göstermek her zaman iyidir:
// in viewDidLoad (if using Autolayout check note below):
UIScrollView *myScrollView;
UIView *contentView;
// scrollview won't scroll unless content size explicitly set
[myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size
Swift 4.0
let myScrollView
let contentView
// scrollview won't scroll unless content size explicitly set
myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size //sets ScrollView content size
IB'de contentSize ayarlamanın bir yolunu bulamadım (Xcode 5.0 itibariyle) .
Not: Otomatik Düzen'i kullanıyorsanız, bu kodu yerleştirmek için en iyi yer yöntemin içidir -(void)viewDidLayoutSubviews
.
myScrollView.delegate = self
AYRICA ayarlamayı unutmayın , eğer bu hala çalışmıyorsa, bunun altındaki yanıtta HARİKA bir tavsiye var (xib / StoryBoard'unuza gidin ve "Otomatik Yerleşim" in devre dışı bırakıldığından emin olun). Uzman İpucu: <UIScrollViewDelegate>
UIScrollView'unuzu programlı olarak kaydırmak gibi şeyler yapmak istiyorsanız, .h dosyanıza da ekleyebilirsiniz .
viewDidLayoutSubviews
benim için çalışmasını sağladı.
ContentSize'ı doğru bir şekilde ayarladıktan sonra bile görünümü kaydıramıyorsanız , Interface Builder -> File Inspector'da " Otomatik Yerleşimi Kullan" seçeneğinin işaretini kaldırdığınızdan emin olun .
Ayarlamanız gerekiyor contentSize
Düzgün kaydırılması için kaydırma görünümünün özelliğini gerekir.
Eğer autolayout kullanıyorsanız, sette gerek contentSize
de viewDidLayoutSubviews
o autolayout tamamlanıncaya sonra uygulanacak sırayla.
Kod şöyle görünebilir:
-(void)viewDidLayoutSubviews
{
// The scrollview needs to know the content size for it to work correctly
self.scrollView.contentSize = CGSizeMake(
self.scrollContent.frame.size.width,
self.scrollContent.frame.size.height + 300
);
}
contentSize
boyutuna ayarlasam bile contentView
, scrollView ve contentView boyutlarının aynı şekilde ayarlandığı görülüyor. Ancak yüksekliği, yüksekliğinden contentSize
daha büyük bir değere ayarlandığında contentView
işe yaradı.
viewDidLayoutSubviews
bir yaşam döngüsü boyunca birden çok kez çağrılabilir, böylece yüksekliği beklenenden daha fazla artırma riskini alırsınız.
Yukarıdaki cevap doğrudur - kaydırmayı gerçekleştirmek için içerik boyutunu ayarlamak gerekir.
Arayüz oluşturucuyu kullanıyorsanız, bunu yapmanın düzgün bir yolu kullanıcı tanımlı çalışma zamanı öznitelikleridir. Örneğin:
İçerik boyutunu çok büyük sayılara yeniden boyutlandırmayı deneyin. İçerik boyutu kontrol boyutundan daha büyük görünse bile kaydırma görünümümün neden kaydırılmadığını anlayamadım. İçerik boyutu gerekenden daha küçükse işe yaramadığını keşfettim.
self.scrollView.contentSize = CGSizeMake(2000, 2000);
2000 yerine kendi büyük sayılarınızı koyabilirsiniz. Ve işe yararsa, yeniden boyutlandırdığınızda içerik boyutunuzun yeterince büyük olmadığı anlamına gelir.
Kaydırma görünümünün çalışması için temsilci gerekli değildir.
Kaydırma görünümünün contentSize özelliğinin doğru boyuta ayarlandığından emin olun (yani, tüm içeriğinizi kaplayacak kadar büyük bir tane.)
"Otomatik Düzen Kullan" seçeneğinin işaretini kaldırın, benim için hile yaptı.
Ortam: xCode 5.0.2 Storyboard'lar ios7
Benim durumumda delaysContentTouches
, scrollView içindeki nesnelerin tümü touchView'ın kendisinin işlemesine izin vermek yerine dokunma olaylarını yakaladığı ve kendilerini işlediği için true olarak ayarlamak zorunda kaldım .
Set contentSize
malıdır UIScrollview
içinde ViewDidLayoutSubviews
yöntemle. Bunun gibi bir şey
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
Kaydırma görünümünün neden kaydırılmadığı fikri, kaydırmak için içerik boyutunu kaydırma görünümünün boyutundan daha az ayarladığınız için yanlıştır. Kaydırma sırasında gezinmek için içerik boyutunu kaydırma görünümünüzün boyutundan daha büyük ayarlamalısınız.
Yakınlaştırmayla aynı fikirde, yakınlaştırma eylemi aracılığıyla uygulanacak yakınlaştırma için minimum ve maksimum değeri ayarlarsınız.
Hoşgeldiniz :)
Küçük bir ekleme, yukarıdakilerin tümü, kaydırma görünümünüzün kaydırılmamasının gerçek nedenleridir, ancak bazen bu, özellikle kaydırma görünümü IB aracılığıyla değil de kod aracılığıyla eklendiğinde neden olabilir, alt görünümlerinizi ana görünüme eklemiş olabilirsiniz. kaydırma görünümü alt görünümün kaydırılmamasına neden olur
ve içerik boyutunu ayarlanmış ve üst görünüm çerçevesinden daha büyük tutun (duhh !!)
İlk denememde çalıştırdım. Otomatik düzen ve her şeyle, ek kod yok. Sonra bir koleksiyon görünümü muz oldu, çalışma zamanında çöktü, neyin yanlış olduğunu bulamadım, bu yüzden onu sildim ve yeniden oluşturdum (Xcode 10 Beta 4 kullanıyorum, bir hata gibi hissettim) ve sonra kaydırma gitti. Koleksiyon görünümü yine çalıştı!
Saatler sonra ... bu benim için düzeltti. Aşağıdaki düzene sahiptim:
UIView
Hepsi kısıtlamada. Güvenli Alan, sistem tarafından otomatik olarak tanımlanır. En kötü durumda, kaydırma ve içerik görünümleri için tüm kısıtlamaları kaldırın ve bunları sizin için IB sıfırlama / oluşturmaya sahip olmayın . El ile yapın, işe yarıyor.
temelde konsept, Güvenli Alana uyan Scrollview'a uygun İçerik görünümüne sahip olmaktır.
Ama böyle olmadı. İçerik görünümü yüksekliği kaçırdı. Elimden gelen her şeyi denedim ve hile yapan tek kişi, İçerik görünümünü kontrol edip sürükleyerek oluşturulan bir İçerik görünümü yüksekliği oldu .. kendine . Bu, değer görüntüleme denetleyicisinin Boyutundan hesaplanan sabit bir yüksekliği tanımladı (serbest form olarak tanımlanır, gerçek ekrandan daha uzun, tüm alt görünümlerimi içerir) ve sonunda tekrar çalıştı!
Daha önce bahsedilmeyen bir şey!
Çıkışınızın scrollView'a doğru şekilde bağlandığından emin olun! Dolu bir daireye sahip olmalıdır, ancak daireyi doldurmuş olsanız bile, scrollView bağlanmamış olabilir - bu yüzden iki kez kontrol edin! Dairenin üzerine gelin ve gerçek kaydırma görünümünün vurgulanıp vurgulanmadığını görün! (Bu benim için bir durumdu)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
Eğer bir öğretici izledi ama ne birçok başlayanlar değil biliyorum do scrollview olmasıdır varsa çok zaman kod doğrudur DEĞİL simülatör aracılığıyla normalde kaydırmak için gidiyor. Yalnızca fare altlığına bastığınızda ve aynı anda kaydırdığınızda kaydırma yapması gerekir . Birçok Deneyimli XCode / Swift / Obj-C kullanıcısı bunu yapmaya çok alışkındır ve bu nedenle yeni başlayanlar tarafından nasıl gözden kaçabileceklerini bilmiyorlar. Ciao :-)
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
// Do any additional setup after the view
}
override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
scrollView.contentSize = CGSize(width: 375, height: 800)
}
Yukarıda söylediğimi yaptığınız sürece bu kod mükemmel şekilde çalışacaktır.
Diğer çözümlerden hiçbiri sizin için işe yaramazsa, kaydırma görünümünüzün aslında bir UIScrollView
Arayüz Oluşturucu'da olup olmadığını iki kez kontrol edin .
Son birkaç gün içinde bir noktada, benim UIScrollView
kendiliğinden değişmiş tip bir etmek UIView
, olsa onun sınıf bahsedilen UIScrollView
denetçisindeki. Kullanıyorum Xcode 5.1 (5B130a)
.
Ya yeni bir kaydırma görünümü oluşturmak ve eski görünümünden ölçümler, ayarları ve kısıtlamaları kopyalamak veya el ile için görünümünüzü değiştirebilir olabilir UIScrollView
de xib
dosyaya. Bir karşılaştırma yaptım ve aşağıdaki farklılıkları buldum:
Orijinal:
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>
Tip kendiliğinden değiştikten sonra:
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>
Bu yüzden <view>
çizgiyi orijinal <scrollView>
çizgimle değiştirdim.
Ayrıca görünümün kapatma etiketini </view>
ile değiştirdim </scrollView>
.
Kimliği geçerli görünümle aynı tuttuğunuzdan emin olun, bu durumda: id = "qRn-TP-cXd".
Ayrıca, uygulamanın türetilen verilerini silerek xib'i Xcode'un önbelleğinden temizlemek zorunda kaldım:
Xcode->Window->Organizer->Projects
, projenizi seçin, Türetilmiş Veriler satırında Sil ...Veya bir cihaz kullanıyorsanız:
Xcode->Window->Organizer->Device
, cihazınızı seçin-> Uygulamalar, uygulamanızı seçin, tıklayın (-)Şimdi projeyi temizleyin ve uygulamayı simülatörden / cihazdan kaldırın:
Xcode->Product->Clean
Simulator/device->press
ve app->click
kaldırmak için (X) 'i basılı tutunDaha sonra uygulamanızı oluşturup çalıştırabilmeli ve kaydırma işlevine yeniden sahip olmalısınız.
Not: Kaydırma görünümünün içerik boyutunu viewDidLayoutSubviews
otomatik mizanpajı ayarlamam veya kapatmam gerekmedi , ancak YMMV.
Eğer sizin scrollView
a türünün bir alt görünümü ise containerView
, o zaman kendinizin scrollView
çerçevesinin veya sınırlarının içinde olduğundan emin olun containerView
. containerView.clipsToBounds = NO
Hala scrollView'i görmeme izin veren bir şey vardı , ancak scrollView
sınırları içinde containerView
olmadığından dokunma olaylarını algılamayacaktı.
Örneğin:
containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;
ScrollView'i görebileceksiniz, ancak kullanıcı etkileşimlerini almayacaktır.
viewDidLayoutSubviews
Autolayout ile benim için aşağıdaki kodu eklemek çalıştı. Tüm cevapları denedikten sonra:
- (void)viewDidLayoutSubviews
{
self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
}
//set the height of content size as required
Benim için düzeltilen yönteme UIScrollViewDelegate
aşağıdaki kodu ekleyin ve ekleyin viewDidAppear
.
@interface testScrollViewController () <UIScrollViewDelegate>
-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}
Sorunum şu şekilde çözüldü:
Güvenli alana ve / veya denetime bağlı üst ve / veya alt kısıtlamaları kaldırdıktan sonra, scrollView içindeki görünümler tekrar kayabilirdi ve ekranın alt kısmına sabit kalmadı!
Umarım bu, bu sorunla ilgili olarak bir başkasının saatlerce acı çekmesini önler.
yine bir başka eğlenceli durum:
scrollview.superview.userInteractionEnabled doğru olmalıdır
Bunu takip ederek 2 saatten fazla zaman harcadım, sadece ebeveynin UIImageView olduğunu anlamak için, doğal olarak userInteractionEnabled == false
Bu konudaki verilen cevaplarda başarısız olduktan sonra, bu makaleye rastladım çözüm ile .
Kaydırma görünümünü otomatik düzen ile ayarlamanın sezgisel olmayan iki yönü vardır:
Bu makalenin özü budur. Çizimler dahil tam bir açıklama için kontrol edin.
Bu AutoLayout sorunu ile buldum ... eğer sınıf için ViewController
kullanmak UIView
yerine sadece kullanırsam ... o zaman işe yaradığını kendim eklersem.UIScrollView
UIScrollView
IB'de de aynı sorunu yaşadım.
ScrollView’un başını, sonunu, üstünü ve altını superView’a ayarladıktan sonra. İşe yarayan containerView kaydırılabilir hale getirmek için aşağıdaki değişiklikleri yaptım.
ScrollView'in yalnızca yatay yönde kaydırmasını sağlamak için, scrollView'in centerY = ContainerView's centerY ile kısıtlamayı yapın.
ve dikey olarak kaydırılabilir hale getirmek için scrollView'in centerX = ContainerView's centerX