如何禁用UIScrollView的水平滚动?

时间:2009-06-30 09:29:37

标签: ios objective-c uiscrollview

我有像iPhone的Springboard一样的UIView。我使用UIScrollViewUIButtons创建了它。我想禁用所述scrollview上的水平滚动。我只想垂直滚动。我该如何做到这一点?

15 个答案:

答案 0 :(得分:119)

您必须设置contentSize的{​​{1}}属性。例如,如果您的UIScrollView宽度为320像素(屏幕宽度),那么您可以这样做:

UIScrollView

CGSize scrollableSize = CGSizeMake(320, myScrollableHeight); [myScrollView setContentSize:scrollableSize]; 只会垂直滚动,因为它已经可以水平显示所有内容。

答案 1 :(得分:84)

更新:(在@EranMarom指出他的评论后)

您可以在ScrollViewDelegate方法中停止水平滚动或垂直滚动​​。 这是怎么回事,

停止水平滚动:

如果要水平滚动,则需要增加contentOffset.x。防止停止滚动视图在水平方向滚动。

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.x = 0.0
}

停止垂直滚动:

如果要垂直滚动,则需要增加contentOffset.y。防止停止滚动视图在垂直方向滚动。

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.y = 0.0
}

以上代码会阻止x的{​​{1}}和y中的更改,并导致停止scrollview contentOffset方法中的滚动。

答案 2 :(得分:10)

因为iOS7使用

self.automaticallyAdjustsScrollViewInsets = NO;

//并创建包含3页

的页面滚动条
    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];

答案 3 :(得分:10)

  

快速解决方案

创建两个出口,一个用于您的视图,另一个用于滚动视图:

@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!

然后在viewDidLayoutSubviews中添加以下代码:

let scrollSize = CGSize(width: myView.frame.size.width, 
                        height: myView.frame.size.height)
scrollView.contentSize = scrollSize

我们已经完成的工作是收集视图的高度和宽度,并设置scrollViews内容大小以匹配它。这将阻止您的滚动视图水平滚动。

更多想法:

CGSizeMake需要宽度和宽度使用CGFloats的高度。您可能需要使用UIScrollViews现有高度作为第二个参数。看起来像这样:

let scrollSize = CGSize(width: myView.frame.size.width, 
                        height: scrollView.contentSize.height)

答案 4 :(得分:4)

您可以选择视图,然后在Attributes Inspector下取消选中User Interaction Enabled

答案 5 :(得分:0)

一旦我用UITableView替换UIScrollView只有1个单元格,它运行正常。

答案 6 :(得分:0)

我在这方面努力了一段时间,试图在这个和其他线程中不成功地提出各种建议。

然而,在另一个线程(不确定在哪里),有人建议在UIScrollView上使用负面约束为他工作。

所以我尝试了各种约束组合和不一致的结果。最终对我有用的是向滚动视图添加-32的前导和尾随约束,并添加宽度为320(并居中)的(不可见)文本视图。

答案 7 :(得分:0)

我在viewDidLoad中设置了tableview contentInset(如下所示)导致水平滚动的原因

require_once 'vendor/autoload.php';
require_once 'myproject_class.php';
require 'forum/init.php';

//forum initialize
\IPS\Session\Front::i();
$ips_member = \IPS\Member::loggedIn();

//load class
try {
    $myproj = new MySpace\MyProject();
    $myproj->ips_member = $ips_member;
} catch (Exception $e) {
    die($e->getMessage()); //not die, but handle in some way
}

//check get or post var to decide what to do
if ($_GET["dowhat"] == "display"){
    try {
        $myproj->displaySomeData($_GET["id"]);
    } catch (Exception $e) {
        die($e->getMessage()); //not die, but handle in some way
    }
}

//twig rendering
$loader = new Twig_Loader_Filesystem('template');
$twig = new Twig_Environment($loader);
$template = $twig->load('myproject.html');

echo $template->render(array('projectdata' => $myproj->projectdata, 'member' => $ips_member));

检查是否存在因各种原因设置的tableview contentInset并将其禁用

答案 8 :(得分:0)

试试这个:

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

答案 9 :(得分:0)

使用此单行。

self.automaticallyAdjustsScrollViewInsets = NO;

答案 10 :(得分:0)

在我的情况下,contentView的宽度大于UIScrollView的宽度,这就是不必要的水平滚动的原因。我通过将contentView的宽度设置为UIScrollView的宽度来解决它。

希望它对某人有帮助

答案 11 :(得分:0)

就我而言,通过 Swift 4.2,您可以使用:

禁用垂直滚动:

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

禁用水平滚动:

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

答案 12 :(得分:0)

通过覆盖子类中的contentOffset属性来禁用水平滚动。

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

答案 13 :(得分:0)

iOS 11中引入了UIScrollView上的新属性

var contentLayoutGuide: UILayoutGuide

文档指出您:

当您要创建与滚动视图的内容区域相关的自动布局约束时,请使用此布局指南。

连同您可能要添加的其他任何自动布局约束,您都希望将widthAnchor的{​​{1}}的{​​{1}}约束为与“框架”相同的大小。可以使用UIScrollView(在iOS 11中也引入了)或任何外部宽度(例如contentLayoutGuide的宽度)。

示例:

frameLayoutGuide

文档: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide

答案 14 :(得分:0)

@Gulfam Khan 的答案是正确的,我正在添加图像以帮助该概念获得更多可见性。

当我们将 contentView 设置为与 Scroll view 的宽度相等时,如果乘数甚至略大于 1:1,那么我们将得到水平滚动。

enter image description here

这是它产生的结果:

enter image description here

如果你不想水平滚动,你很可能没有超过超级视图宽度的水平内容。

因此,如果您确保 contentView 宽度不超过滚动视图的宽度,这将自动解决问题,因为 UIKit 识别出没有水平内容可滚动。像这样:

enter image description here

现在您应该只看到垂直:

enter image description here