【问题标题】:UIScrollView doesn't scroll on iPad but works on iPhoneUIScrollView 不能在 iPad 上滚动,但可以在 iPhone 上使用
【发布时间】:2014-08-17 14:11:23
【问题描述】:

更新

我知道关闭AutoLayout 可以解决滚动问题。但是,我仍然想使用AutoLayout。为什么它适用于 iPhone 而不是 iPad?有解决方法吗?这似乎是一个错误......


我已经尝试了几件事来让它发挥作用,但似乎没有什么对我有用。我有一个我在viewDidAppear 中调用的函数,它可以调整我的 UIScrollView 的内容大小。我的视图高度是 916,日志说它正在将内容高度调整为 1267。启用了滚动(我在情节提要中设置了它,但也在代码中设置了它以尝试使其工作)。

这是奇怪的事情。如果我单击文本字段内部,滚动会突然起作用。在那段时间里,我确实改变了滚动视图的内容大小,但是我在那里所做的任何事情我都尝试在我的调整大小功能中做,但它仍然不起作用。当我在文本视图中单击时,调整大小功能以及动画如下。

- (void)resize_scrollview_to_fit {
    CGFloat scrollViewHeight = 0.0f;
    for (UIView *view in scrollView.subviews) {
        if (view.frame.size.height + view.frame.origin.y > scrollViewHeight) {
            scrollViewHeight = view.frame.size.height + view.frame.origin.y + 10;

            NSLog(@"Inside Scroll View 'If' Statement");
        }
    }

    NSLog(@"Resizing scroll view to fit: %f", scrollViewHeight);

    [scrollView setContentSize:(CGSizeMake(scrollView.frame.size.width, scrollViewHeight))];

    NSLog(@"Scrollview content height: %f", scrollView.contentSize.height);

    NSLog(@"Screen height: %f", [[UIScreen mainScreen] bounds].size.height);
}

每次运行时我得到的日志是:

2014-06-26 14:14:05.455 eTicket[1113:60b] Inside Scroll View 'If' Statement
2014-06-26 14:14:05.456 eTicket[1113:60b] Resizing scroll view to fit: 1267.000000
2014-06-26 14:14:05.457 eTicket[1113:60b] Scrollview content height: 1267.000000
2014-06-26 14:14:05.458 eTicket[1113:60b] Screen height: 1024.000000

- (void) animateTextView:(UITextView *) textView up: (BOOL) up
{
    const int movementDistance = keyboardSize.height - 58; // tweak as needed
    //const float movementDuration = 0.3f; // tweak as needed

    NSLog(@"Moving View Up: %f", keyboardSize.height);

    int movement = (up ? -movementDistance : movementDistance);

    scrollView.frame = CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height + movement);

    [self resize_scrollview_to_fit];

    if (up && textView.frame.origin.y + 10 < scrollView.contentSize.height - scrollView.frame.size.height) {
        scrollView.contentOffset = CGPointMake(0, textView.frame.origin.y - 10);
    }else if (up) {
        scrollView.contentOffset = CGPointMake(0, scrollView.contentSize.height - scrollView.frame.size.height);
    }else{

    }
}

我在代码中的多个位置放置了resize_scrollview_to_fit 方法调用,功能没有任何变化。任何帮助将不胜感激。

谢谢, 詹姆斯

【问题讨论】:

  • 你试过把它放在viewDidLayoutSubviews吗?
  • 您是否启用了弹跳功能?如果是这样,它会反弹而不滚动吗?如果内容大小设置不正确,滚动视图不会总是滚动。
  • @InkGolem 是的,弹跳已开启,但没有弹跳。此外,NSLog 显示内容高度在我设置后设置正确。如果我关闭自动布局,它就可以正常工作。很奇怪。
  • @Losiowaty 我没有,但这有关系吗?它已经获得了正确的内容大小并成功应用它(或者 NSLogs 显示),它只是不滚动。最奇怪的是,如果我关闭自动布局,一切正常。
  • 好吧,我遇到了类似的问题(禁用自动布局也有帮助)并将我设置 contentSize 的部分移动到 viewDidLayouSubviews 有帮助。实际上,我了解到这是第一种可以确保自动布局不会改变任何事情的方法。

标签: ios ipad uiscrollview


【解决方案1】:

正如我在问题下的 cmets 所述:

使用 AutoLayout 时,您应该在 viewDidLayoutSubviews 中设置 UIScrollView 的 contentSize - 使用该方法后,您可以相当确定自动布局不会改变任何内容。关于viewDidLayoutSubviews的更多解释请参考accepted answer here

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 2014-08-26
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2017-09-09
    相关资源
    最近更新 更多