我有两个滚动视图,两个都应该垂直滚动。外部滚动视图(红色)包含搜索栏和内部滚动视图(蓝色)。内部滚动视图应该无限滚动(它包含图像/项目,并具有无限滚动实现)。
我想让这个控制器工作的方式如下:
当我向下滚动时,外部滚动视图应首先滚动,搜索栏应消失(滚出内容区域)。只有在那之后,内部滚动视图才应该开始滚动。 向上滚动时,内部滚动视图应一直滚动到顶部。只有这样外部滚动视图才能进行滚动事件,最后向上滚动以使搜索栏再次可见。
如果我只是在没有任何修改的情况下将它们嵌套在IB中,那么内部滚动视图会捕获所有滚动事件,并且它会以相反的方式工作。
请记住,我在这里使用内部滚动视图作为简化的比喻。在我的应用程序中,我实际上有一个控件,它有一个带嵌套表视图的滚动视图(滚动视图让我水平翻页,表格视图让我垂直滚动)。
答案 0 :(得分:2)
如果能够,在2个滚动视图上设置公共UIScrollViewDelegate,并实现以下内容:
- (void) scrollViewDidScroll: (UIScrollView*) scrollView
{
if (scrollView == self.mainScrollView)
{
/* Handle instances when the main scroll view is already at the bottom */
if ( scrollView.contentOffset.y
== scrollView.contentSize.height - scrollView.bounds.size.height)
{
/* Stop scrolling the main scroll view and start scrolling the
* inner scroll view
*/
self.innerScrollView.scrollEnabled = YES;
self.mainScrollView.scrollEnabled = NO;
}
else
{
/* Start scrolling the main scroll view and stop scrolling the
* inner scroll view
*/
self.innerScrollView.scrollEnabled = NO;
self.mainScrollView.scrollEnabled = YES;
}
}
else if (scrollView == self.innerScrollView)
{
/* Handle instances when the inner scroll view is already at the top */
if (self.innerScrollView.contentOffset.y == 0)
{
/* Stop scrolling the inner scroll view and start scrolling the
* main scroll view
*/
self.innerScrollView.scrollEnabled = NO;
self.mainScrollView.scrollEnabled = YES;
}
else
{
/* Start scrolling the inner scroll view and stop scrolling the
* main scroll view
*/
self.innerScrollView.scrollEnabled = YES;
self.mainScrollView.scrollEnabled = NO;
}
}
}
请注意,我没有对此进行测试,但逻辑可能有点像这样(要么启用滚动功能,要么禁用用户交互,或者其他内容)。很可能这并不是你想要的解决方案,但我确信一个常见的UIScrollViewDelegate是你问题的解决方案。
答案 1 :(得分:1)
我给出了一个scrollview的示例,同样你需要创建一个scrollview并根据动态高度和内容大小添加它将起作用。
// .h文件
@property (nonatomic, strong) UIScrollView *scrlSearch;
// .m文件// ViewDidLoad
scrlSearch = [[UIScrollView alloc] init];
// For first scroll screen height was ((total screen height / 100 )* 10% )
// For Second scroll screen height was ((total screen height / 100 )* 90% )
scrlSearch.frame = CGRectMake(0, 0, (YourScreenWidth), (YourScreenHeight));
// YourVIEW = add any view to scrollbar
[scrlSearch addSubview:YourVIEW];
CGSize contentSize = scrlSearch.frame.size;
// YourContentHeight = dynamic content or static content height
contentSize.height = YourContentHeight;
// set the ContentHeight for scrolling
[scrlSearch setContentSize:contentSize];
// add the scrollview into delegate
[scrlSearch setDelegate:self];
答案 2 :(得分:0)
只使用一个scrollView并为搜索栏设置contentInset / contentOffset。这条线上的东西:
UIEdgeInsets oldEdgeInset = [[self scrollView] contentInset];
CGRect f = [[self searchBar] frame];
UIEdgeInsets newEdgeInset = UIEdgeInsetsMake(CGRectGetMaxY(f), 0, 0, 0);
CGPoint offset = [[self scrollView] contentOffset];
offset.y += oldEdgeInset.top - newEdgeInset.top;
[[self scrollView] setContentOffset:offset];
[[self scrollView] setContentInset:newEdgeInset];
[[self searchBar] setFrame:f];
答案 3 :(得分:0)
我不确定您的结构并希望实施..
我已经让测试项目找到了here
但该项目肯定会帮助您一起管理不同的滚动视图..
虽然应用程序可能不完美,但会给你一些想法来实现解决方案。
希望有所帮助......
干杯
答案 4 :(得分:0)
你应该在外部scrollview上添加内部scrollview,但是内部scrollview'y'位置应该是外部滚动视图集的内容,如...
innerScrollView.frame = CGRectMake(10, outerScrollView.contentSize.height, 300, 440);
在此之后你可以在这个innerScrollView上添加任何视图,你可以为innerScrollView设置contentOffset等。
最后,您应该为外部scrollview增加contentSize。
outerScrollView.contentSize = CGSizeMake(320, innerScrollView.frame.size.height+actualContentSizeOfOuterScroolView);
我认为这对你有帮助!
答案 5 :(得分:0)
为您的最顶层视图创建滑动手势识别器(在视图控制器的视图上方的所有滚动视图上方),并使其识别UISwipeGestureRecognizerDirectionUp
。
然后,只要外部滚动视图滚动,您就需要通知控制器。 向下滚动后,添加手势识别器。当它再次到达顶部时(outerScrollView.contentOffset ==(0,0)),删除手势识别器。
手势应该“吃掉”所有滑动事件,使你的内部滚动视图不接收触摸事件,因此不会滚动