Bir var UIView
iPhone'un Springboarddan gibi. Bunu bir UIScrollView
ve kullanarak oluşturdum UIButtons
. Söz konusu kaydırma görünümünde yatay kaydırmayı devre dışı bırakmak istiyorum. Yalnızca dikey kaydırma istiyorum. Bunu nasıl başarırım?
Bir var UIView
iPhone'un Springboarddan gibi. Bunu bir UIScrollView
ve kullanarak oluşturdum UIButtons
. Söz konusu kaydırma görünümünde yatay kaydırmayı devre dışı bırakmak istiyorum. Yalnızca dikey kaydırma istiyorum. Bunu nasıl başarırım?
Yanıtlar:
contentSize
Özelliğini ayarlamanız gerekir UIScrollView
. Örneğin UIScrollView
, 320 piksel genişliğinde (ekranın genişliği), o zaman şunu yapabilirsiniz:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
Daha UIScrollView
sonra, her şeyi yatay olarak görüntüleyebildiğinden, yalnızca dikey olarak kaydırılır.
GÜNCELLENDİ: (@EranMarom yorumuna işaret ettikten sonra)
Şunları yapabilirsiniz yatay kaydırma veya dikey kaydırmayı durdurmak içinde ScrollViewDelegate
Yöntemiyle. İşte nasıl
Yatay Kaydırmayı Durdurur:
Yatay olarak kaydırmak istiyorsanız, contentOffset.x'i artırmanız gerekir. Kaydırma görünümünün yatay yönde kaydırılmasını durdurmanın engellenmesi.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
Dikey Kaydırmayı Durdurur:
Dikey olarak kaydırmak istiyorsanız, contentOffset.y'yi artırmanız gerekir. Kaydırma görünümünün dikey yönde kaydırılmasını durdurmanın engellenmesi.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
Yukarıdaki kod değişiklikleri önler x
ve y
a scrollview contentOffset
ve içinde kaydırmayı durdurmak neden scrollViewDidScroll:
yöntem.
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
yatay kaydırmayı devre dışı bırakmak için. Daha okunaklı buluyorum, daha küçük ve sıfır için testi yapmanın bir anlamı yok çünkü bunu seyrek olarak çalıştıran kodda neredeyse hiç ek yük yok (yani saniyede birkaç on kez).
scrollView.contentOffset.y = 0.0
dikey kaydırmayı durdurmak ve scrollView.contentOffset.x = 0.0
yatay kaydırmayı durdurmak için kullanın scrollViewDidScroll()
. Bununla birlikte, scrollView.contentSize
eşit olanın scrollView.frame.size
daha iyi (doğru) bir çözüm olduğuna inanıyorum . @Danbeaulieu cevabına bakın.
iOS7 kullanımından beri
self.automaticallyAdjustsScrollViewInsets = NO;
// ve 3 sayfalı sayfa kaydırıcınızı oluşturun
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
düzgün kaydırma (sürükleme değil) ile sorunu çözmeme yardımcı oldu. Sorun yöntemdeydi scrollViewWillEndDragging:
- targetContentOffset, scrollView.contentOffset ile aynıydı ve sayfa algılama mantığı düzgün çalışmıyor.
Hızlı çözüm
Biri görünümünüz ve diğeri kaydırma görünümünüz için olmak üzere iki çıkış oluşturun:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
Daha sonra viewDidLayoutSubviews inizde aşağıdaki kodu ekleyebilirsiniz:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
Yaptığımız şey, görünümün yüksekliğini ve genişliğini toplamak ve bununla eşleşecek scrollViews içerik boyutunu ayarlamak. Bu, kaydırma görünümünüzün yatay olarak kaydırılmasını durduracaktır.
Daha Fazla Düşünce:
CGSizeMake, CGFloats kullanarak bir genişlik ve yükseklik alır. İkinci parametre için UIScrollViews mevcut yüksekliğinizi kullanmanız gerekebilir. Hangisi şöyle görünür:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
Benim durumumda Swift 4.2 ile şunları kullanabilirsiniz:
Dikey kaydırmayı devre dışı bırakın:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
Yatay kaydırmayı devre dışı bırakın:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
Benim durumumda contentView'in genişliği UIScrollView genişliğinden daha büyüktü ve istenmeyen yatay kaydırmanın nedeni buydu. ContentView genişliğini UIScrollView genişliğine eşit ayarlayarak çözdüm.
Umarım birine yardımcı olur
Bu ve diğer konulardaki çeşitli önerileri başarısızlıkla deneyerek bir süre bununla mücadele ettim.
Bununla birlikte, başka bir iş parçacığında (nerede olduğundan emin değil) birisi UIScrollView üzerinde negatif bir kısıt kullanmanın onun için işe yaradığını önerdi.
Bu yüzden tutarsız sonuçlara sahip çeşitli kısıtlama kombinasyonlarını denedim. Sonunda benim için işe yarayan şey, kaydırma görünümüne -32'lik baş ve sondaki kısıtlamaları eklemek ve 320 genişliğinde (ve ortalanmış) bir (görünmez) metin görünümü eklemekti.
İOS 11'de sunulan yeni bir özelliktir UIScrollView
var contentLayoutGuide: UILayoutGuide
Belgeler şunları belirtir:
Bir kaydırma görünümünün içerik alanıyla ilgili Otomatik Yerleşim kısıtlamaları oluşturmak istediğinizde bu düzen kılavuzunu kullanın.
Ekliyor olabileceğiniz diğer Otomatik Düzen kısıtlamalarının yanı sıra widthAnchor
, UIScrollView
'leri contentLayoutGuide
"çerçeve" ile aynı boyutta olacak şekilde sınırlamak isteyeceksiniz . Sen kullanabilirsiniz frameLayoutGuide
veya herhangi bir dış genişliği (iOS 11'de tanıtılan) (örneğin, olarak superView
's.)
misal:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
Belgeler: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
UIScrollView'ı sadece 1 hücreli bir UITableView ile değiştirdikten sonra, iyi çalıştı.
Bu tek satırı kullanın.
self.automaticallyAdjustsScrollViewInsets = NO;