代码之家  ›  专栏  ›  技术社区  ›  Mark

uiScrollView不滚动

  •  117
  • Mark  · 技术社区  · 15 年前

    我有一个 UIScrollView 里面有很多 UIImageView S、UILabels等…标签的长度比 UISCLVIEW ,但当我运行应用程序时,我无法单击并向下滚动…

    为什么会这样?

    谢谢

    23 回复  |  直到 6 年前
        1
  •  159
  •   Rohit Pathak    7 年前

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

    // 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
    

    斯威夫特4

    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开始) .

    注: 如果您使用的是自动布局,则放置此代码的最佳位置是 -(void)viewDidLayoutSubviews 方法。

        2
  •  120
  •   user1539652    12 年前

    如果即使在设置后仍无法滚动视图 内容大小 正确地, 确定你 取消检查 “使用界面生成器->文件检查器中的“自动布局”。

        3
  •  64
  •   Jose Llausas    9 年前

    你需要设置 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
        );
    }
    
        4
  •  45
  •   Jasper Blues    12 年前

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

    如果您使用的是InterfaceBuilder,那么一个很好的方法就是使用用户定义的运行时属性。Eg:

    t内容大小。

    如果您使用的是InterfaceBuilder,那么一个很好的方法就是使用用户定义的运行时属性。如:

    enter image description here

        5
  •  35
  •   Alex Zavatone    10 年前

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

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

    你可以用自己的大数字来代替2000。如果它有效,这意味着当你调整大小时,你的内容大小不够大。

    滚动视图工作不需要委派。

        6
  •  13
  •   Ben Gottlieb    15 年前

    确保将滚动视图的ContentSize属性设置为正确的大小(即,一个足够大以包含所有内容的大小)。

        7
  •  7
  •   Gaurav Kumkar    11 年前

    取消选中“使用自动布局”为我做了这个技巧。

    环境: XCOD5.0.2 故事板 IOS7

        8
  •  4
  •   devios1    10 年前

    在我的情况下,我必须 delaysContentTouches 之所以为true,是因为ScrollView中的对象都在捕获触摸事件并处理它们自己,而不是让ScrollView自己处理它。

        9
  •  3
  •   Atef    11 年前

    之所以滚动视图不滚动是因为设置滚动的内容大小小于滚动视图的大小,这是错误的。 您应该将内容大小设置为大于滚动视图的大小,以便在滚动时在其中导航。

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

    欢迎:

        10
  •  3
  •   Abhinav Singh    11 年前

    还有一点,以上都是滚动视图可能无法滚动的实际原因,但有时这可能是通过代码而不是ib添加滚动视图时,将子视图添加到父视图而不是滚动视图的原因,这会导致子视图无法滚动。

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

        11
  •  3
  •   Kuldeep Jayesh Lathiya    6 年前

    集合 contentSize 性质 UIScrollview 在里面 ViewDidLayoutSubviews 方法。像这样的东西

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
    }
    
        12
  •  3
  •   Kuldeep Jayesh Lathiya    6 年前

    如果您收到一条消息(ios8/swift),说明 viewDidLayoutSubviews 不存在,请使用以下内容

    override func viewDidAppear(animated: Bool)
    

    这个给我修的

        13
  •  2
  •   coolcool1994    11 年前

    一些以前没有提到的事情!

    确保您的插座正确连接到滚动视图!它应该有一个填充的圆,但是即使您已经填充了圆,滚动视图也可能没有连接——所以请仔细检查!将鼠标悬停在圆上,查看实际的滚动视图是否突出显示!(这是我的案子)

    //Connect below well to the scrollView in the storyBoard
    @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
    
        14
  •  2
  •   flo527    8 年前

    很多时候,如果您已经学习了教程,代码是正确的,但是许多初学者不知道的是,滚动视图是正确的。 不是 在模拟器中正常滚动。只有当你按下鼠标垫时,它才会滚动。 同时滚动。许多 有经验 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)
    }
    

    只要你照我上面说的做,这段代码就行了

        15
  •  1
  •   Dharmesh Dhorajiya    10 年前

    如果其他解决方案都不适用于您,请再次检查滚动视图是否是 UIScrollView 在接口生成器中。

    在过去几天的某个时刻, UISCLVIEW 自发改变类型 到A UIView 即使它的班级说 UISCLVIEW 在检查员那里。我在用 Xcode 5.1 (5B130a) .

    您可以创建一个新的滚动视图并从旧视图复制测量值、设置和约束,也可以手动将视图更改为 UISCLVIEW 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 ,选择设备->应用程序,选择应用程序,单击(-)

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

    • Xcode->Product->Clean
    • 网间网操作系统 Simulator/device->press 并持有 app->click 将其移除的(X)

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

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

        16
  •  1
  •   Chase Roberts    9 年前

    如果你 scrollView 是的子视图 containerView 某种类型的,然后确保 滚动视图 集装箱视图 . 我有 containerView.clipsToBounds = NO 它仍然允许我看到滚动视图,但是因为 滚动视图 不在 集装箱视图 它无法检测触摸事件。

    例如:

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

    您将能够看到滚动视图,但它不会接收到用户交互。

        17
  •  1
  •   Jagat Dave swift taylor    9 年前

    在中添加以下代码 viewDidLayoutSubviews 用自动布局为我工作。在尝试了所有答案之后:

    - (void)viewDidLayoutSubviews
    {
        self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
    
    }
    
    //set the height of content size as required
    
        18
  •  1
  •   Kuldeep Jayesh Lathiya    6 年前

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

    @interface testScrollViewController () <UIScrollViewDelegate>
    
    -(void)viewDidAppear:(BOOL)animated {
        self.scrollView.delegate = self;
        self.scrollView.scrollEnabled = YES;
        self.scrollView.contentSize = CGSizeMake(375, 800);
    }
    
        19
  •  1
  •   Henry Heleine    6 年前

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

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

    一旦我删除了绑定到安全区域和/或超级视图的顶部和/或底部约束,滚动视图中的视图就可以再次滚动,并且不会固定在屏幕底部的顶部!

    希望这能阻止其他人在这个问题上忍受数小时的痛苦。

        20
  •  0
  •   H. de Jonge    8 年前

    在这条线索中给出的答案失败后,我偶然发现 this article 解决方案。

    使用自动布局设置滚动视图有两件事不直观:

    1. 设置为ContentView和ScrollView之间的边距的约束不会影响ContentView的大小。它们真的是利润率。为了使其工作,ContentView应该有一个固定的大小。
    2. 固定大小的诀窍是,可以将ContentView的宽度设置为与ScrollView的父级的宽度相等。只需选择左侧树中的两个视图并添加等宽约束。

    这是那篇文章的要点。要获得包括插图在内的完整解释,请查看。

        21
  •  0
  •   Michele Dall'Agata    7 年前

    我第一次尝试就成功了。有了自动布局和一切,没有额外的代码。然后一个收集视图变成了香蕉,在运行时崩溃了,我找不到问题所在,所以我删除并重新创建了它(我使用的是Xcode10测试版4)。感觉像个虫子),然后滚动就消失了。不过,集合视图再次工作了!

    几个小时后……这就是为我修理的。我的布局如下:

    UIVIEW

    • 安全区域
    • 滚动视图
      • 内容视图

    一切都在约束之中。安全区域由系统自动定义。在最坏的情况下,删除滚动视图和内容视图的所有约束,然后执行 让ib为您重置/创建它们。手工制作,就行了。

    • 对于滚动视图,我做到了: 将尾部/顶部与安全区域对齐。与安全区域等宽/等高 .
    • 对于内容视图,我做到了: 将尾随/前导/顶部/底部与SuperView(滚动视图)对齐

    基本上概念是让内容视图适合滚动视图,这是适合安全区域。

    但就这样,它不起作用。内容视图缺少高度。我尽我所能,唯一能做的就是 内容视图高度已创建控件拖动内容视图..对自身 . 它定义了一个固定的高度,这个值是根据视图控制器的大小计算出来的(定义为自由形式,比实际显示长,包含我的所有子视图),最后它又工作了!

        22
  •  0
  •   Kuldeep Jayesh Lathiya    6 年前

    我发现这个自动布局的问题…如果我只是 ViewController 使用 UIView 而不是 UIScrollView 为了班级…然后添加一个 UISCLVIEW 我自己…这是有效的。

        23
  •  0
  •   Nandu    6 年前

    我在IB也有同样的问题。

    将滚动视图的前导、尾随、顶部和底部设置为其超级视图后。我做了以下更改以使ContainerView可滚动,这是有效的。

    要使ScrollView只在水平方向上滚动,请使用ScrollView的Centery=ContainerView的Centery进行约束。

    要使其垂直滚动,请使滚动视图的CenterX=ContainerView的CenterX