UIScrollView不会滚动,即使设置了内容大小。

4

我的UIScrollView是一个大约4500像素的横向视图,用户需要水平滚动以查看内容。

我已经按以下方式设置:

- (void)viewDidLoad
{

    [super viewDidLoad];

    sview.frame = CGRectMake(0, 0, 568, 320);
    sview.contentSize = CGSizeMake(4500, 320);
    [sview setScrollEnabled:YES];
}      

然而滚动视图并没有起到作用。我错过了什么明显的东西吗?我已经尝试了网上的每一个教程。


还是没有滚动。你也有这个问题。 - nworksdev
你在哪里添加子视图(代表要滚动的内容)? - FluffulousChimp
你是通过编程方式添加滚动视图还是? - Manu
设置委托方法,除非您正在使用xibs,否则UIScrollView委托应该已链接到文件所有者... - jsetting32
它将水平滚动。 - Vineesh TP
5个回答

5

我遇到了类似的问题。我做了以下修改,scrollView开始滚动了:

  1. 在xib中选中“Bounce Horizontally”属性以检查UIScrollView。
  2. 将下面的代码从viewDidLoad移动到viewDidAppear中:
-(void) viewDidAppear:(BOOL)animated
{

    [super viewDidAppear:animated];
    sview.frame = CGRectMake(0, 0, 568, 320);
    sview.contentSize = CGSizeMake(4500, 320);
    [sview setScrollEnabled:YES];

}
我想这应该能帮到你。

4

我在这里解释过了,但是有很多答案建议关闭自动布局。那可以解决问题,但并不是正确的解决方法。下面是我的答案:


关闭自动布局可以解决问题,但那不是解决方案。如果你真正需要自动布局,请使用它,如果不需要,请关闭它。但这并不是该问题的正确修复方法。

UIScrollView与自动布局中的其他视图工作方式不同。以下是苹果关于自动布局的发布说明,我复制了其中有趣的部分:

以下是关于UIScrollView支持自动布局的一些注释:

  • 一般来说,自动布局认为视图的顶部、左侧、底部和右侧边缘是可见的边缘。也就是说,如果你将一个视图固定在其父视图的左边缘上,实际上你是将它固定在父视图边界的最小x值上。更改父视图的边界原点不会改变视图的位置。
  • UIScrollView类通过更改其边界的原点来滚动其内容。为了使其与自动布局配合使用,滚动视图内的顶部、左侧、底部和右侧边缘现在表示其内容视图的边缘。
  • 滚动视图的子视图上的约束必须产生填充大小,然后将其解释为滚动视图的内容大小。(这不应与用于自动布局的intrinsicContentSize方法混淆。)要使用自动布局调整滚动视图的框架大小,约束必须明确说明滚动视图的宽度和高度,或者滚动视图的边缘必须与其子树之外的视图绑定。
  • 请注意,您可以通过在视图和滚动视图子树之外的视图(例如滚动视图的父视图)之间创建约束,使滚动视图的子视图看起来浮动(不滚动)在其他滚动内容上。

然后苹果继续展示了如何正确使用UIScrollView与自动布局的示例。

作为一般规则,最简单的修复方法之一是在UIScrollView底部元素之间创建一个约束。因此,在你想要放在UIScrollView底部的元素中,创建这个底部空间约束:

enter image description here

再次强调,如果不想使用自动布局,请关闭它。然后您可以以通常的方式设置contentSize。但是您应该明白这是自动布局的预期行为。


1
首先,您必须将一些内容添加到UIScrollSiew作为滚动的子视图,如果UIScrollView上没有内容,那么您如何滚动呢?这是我所做的,只需将UIImageView添加到UIScrollView作为与UIScrollView大小相同的子视图即可...
在viewDidLoad方法中尝试以下代码...
-(void)viewDidLoad
{
     UIScrollView *scroll=[[UIScrollView alloc] init];
     scroll.frame=CGRectMake(0, 0, 320, 460);
     UIImageView *imageView=[[UIImageView alloc] init];
     imageView.frame=CGRectMake(0, 0, 320,460);
     imageView.image=[UIImage imageNamed:@"chiranjeevi.jpeg"];
     scroll.contentSize = CGSizeMake(4500, 460);
     [scroll setScrollEnabled:YES];
     [scroll addSubview:imageView];
     [self.view addSubview:scroll];

}

我测试了这段代码,它运行良好。希望这段代码对你有所帮助。

也许尝试一种解决方案,通过xib将UIScrollView添加到UIViewcontroller的UIView中?这才是真正的问题。 - jsetting32

0

我假设您正在将UISrollingView添加到Xib文件中。这对您有用。

sview.delegate = self;
sview.backgroundColor=[UIColor clearColor];
[sview setCanCancelContentTouches:NO];
sview.indicatorStyle = UIScrollViewIndicatorStyleWhite;
sview.clipsToBounds = YES;
sview.scrollEnabled = YES;
sview.contentSize = CGSizeMake(320,570);
CGPoint topOffset = CGPointMake(0,0);
[sview setContentOffset:topOffset animated:YES];

此外,请确保在您的Xib文件中提供IBOutlet连接。

很抱歉,它没有帮助到我。即使将内容大小设置为3000,我仍然无法滚动查看整个内容。 - jsetting32

-1

我也遇到了同样的问题。我在xib中添加了滚动视图,并向该滚动视图添加了一些子视图。在添加子视图后,滚动视图将停止滚动。解决此问题的方法是在文件检查器中的视图xib中使用自动布局选项被勾选。我取消了勾选,然后添加子视图后滚动视图可以正常滚动。

解决方案是在xib文件检查器中取消勾选使用自动布局选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接