UIScrollView 在 removeFromSuperView 时禁用滚动

UIScrollView disable scrolling when removeFromSuperView

我有一个 .xib 文件,它有一个视图、一个标签栏和其他 3 个滚动视图,当用户 select 一个新的标签栏项目时,我执行此代码:

//Views e Scrolls
    IBOutlet UIView *myView;
    IBOutlet UIScrollView *myScroll;
    IBOutlet UIScrollView *myScroll2;
    IBOutlet UIScrollView *myScroll3;

@property (nonatomic) UIScrollView *scroll;

-(void)tabBar:(UITabBar *)tabBar
didSelectItem:(UITabBarItem *)item{

    NSArray *viewsToRemove = [myView subviews];
    for (UIView *v in viewsToRemove) {
        [v removeFromSuperview];
    }

    if(item.tag == 1){
        self.title = @"scroll 1";
        scroll = myScroll;
    }
    if(item.tag == 2){
        self.title = @"scroll 2";
        scroll = myScroll2;
    }
    if(item.tag == 3){
        self.title = @"scroll 3";
        scroll = myScroll3;
    }

    scroll.contentSize = scroll.frame.size;
    scroll.frame = myView.frame;

    scroll.scrollEnabled = YES;

    [myView addSubview:scroll];

    [myView setBackgroundColor:[UIColor clearColor]];

}

此代码运行良好,但是当我 select 之前从视图中删除的其中一个卷轴时,它们失去了滚动(以前没有发生过),为什么会发生这种情况以及如何解决?

假设我理解你的意图是正确的:从 superview 中删除一个 scollview 也会将它从 responderchain 中删除。它不再响应触摸事件 - 因此不会滚动。

这里是这一行:

scroll.contentSize = scroll.frame.size;

当您的 UIScrollViewcontentSize 与其 frame.size 匹配时,它不需要滚动(根据定义)。您需要计算出其内容的实际大小并使用它。您至少可以通过这样做来展示正确的功能(即使它没有正确的值):

scroll.contentSize = CGSizeMake(scroll.frame.size.width*2, scroll.frame.size.height*2);

不过,您必须自己找到真正的内容大小。

问题本身和你写代码的目的不是很清楚。您可以尝试进一步解释。并检查这一行 -

scroll.contentSize = scroll.frame.size;

contentSize <= frame.size 的 UIScrollView 不会滚动。要使其滚动,contentSize 应大于 frame.size

您通常应该根据 scrollView 的内容(子视图)数量设置 contentSize。

在下一行中,您更改了 frame.size,但我认为在您的情况下,这不会使帧大小小于 contentSize。