UIScrollView不滚动

我有一个UIScrollView包含许多UIImageView ,UILabels等…标签是UIScrollView更长,但是当我运行的应用程序,我不能点击并向下滚动…

为什么会这样?

谢谢

显示完整的工作代码片段总是很好的:

 // in viewDidLoad (if using Autolayout check note below): UIScrollView *myScrollView; UIView *contentView; // scrollview won't scroll unless content size explicitly set [myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size 

我还没有find一种方法来设置IB的contentSize (从Xcode 5.0)

注意:如果您使用的是Autolayout,放置此代码的最佳位置是在-(void)viewDidLayoutSubviews方法中。

如果在正确设置contentSize之后仍然无法滚动视图,请确保在Interface Builder – > File Inspector中取消选中 “使用AutoLayout”。

您需要设置滚动视图的contentSize属性才能正确滚动。

如果您使用的是自动布局,则需要在viewDidLayoutSubviews中设置contentSize ,以便在自动布局完成后应用它。

代码可能如下所示:

 -(void)viewDidLayoutSubviews { // The scrollview needs to know the content size for it to work correctly self.scrollView.contentSize = CGSizeMake( self.scrollContent.frame.size.width, self.scrollContent.frame.size.height + 300 ); } 

上面的答案是正确的 – 为了使滚动发生,有必要设置内容大小。

如果您使用的是界面构build器,则可以使用用户定义的运行时属性。 例如:

在这里输入图像说明

尝试将内容大小调整为巨大的数字。 我不明白为什么我的滚动视图不滚动,即使其内容大小似乎大于控制大小。 我发现如果内容大小比需要的小,它也不起作用。

 self.scrollView.contentSize = CGSizeMake(2000, 2000); 

而不是2000年,你可以把你自己的大数字。 如果它能正常工作,则意味着在resize时,您的内容大小不够大。

滚动视图不需要委托。

确保将scroll view的contentSize属性设置为正确的大小(即,包含所有内容的大小)。

取消勾选“使用Autolayout”为我做了诡计。

环境:xCode 5.0.2故事板ios7

在我的情况下,我不得不将delaysContentTouches设置为true,因为scrollView中的对象都捕获触摸事件和处理自己,而不是让scrollView自己处理它。

为什么滚动视图不滚动,因为你设置滚动的内容大小小于滚动视图的大小,这是错误的。 您应该将内容大小设置为大于滚动视图的大小,以便在滚动时浏览它。

与缩放相同的想法,您设置缩放的最小值和最大值,这将通过缩放操作应用。

欢迎:)

一个小的补充,以上所有是为什么你的滚动视图可能不滚动,但有时无意识这可能是特别是当通过代码而不是IB添加滚动视图的原因,你可能已经添加你的子视图到父视图,而不是滚动视图这会导致子视图不滚动

并保持内容大小设置和大于父视图框架(duhh !!)

如果您收到一条消息(IOS8 / swift)viewDidLayoutSubviews不存在,请使用下面的代码

 override func viewDidAppear(animated: Bool) 

这为我修好了

viewDidLayoutSubviews方法中设置ScrollView的contentSize属性。 像这样的东西

  override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height) } 

以前没有提到的东西!

确保你的sockets正确连接到scrollView! 它应该有一个实心圆,但即使你已经填满了圆,scrollView可能没有连接 – 所以仔细检查! 将鼠标hover在圆圈上,查看实际的滚动视图是否突出显示! (这是我的情况)

 //Connect below well to the scrollView in the storyBoard @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; 

很多初学者不知道的是,scrollView 不会正常地通过模拟器滚动。 只有当您按下鼠标垫同时滚动时,才会滚动。 许多经验丰富的 XCode / Swift / Obj-C用户很喜欢这样做,所以他们不知道如何可能被初学者忽视。 再见 :-)

 @IBOutlet weak var scrollView: UIScrollView! override func viewDidLoad() { super.viewDidLoad() view.addSubview(scrollView) // Do any additional setup after the view } override func viewWillLayoutSubviews(){ super.viewWillLayoutSubviews() scrollView.contentSize = CGSize(width: 375, height: 800) } 

只要你按照上面所说的去做,这段代码就可以很好的工作

如果没有其他解决scheme适用于您,请仔细检查您的滚动视图实际上是否为Interface Builder中的UIScrollView

在过去几天的某个时候,我的UIScrollView 自发地将types更改UIView ,尽pipe它的类在检查器中表示了UIScrollView 。 我正在使用Xcode 5.1 (5B130a)

您可以创build一个新的滚动视图并从旧视图复制测量,设置和约束,也可以手动将视图更改为xib文件中的UIScrollView 。 我做了一个比较,发现有以下不同之处:

原版的:

 <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH"> ... </scrollView> 

types自发改变后:

 <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd"> ... </view> 

所以我用原始的<scrollView>行replace了<view> <scrollView>行。

我也用</scrollView>replace了视图的close标签</view> </scrollView>

一定要保持id与当前视图相同,在这种情况下:id =“qRn-TP-cXd”。

我也必须通过删除应用程序的派生数据来从Xcode的caching中清除xib:

  • Xcode->Window->Organizer->Projects ,select你的项目,在Derived Data上,点击Delete …

或者,如果使用设备:

  • Xcode->Window->Organizer->Device ,select你的设备 – >应用程序,select你的应用程序,点击( – )

现在清理项目,并从模拟器/设备中删除应用程序:

  • Xcode->Product->Clean
  • iOS Simulator/device->press按住应用程序 – app->click (X)将其删除

然后,您应该能够构build并运行您的应用程序,并再次滚动function。

PS我不必在viewDidLayoutSubviews设置滚动视图的内容大小,或closures自动布局,但YMMV。

如果您的scrollView是某个types的containerView的子视图,请确保您的scrollView位于scrollView的框架或界限内。 我有containerView.clipsToBounds = NO仍然允许我看到scrollView,但由于scrollView不在containerView范围内,它不会检测触摸事件。

例如:

 containerView.frame = CGRectMake(0, 0, 200, 200); scrollView.frame = CGRectMake(0, 200, 200, 200); [containerView addSubview:scrollView]; scrollView.userInteractionEnabled = YES; 

您将能够看到scrollView,但不会收到用户交互。

添加UIScrollViewDelegate并将下面的代码添加到viewDidAppear方法为我修复它。

 @interface testScrollViewController () <UIScrollViewDelegate> -(void)viewDidAppear:(BOOL)animated { self.scrollView.delegate = self; self.scrollView.scrollEnabled = YES; self.scrollView.contentSize = CGSizeMake(375, 800); } 

viewDidLayoutSubviews添加下面的代码与Autolayout一起工作。 尝试所有答案后:

 - (void)viewDidLayoutSubviews { self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620); } //set the height of content size as required 

在这个线程提供的答案失败之后,我偶然发现了这个解决scheme。

有两件事情不直观,用autolayout设置scrollview:

  1. 您在contentview和scrollview之间设置的限制不会影响contentview的大小。 他们真的是利润。 为了使其工作,contentview应该有一个固定的大小。
  2. 把尺寸固定的技巧是你可以设置contentview的宽度等于scrollview父级的宽度。 只需在左边的树中select两个视图,并添加相等的宽度约束。

这是这篇文章的要点。 有关完整的说明,包括插图,请查看。

我发现这个AutoLayout的问题…如果我只是让ViewController使用UIView而不是UIScrollView的类…那么就自己添加一个UIScrollView …它的工作原理。