UIScrollView’un yatay kaydırması nasıl devre dışı bırakılır?


92

Bir var UIViewiPhone'un Springboarddan gibi. Bunu bir UIScrollViewve 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?


5
Başlığınızı değiştirmelisiniz: soruda yatay ve başlıkta dikey olmasını istersiniz. İnsanlar sorularınızı daha sonra arama motorlarında bulur, bu nedenle 2 yıl sonra hala önemlidir :)
Julien

@RahulVyas Yukarıdaki adam haklı. Başlığı değiştirmek, buraya bir arama motoru aracılığıyla gelen yeni başlayanlar için herhangi bir karışıklığı azaltacaktır (benim gibi;).
SpacyRicochet

Poster adına başlığı düzenlediniz. (Şu anda düzenleme görünür hale gelmeden önce meslektaş incelemesini bekliyor olsa da.)
Duncan Babbage

Yanıtlar:


125

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 UIScrollViewsonra, her şeyi yatay olarak görüntüleyebildiğinden, yalnızca dikey olarak kaydırılır.


6
Selam. Bu çözüm gerçekten iyi çalışıyor! Bunun için teşekkürler. Statik genişliği 0 olarak ayarlamayı denedim. Benim için de bu işe yarıyor. Daha sonra bazı yan etkiler olabilir mi bilmiyorum. Ancak boyutu bilmiyorsanız (yani iPhone ve iPad için evrensel kod) bu harika çalışıyor!
JackPearse

5
CGSizeMake (0, myScrollableHeight) yapmanın daha iyi olacağını düşünüyorum, bu nedenle tüm alt görünümler gösterilmese bile yatay kaydırma devre dışı.
LightNight

NB Sayfalamayı kullanırken boyutlardan birini 0 olarak ayarlamak, VoiceOver'ın sayfa numarasını doğru değere bakılmaksızın "sayfa 1/1" olarak duyurmasına neden olur
josef

1
Genişliği kodlanmış 320 olarak geçirmek yerine, şu şekilde geçebiliriz: CGSize scrollableSize = CGSizeMake (self.scrollview.frame.size.width, myScrollableHeight); [myScrollView setContentSize: scrollableSize];
Mohit kumar

91

GÜNCELLENDİ: (@EranMarom yorumuna işaret ettikten sonra)

Şunları yapabilirsiniz yatay kaydırma veya dikey kaydırmayı durdurmak içinde ScrollViewDelegateYö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 xve ya scrollview contentOffsetve içinde kaydırmayı durdurmak neden scrollViewDidScroll:yöntem.


1
Olumsuz oy vermeyi düşünüyorum çünkü bu cevap, kendi kodunuzu verdiğinizi açıklamıyor ve hepsi bu. Böyle cevaplar pek iyi değil. İyi cevaplar kendilerini açıklarken, deneyimli geliştiriciler bu yeni geliştiricilerin burada neler olup bittiğini anlamayabileceğini anlayabilir. İyileştirme şansı verdiği için henüz olumsuz oy verilmedi.
Popeye

14
Bu bir tür hack'tir, ancak her şey başarısız olduğunda işe yaradı. Yani +1, ancak yalnızca son çare olarak kullanın.
i_am_jorf

5
Bu delege yöntemini de kullanıyorum, ancak gövdeyi tek satırlık bir malzeme ile değiştiriyorum, örneğin: 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).
Echelon

çünkü "didscroll" dan sonra contentOffset'i değiştiriyorsunuz, eskisi gibi değil ve bu bir çekiç çözümü, ancak ben kendimi olumsuz oy vermedim, çünkü 18 olumlu oy ve yanıt 75, bu yüzden olumsuz oy vermeye değmez
LolaRun

2
Daha da kolay, delege işlevinde scrollView.contentOffset.y = 0.0dikey kaydırmayı durdurmak ve scrollView.contentOffset.x = 0.0yatay kaydırmayı durdurmak için kullanın scrollViewDidScroll(). Bununla birlikte, scrollView.contentSizeeşit olanın scrollView.frame.sizedaha iyi (doğru) bir çözüm olduğuna inanıyorum . @Danbeaulieu cevabına bakın.
emem

11

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];

Bunun bir kaydırma görünümünün kaydırma davranışını devre dışı bırakacağını sanmıyorum. Bu mu??
Dinesh Raja

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.
sig

11

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)

Ya yüksekliği veya genişliği bilmiyorsanız (evrensel cihaz)? @danbeaulieu
Lukesivi

@lukesIvi "myView.frame.width", genişliği "myView" IBOutlet'ten dinamik olarak çekiyor.
Dan Beaulieu

4

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
}

3

Görünümü seçip ardından Attributes Inspectorişaretini kaldırabilirsiniz User Interaction Enabled.


3

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


@Nostradamus yardımcı olmaktan mutluluk duyar
Gulfam Khan

0

ViewDidLoad'da (aşağıdaki gibi) tableview contentInset ayarını yatay kaydırmaya neden olan

self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);

Farklı nedenlerle herhangi bir tableview contentInset setinin olup olmadığını kontrol edin ve devre dışı bırakın


0

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.


0

Bunu dene:

CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];

0

contentOffsetAlt sınıftaki özelliği geçersiz kılarak yatay kaydırmayı devre dışı bırakın .

override var contentOffset: CGPoint {
  get {
    return super.contentOffset
  }
  set {
    super.contentOffset = CGPoint(x: 0, y: newValue.y)
  }
}

0

İ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 frameLayoutGuideveya 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



-1

Bu tek satırı kullanın.

self.automaticallyAdjustsScrollViewInsets = NO;

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.