簡體   English   中英

在 UIScrollView 中禁用垂直滾動

[英]Disabling vertical scrolling in UIScrollView

IB 中有一個選項可以取消選中滾動視圖上的垂直滾動,但它似乎不起作用。

如何在代碼中將滾動視圖設置為僅水平滾動,而不是垂直滾動而不是 IB?

從 iOS7 開始:

第一:內容大小寬度必須等於滾動視圖的寬度

第二:在你的 initWithNibName 中:

self.automaticallyAdjustsScrollViewInsets = NO;

就是這樣。

嘗試將 contentSize 的高度設置為 scrollView 的高度。 然后應該禁用垂直滾動,因為垂直滾動沒有任何內容。

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

是的,pt2ph8的答案是對的,

但是如果由於某種奇怪的原因你的 contentSize 應該高於 UIScrollView,你可以禁用實現 UIScrollView 協議方法的垂直滾動

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

只需在您的 UIViewController 中添加它

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

它只是用戶滾動 UIScrollView 時調用的方法,這樣做會強制它的內容始終具有相同的 .y

包括以下方法

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

並將滾動視圖的內容大小寬度設置為等於滾動視圖的寬度。

您需要在內容大小中傳遞 0 以禁用您想要的方向。

禁用垂直滾動

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

禁用水平滾動

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

我更新了內容大小以禁用垂直滾動,並且滾動的能力仍然存在。 然后我發現我也需要禁用垂直反彈,以完全禁用滾動。

也許也有人有這個問題。

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

}

您必須已向UIScrollViewDelegate確認

aScrollView.delegate = self;

只需將 y 設置為始終在頂部。 需要符合 UIScrollViewDelegate

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

這將保持滾動的減速/加速效果。

在 iOS 11 上,如果您有興趣創建一個粘在屏幕邊界而不是安全區域的滾動視圖,請記住添加以下內容。:

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

iOS11可以使用以下屬性

let frameLayoutGuide: UILayoutGuide

如果您為frameLayoutGuide.topAnchorframeLayoutGuide.bottomAnchor約束你的滾動視圖的一些子視圖的相同錨,然后垂直滾動將被禁用,滾動視圖的高度將等於其子視圖的高度。

最明顯的解決方案是禁止子類中的 y 坐標更改。

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

在以下情況下,這是唯一合適的解決方案:

  1. 您不被允許或只是不想使用委托。
  2. 您的內容高度大於容器高度

很多答案包括將contentOffset設置為 0。我有一個案例,我希望 scrollView 內的視圖居中。 這為我完成了工作:

public func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = -scrollView.contentInset.top
}

我想你可以

  1. 將 directionalLockEnabled 設置為 true
  2. 設置 contentView 的寬度等於 superView 的寬度。

那應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM