我有UIScrollView
,其中包含许多UIImageView
,UILabels等...标签比UIScrollView
长得多,但是当我运行应用时,我无法点击并向下滚动...
为什么会这样?
由于
答案 0 :(得分:159)
显示完整的工作代码段总是好的:
// 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
Swift 4.0
let myScrollView
let 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
我还没有找到在IB 中设置contentSize的方法(从Xcode 5.0开始)。
注意:
如果您使用的是Autolayout,那么放置此代码的最佳位置是-(void)viewDidLayoutSubviews
方法。
答案 1 :(得分:119)
如果您在正确设置 contentSize 后仍无法滚动视图, 确保在Interface Builder中取消选中“使用AutoLayout” - >文件检查员。
答案 2 :(得分:66)
您需要设置滚动视图的contentSize
属性才能正确滚动。
如果您正在使用自动布局,则需要在contentSize
中设置viewDidLayoutSubviews
,以便在自动布局完成后应用-(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
);
}
。
代码可能如下所示:
{{1}}
答案 3 :(得分:45)
上面的答案是正确的 - 要使滚动发生,有必要设置内容大小。
如果您正在使用界面构建器,那么使用用户定义的运行时属性可以采用一种简洁的方法。例如:
答案 4 :(得分:38)
尝试将内容大小调整为大数。我无法理解为什么我的滚动视图即使其内容大小似乎大于控件大小也不会滚动。我发现如果内容大小小于需要,它也不起作用。
self.scrollView.contentSize = CGSizeMake(2000, 2000);
而不是2000,你可以把自己的大数字。如果它有效,则意味着当您调整大小时,您的内容大小不够大。
滚动视图无需委托。
答案 5 :(得分:13)
确保将滚动视图的contentSize属性设置为正确的大小(即,足以包含所有内容的大小。)
答案 6 :(得分:7)
取消选中'使用Autolayout'为我做了诀窍。
环境: xCode 5.0.2 故事板 ios7
答案 7 :(得分:4)
在我的情况下,我必须将delaysContentTouches
设置为true,因为scrollView中的对象都捕获触摸事件并自行处理,而不是让scrollView本身处理它。
答案 8 :(得分:4)
在contentSize
方法中设置UIScrollview
的{{1}}属性。像这样的东西
ViewDidLayoutSubviews
答案 9 :(得分:3)
为什么滚动视图不滚动的想法是因为您将滚动的内容大小设置为小于滚动视图的大小,这是错误的。 您应该将内容大小设置为大于滚动视图的大小,以便在滚动时浏览它。
与缩放相同的想法,您可以设置缩放的最小值和最大值,这将通过缩放操作应用。
欢迎:)
答案 10 :(得分:3)
一个小小的补充,以上都是滚动视图可能无法滚动的实际原因,但有时候这可能是盲目地通过代码而不是IB添加scrollview的原因,您可能已将子视图添加到父视图而不是滚动视图这导致子视图不滚动
并确保设置内容大小并且大于父视图框架(duhh !!)
答案 11 :(得分:3)
如果您收到viewDidLayoutSubviews
不存在的消息(IOS8 / swift),请改用以下内容
override func viewDidAppear(animated: Bool)
这为我修好了
答案 12 :(得分:2)
以前没有提到的东西!
确保您的插座已正确连接到scrollView!它应该有一个填充圆圈,但即使你填充了圆圈,scrollView也可能没有连接 - 所以仔细检查!将鼠标悬停在圆圈上,查看实际的滚动视图是否突出显示! (这是我的情况)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
答案 13 :(得分:2)
如果您已经按照教程进行了很多时间代码是正确的,但许多初学者不知道的是,scrollView NOT 将正常滚动模拟器。只有当您按下鼠标垫并同时滚动时才会滚动。许多经验丰富的 XCode / Swift / Obj-C用户非常习惯这样做,所以他们不知道初学者可能会忽视它。 Ciao: - )
@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)
}
只要您执行我上面所说的
,此代码就可以正常运行答案 14 :(得分:1)
直接的编程方式
总结一下
创建一个 UIScrollView
private lazy var scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
return scrollView
}()
使用单个子视图来保存所有内容子视图
private lazy var contentView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
添加您的观点
contentView.addSubview(firstSubView)
contentView.addSubview(lastSubView)
scrollView.addSubview(contentView)
view.addSubview(scrollView)
通常,您只希望您的内容朝一个方向滚动。在大多数情况下垂直滚动。因此将内容视图的宽度设置为滚动视图的宽度。
NSLayoutConstraint.activate([
contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor)
将四个约束(顶部、底部、左侧、右侧)从我们的单个内容视图附加到滚动视图。
contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
contentView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
确保在内容视图的所有四个方面都附加了约束,以便它可以扩展到您的内容的大小。
// After Adding your subviews to the contentView make sure you've those two constraints set:
firstSubView.topAnchor.constraint(equalTo: contentView.topAnchor),
.
.
.
lastSubView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
])
答案 15 :(得分:1)
我的问题已通过以下方式解决:
一旦我删除了绑定到安全区域和/或超级视图的顶部和/或底部约束,scrollView内部的视图可能会再次滚动,而不会固定在屏幕底部的顶部!
希望这可以使其他人摆脱这个特定问题的痛苦。
答案 16 :(得分:1)
添加UIScrollViewDelegate
并将以下代码添加到为我修复的viewDidAppear
方法中。
@interface testScrollViewController () <UIScrollViewDelegate>
-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}
答案 17 :(得分:1)
在viewDidLayoutSubviews
中添加以下代码,为Autolayout工作。在尝试了所有答案之后:
- (void)viewDidLayoutSubviews
{
self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
}
//set the height of content size as required
答案 18 :(得分:1)
如果您的scrollView
是某种类型的containerView
的子视图,请确保您的scrollView
位于containerView
的框架或范围内。我有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,但不会收到用户互动。
答案 19 :(得分:1)
如果其他解决方案都不适合您,请仔细检查您的滚动视图实际上是Interface Builder中的UIScrollView
。
在过去几天的某个时刻,我的UIScrollView
自发地将类型更改为UIView
,即使其类在检查器中显示UIScrollView
。我正在使用Xcode 5.1 (5B130a)
。
您可以创建新的滚动视图并从旧视图中复制测量,设置和约束,也可以手动将视图更改为UIScrollView
文件中的xib
。我进行了比较,发现了以下差异:
<强>原始强>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>
类型自发改变后:
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>
所以我将<view>
行替换为原来的<scrollView>
行。
我还将视图的结束标记</view>
替换为</scrollView>
。
请务必保持ID与当前视图相同,在这种情况下:id =“qRn-TP-cXd”。
我还必须通过删除应用程序的派生数据来清除Xcode缓存中的xib:
Xcode->Window->Organizer->Projects
,选择您的项目,在派生数据行上,点击删除... 或者如果使用设备:
Xcode->Window->Organizer->Device
,选择您的设备 - &gt;应用程序,选择您的应用,点击( - )现在清理项目,并从模拟器/设备中删除应用程序:
Xcode->Product->Clean
Simulator/device->press
并按住app->click
(X)将其删除然后,您应该能够构建和运行您的应用并再次具有滚动功能。
P.S。我不必在viewDidLayoutSubviews
中设置滚动视图的内容大小,也不必关闭自动布局,但是YMMV。
答案 20 :(得分:0)
在这个帖子中提供的答案失败后,我偶然发现了this article解决方案。
使用autolayout设置滚动视图有两个不直观的事情:
这是该文章的要点。有关完整说明(包括插图),请查看。
答案 21 :(得分:0)
我发现有这个AutoLayout问题...如果我只是让ViewController
使用UIView
而不是UIScrollView
用于该类...那么只需添加一个{{1}我自己......它有效。
答案 22 :(得分:0)
我第一次尝试就使它起作用。具有自动布局和所有功能,无需其他代码。然后集合视图变成香蕉,在运行时崩溃,我找不到错误所在,因此我删除并重新创建了它(我使用的是Xcode 10 Beta4。感觉就像个错误),然后滚动就消失了。不过,“收藏夹”视图再次起作用!
许多小时后..这就是为我修复的原因。我的布局如下:
UIView
一切都在约束中。安全区域由系统自动定义。在最坏的情况下,请删除滚动和内容视图的所有约束,并且不让IB为您重置/创建它们。手动进行设置即可。
基本上,此概念是使内容视图适合Scrollview,而后者适合安全区域。
但是这样就行不通了。内容视图错过了高度。我尽了最大的努力,唯一的办法就是内容视图高度创建到控件拖动的内容视图本身。。定义了一个固定的高度,该值是从视图控制器的大小(定义为自由格式,比实际显示的长度更长,到包含我的所有子视图)中计算出来的,最后它又可以正常工作了!
答案 23 :(得分:0)
我在IB遇到同样的问题。
将scrollView的前导,尾随,顶部和底部设置为其超级视图之后。我进行了以下更改以使containerView可滚动,从而起作用。
要使scrollView仅在水平方向上滚动,请使用scrollView的centerY = ContainerView的centerY进行约束
并使它可以垂直滚动,使scrollView的centerX = ContainerView的centerX
答案 24 :(得分:0)
另一个有趣的案例:
scrollview.superview.userInteractionEnabled必须为真
我浪费了2个多小时来追逐,只是为了找出父母 是UIImageView,它自然具有userInteractionEnabled == false
答案 25 :(得分:0)
您不必设置滚动视图的内容大小。
答案 26 :(得分:0)
如果有人和我一样犯了同样的错误,我想分享我的案例。
在我的例子中,我错误地向 scrollview 的一个子视图添加了一个约束,这使得子视图与 topLayoutGuide 的空间固定,因此它的位置无法更改,因此无法滚动滚动视图。