UIScrollView'da dikey kaydırmayı devre dışı bırakma


Yanıtlar:


121

ContentSize'ın yüksekliğini scrollView yüksekliğine ayarlamayı deneyin. Daha sonra dikey kaydırma devre dışı bırakılmalıdır çünkü dikey olarak kaydırılacak hiçbir şey olmayacaktır.

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);

Bu tuhaf sorunu çözmek için bana çok zaman kazandırdın. Teşekkürler!
2013

2
@fabb çerçevenin ne zaman değiştiğini nasıl anlar?
Sam

138

iOS7'den beri:

ilk: içerik boyutu genişliği, kaydırma görünümünüzün genişliğine eşit olmalıdır

saniye: initWithNibName'inizde:

self.automaticallyAdjustsScrollViewInsets = NO;

Bu kadar.


Harika çözüm. Bir cazibe gibi çalıştı. ViewController'imdeki geri kalan görünümlerin boyutunu etkileyecek mi? (Düğmeler, Etiketler ..) Demek istediğim, "self" benim durumumda bir UIViewController'dir
voghDev

@voghDev hayır, kaydırma görünümünüzdeki alt görünümlere etkisi yoktur.
Mirko Brunner

Amazing bunu, sorunları olan görünüm denetleyicilerimdeki viewdidload yöntemine ekledi.
StackRunner

navigationController kullanıyorsanız ve kaydırma görünümünüz, viewDidLoad yöntemi altındaki benimki gibi navigationBar'ın başlığının arkasındaysa. Çözer.
EFE

1
Aynı şeyi film şeridi ayarlarında herhangi bir kod satırı olmadan doğrudan elde edebilirsiniz. Kaydırma görünümü denetleyicisini seçin ve öznitelik denetçisindeki "Kaydırma Görünümü Eklemelerini Ayarla" seçeneğinin işaretini kaldırın.
Morpheus78

49

evet, pt2ph8'in cevabı doğru,

ancak garip bir nedenden dolayı contentSize'nizin UIScrollView'den daha yüksek olması gerekiyorsa, UIScrollView protokol yöntemini uygulayarak dikey kaydırmayı devre dışı bırakabilirsiniz.

 -(void)scrollViewDidScroll:(UIScrollView *)aScrollView;

sadece bunu UIViewController'ınıza ekleyin

float oldY; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
    // or if you are sure you wanna it always on top:
    // [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}

bu sadece kullanıcı UIScrollView'unuzu kaydırdığında çağrılan yöntemdir ve bunu yaparak içeriğini her zaman aynı olmaya zorlarsınız.


6
Tanrı! Lütfen oldY değişkenini float oldY;yukarıdaki koda bakın gibi .m dosyasında BİLDİRMEYİN . Bu, uygulama başına C-tarzı bir değişken sembolüdür, değişken, denetleyici sınıfının bir örnek üyesi olarak bildirilmelidir ZORUNLU.
Itachi

21

Aşağıdaki yöntemi dahil edin

-(void)viewDidLayoutSubviews{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

ve kaydırma görünümünün içerik boyutu genişliğini kaydırma görünümünün genişliğine eşit olacak şekilde ayarlayın.


1
Bu aynı zamanda Öykü
Panosu'nda

1
Bunu sevmiyorum çünkü tüm kaydırma görünümleri için ayarlıyor ... Yeni bir ScrollView sınıfı oluşturmadan diyagram üzerinde tek bir kaydırma görünümüne özel olabilmeyi
dilerdim

20

İstediğiniz yönde devre dışı bırakmak için içerik boyutunda 0'ı geçmeniz gerekir.

Dikey kaydırmayı devre dışı bırakmak için

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);

Yatay kaydırmayı devre dışı bırakmak için

scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);

1
Bu, görünümün contentSize değerini ayarladığınız eksende 0 olacak şekilde ayarlayacaktır. ContentSize, içeriğin boyutuna atıfta bulunduğundan, bu çerçevenin ötesinde dikey kaydırmayı devre dışı bırakmak için ekranın yüksekliğini geçmek istiyoruz. doğru olarak işaretlenmiş çözüm doğrudur.
system

Bu benim için iyi çalıştı. yüksekliği contentSize olarak ayarlamak hala dikey kaydırma yapmamı sağlıyor.
KoreanXcodeWorker

1
Bu benim için işe yaramadı. Self.automaticallyAdjustsScrollViewInsets
StackRunner

Budur! Kaydırma Görünümü'nün yüksekliğini ayarlamak benim için işe yaramadı, ancak bu işe yaradı
Echizzle

18

Dikey kaydırmayı devre dışı bırakmak için içerik boyutunu güncelledim ve kaydırma özelliği devam etti. Sonra kaydırmayı tamamen devre dışı bırakmak için dikey sıçramayı da devre dışı bırakmam gerektiğini anladım.

Belki bu sorunu olan insanlar da vardır.


Beni kurtardın. İçeriğim ve çerçevem ​​aynıydı ve hayatım boyunca neyin yanlış olduğunu anlayamadım. Çok teşekkürler!!
yuf

2
Cevabınız, stackoverflow'u neden sevdiğimdir! :-) Kutsal duman ... bu beni çılgına çevirdi! Haklısın. Sıçrama etkisi. Sıçrama efektini istiyorum, ancak kaydırmaya gerek olmadığında değil, bu nedenle, kaydırmaya gerek olup olmadığına bağlı olarak bu efekti şimdi kodda devre dışı bırakmak / yeniden etkinleştirmek isteyeceğim.
Erik van der Neut

2
Tamam, çalışma zamanında bir UIScrollView'da geri dönenleri etkinleştirmek / devre dışı bırakmak çok kolay. Benim durumumda sadece kaydırma içeriğinin yüksekliğini önemsiyorum ve bu hile yaptı: self.scrollView.bounces = (BOOL) (self.scrollView.contentSize.height> self.scrollView.frame.size.height);
Erik van der Neut

12
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];

}

onaylamış olmalısın UIScrollViewDelegate

aScrollView.delegate = self;

4

Sadece y'yi her zaman en üstte olacak şekilde ayarlayın. UIScrollViewDelegate ile uyumlu olması gerekir

func scrollViewDidScroll(scrollView: UIScrollView) {
        scrollView.contentOffset.y = 0.0
}

Bu, kaydırmanın Yavaşlama / Hızlanma etkisini koruyacaktır.


4

İOS 11'de, güvenli bir alan yerine ekran sınırlarına yapışan bir kaydırma görünümü oluşturmakla ilgileniyorsanız, lütfen aşağıdakileri eklemeyi unutmayın:

if (@available(iOS 11.0, *)) {
    [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

1
hepsinden sonra. binlerce kez teşekkür ederim efendim! günümü kurtardın
ha100

1

Gönderen iOS11 biri şu özelliğini kullanabilirsiniz

let frameLayoutGuide: UILayoutGuide

FrameLayoutGuide.topAnchor ve frameLayoutGuide.bottomAnchor için, scrollView'unuzun bazı alt görünümlerinin aynı bağlantılarına kısıtlamalar ayarlarsanız , dikey kaydırma devre dışı bırakılır ve scrollView'in yüksekliği, alt görünümünün yüksekliğine eşit olur.


1

En bariz çözüm, alt sınıfınızda y koordinatı değişikliklerini yasaklamaktır.

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

Aşağıdaki durumlarda tek uygun çözüm budur:

  1. İzin verilmiyor veya sadece temsilci kullanmak istemiyorsunuz.
  2. İçerik yüksekliğiniz konteyner yüksekliğinden daha büyük

1
Bu en iyi cevap! Çözüm olarak seçilmelidir! Teşekkür ederim dostum günümü kurtardın!
imike

Çıkış: @imike sevdiğim çözeltisi (swizzling kullanmaktır github.com/iwheelbuy/UIPanGestureRecognizerDirection repo
iWheelBuy

0

Bir çok cevap, contentOffset0 olarak ayarlamayı içerir . ScrollView içindeki görünümün ortalanmasını istediğim bir durum vardı. Bu benim için işi yaptı:

public func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = -scrollView.contentInset.top
}
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.