首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIScrollView内部的UIScrollView

UIScrollView内部的UIScrollView
EN

Stack Overflow用户
提问于 2013-03-16 00:30:52
回答 4查看 23.6K关注 0票数 29

我有一个里面有另一个UIScrollViewUIScrollView。它们都是水平滚动的,并且都有pagingEnabled = YES。假设我开始滚动内部滚动视图,并到达最右边的边界。如果我继续在其中滚动,那么外部的scrollView开始移动。我需要避免这种情况。内景要跳跃,要有橡皮筋效果,外景要留在原处。

希望它是清楚的,但这里有一个草图:

我尝试这样设置outerView.scrollEnabled = NO;

代码语言:javascript
复制
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    outerView.scrollEnabled = NO;
}

,如果只在innerView中滚动,它的工作方式完全符合我的需要。OuterView不再滚动。但是如果我想再次滚动outerView,我必须在某个地方将scrollEnabled设置回YES。我试着在这里这样做:

代码语言:javascript
复制
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    outerView.scrollEnabled = YES;
}

,但是我得到了同样的问题:在到达innerView的最右边界后,outerView滚动而不是使用橡皮筋效果的innerView跳转。

有什么建议如何解决问题吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-19 03:25:01

更新

此解决方案始终有效:

代码语言:javascript
复制
@implementation InnerScrollViewController <UIScrollViewDelegate, UIGestureRecognizerDelegate>

- (void)viewDidLoad
{
    UISwipeGestureRecognizer*   swipeGesture = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)] autorelease];
    swipeGesture.delegate = self;
    [self.view addGestureRecognizer:swipeGesture];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    _outerScrollView.scrollEnabled = NO;
    return YES;
}

- (void)handleSwipe:(UIGestureRecognizer*)gestureRecognizer
{

}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{   
    _outerScrollView.scrollEnabled = NO;
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (!decelerate)
    {
        _outerScrollView.scrollEnabled = YES;
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    _outerScrollView.scrollEnabled = YES;
}

@end

-----------------------------------------------------------------------

老答案:并不总是有效

下面是我是如何解决这个问题的:

代码语言:javascript
复制
@implementation InnerView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.delaysContentTouches = NO;
    }
    return self;
}

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view
{
    return NO;
}

据我所知,self.delaysContentTouches = NO;使所有事件都能立即交付,而- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view通过响应器链阻止这些事件的传递。

票数 19
EN

Stack Overflow用户

发布于 2013-03-16 00:48:02

通过以下方式修改您的方法:

代码语言:javascript
复制
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if(scrollView == innerView)
        outerView.scrollEnabled = NO;
    else
        outerView.scrollEnabled = YES;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    if(scrollView == innerView)
    {
         if(innerView.contentOffset.x + innerView.frame.size.width == innerView.contentSize.width)
         {
              outerView.scrollEnabled = NO;
         }
         else
         {
              outerView.scrollEnabled = YES;
         }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-07-11 04:36:20

我也有类似的问题。我找到了解决方案,但它只适用于innerScrollView.bounces = NO

代码语言:javascript
复制
@interface PageCtrl ()
    @property (weak, nonatomic) IBOutlet UIScrollView *innerScrollView;
    @property(nonatomic) UIPanGestureRecognizer *panLockScroll;
@end

@implementation PageCtrl
- (void)viewDidLoad {
    // ...
    self.innerScrollView.delegate = self;   

    self.innerScrollView.bounces = NO;   // disable bounces!

    self.panLockScroll = [[UIPanGestureRecognizer alloc]initWithTarget:self action:nil];
    self.panLockScroll.delegate = self;
    [self.innerScrollView addGestureRecognizer:self.panLockScroll];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer{
    if( gestureRecognizer == self.panLockScroll && 
        otherGestureRecognizer == self.innerScrollView.panGestureRecognizer ){
        return YES;
    }
    return NO;
}

@end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15437515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档