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:
- 您在contentview和scrollview之间设置的限制不会影响contentview的大小。 他们真的是利润。 为了使其工作,contentview应该有一个固定的大小。
- 把尺寸固定的技巧是你可以设置contentview的宽度等于scrollview父级的宽度。 只需在左边的树中select两个视图,并添加相等的宽度约束。
这是这篇文章的要点。 有关完整的说明,包括插图,请查看。
我发现这个AutoLayout的问题…如果我只是让ViewController使用UIView而不是UIScrollView的类…那么就自己添加一个UIScrollView …它的工作原理。