iphone UIScrollView不滚动




ipad (16)

如果您的scrollView是某种类型的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,但不会收到用户交互。

我有一个包含许多UIImageView ,UILabels等的UIScrollView ...标签比UIScrollView长得多,但是当我运行该应用程序时,我无法单击并向下滚动...

为什么会这样呢?

谢谢


Answer #1

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


Answer #2

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

// 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方法中。


Answer #3

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

- (void)viewDidLayoutSubviews
{
    self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);

}

//set the height of content size as required

Answer #4

取消选中“使用Autolayout”为我做了诀窍。

环境:xCode 5.0.2故事板ios7


Answer #5

很多初学者不知道的是,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)
}

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


Answer #6

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

override func viewDidAppear(animated: Bool)

这为我修好了


Answer #7

我发现有了这个AutoLayout的问题......如果我只是让ViewController使用UIView而不是UIScrollView作为类...那么就自己添加一个UIScrollView ...它就可以工作。


Answer #8

添加UIScrollViewDelegate并将下面的代码添加到viewDidAppear方法中。

@interface testScrollViewController () <UIScrollViewDelegate>

-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}

Answer #9

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

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

欢迎:)


Answer #10

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

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


Answer #11

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

在最近几天的某个时候,我的UIScrollView 自发地将类型更改UIView ,即使它的类在检查器中说明了UIScrollView 。 我使用Xcode 5.1 (5B130a)

您可以创建新的滚动视图并从旧视图中复制测量值,设置和约束,也可以手动将视图更改为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>

类型自发改变后:

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

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

我也用</scrollView>替换了view的close标签</view> </scrollView>

在这种情况下,请确保id与当前视图保持一致:id =“qRn-TP-cXd”。

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

  • Xcode->Window->Organizer->Projects ,选择您的项目,在Derived Data行上点击Delete ...

或者如果使用设备:

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

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

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

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

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


Answer #12

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

有两件事对于使用autolayout设置scrollview并不直观:

  1. 您在contentview和scrollview之间设置的边距约束不会影响contentview的大小。 他们确实是利润率。 为了使它工作,contentview应该有一个固定的大小。
  2. 固定大小的技巧是可以将contentview的宽度设置为等于scrollview父级的宽度。 只需在左边的树中选择两个视图并添加相等的宽度约束。

这是该文章的要点。 有关完整的解释,包括插图,请查看。


Answer #13

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

如果您使用的是界面构建器,则可以使用用户定义的运行时属性来完成此任务。 例如:


Answer #14

之前没有提到的东西!

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

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

Answer #15

您需要设置滚动视图的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
    );
}




ipad