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;
当您的 UIScrollView
的 contentSize
与其 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。
我有一个 .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;
当您的 UIScrollView
的 contentSize
与其 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。