UIScrollView不滚动

时间:2010-05-13 04:36:16

标签: ios iphone ipad uiscrollview

我有UIScrollView,其中包含许多UIImageView,UILabels等...标签比UIScrollView长得多,但是当我运行应用时,我无法点击并向下滚动...

为什么会这样?

由于

27 个答案:

答案 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)

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

如果您正在使用界面构建器,那么使用用户定义的运行时属性可以采用一种简洁的方法。例如:

enter image description here

答案 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),
])

参考:Using UIScrollView with Auto Layout in iOS

答案 15 :(得分:1)

我的问题已通过以下方式解决:

  1. 将scrollView上的contentSize设置为较大的高度
  2. 但是我还必须修复scrollView中视图的顶部和/或底部约束,这意味着屏幕上显示了滚动指示器,但内容没有滚动

一旦我删除了绑定到安全区域和/或超级视图的顶部和/或底部约束,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
  • iOS Simulator/device->press并按住app->click(X)将其删除

然后,您应该能够构建和运行您的应用并再次具有滚动功能。

P.S。我不必在viewDidLayoutSubviews中设置滚动视图的内容大小,也不必关闭自动布局,但是YMMV。

答案 20 :(得分:0)

在这个帖子中提供的答案失败后,我偶然发现了this article解决方案。

使用autolayout设置滚动视图有两个不直观的事情:

  1. 您在contentview和scrollview之间设置为边距的约束不会影响contentview的大小。他们真的是利润。为了使其工作,contentview应该有一个固定的大小。
  2. 固定大小的技巧是您可以将contentview的宽度设置为等于scrollview的父级的宽度。只需选择左侧树中的两个视图,然后添加相等的宽度约束。
  3. 这是该文章的要点。有关完整说明(包括插图),请查看。

答案 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)

<块引用>

您不必设置滚动视图的内容大小。

Technical Note TN2154

答案 26 :(得分:0)

如果有人和我一样犯了同样的错误,我想分享我的案例。

在我的例子中,我错误地向 scrollview 的一个子视图添加了一个约束,这使得子视图与 topLayoutGuide 的空间固定,因此它的位置无法更改,因此无法滚动滚动视图。