如何在UIScrollView中禁用水平滚动?

时间:2013-02-15 12:54:06

标签: ios uiscrollview scroll

我的scrollView为280(w)x 350(h),content view为840(w)x 405(h)。

我使用segmented control之间切换视图:

- (IBAction)segmentedClicked:(UISegmentedControl *)sender
{
    CGFloat x = sender.selectedSegmentIndex * self.personalDetailsScrollView.frame.size.width;
    CGPoint point = CGPointMake(x, 0);
    [self.personalDetailsScrollView setContentOffset:point animated:YES];
}

我想禁用常规水平滚动,因此只有分段按钮才能水平滚动视图。垂直滚动应该保持活动状态。

尝试使用 - (void)scrollViewDidScroll 以及此处提供的解决方案:(How to lock the horizontal scrolling of a scrollView in iOS)但由于某种原因它对我不起作用。

4 个答案:

答案 0 :(得分:1)

我没有尝试过,但这是我采取的方法:

UIScrollView中,有一个属性:

@property(nonatomic, readonly) UIPanGestureRecognizer *panGestureRecognizer

所以我会创建自己的新UIPanGestureRecognizer扩展名并覆盖:

- (CGPoint)translationInView:(UIView *)view
{
    CGPoint tmp = [super translationInView:view];
    return CGPointMake(0, tmp.y);
}

将该手势识别器添加到scrollview,然后调用:

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:youCustomOne];

它应该有用。

答案 1 :(得分:0)

试试这个

- (IBAction)segmentedClicked:(UISegmentedControl *)sender
{
    if(sender.selectedSegmentIndex == 0)
    {
       CGPoint point = CGPointMake(0, 0);
    }
    else
    {
       CGPoint point = CGPointMake(self.personalDetailsScrollView.frame.size.width, 0);
     }
    [self.personalDetailsScrollView setContentOffset:point animated:YES];
    }

答案 2 :(得分:0)

我知道这是一个迟到的答案,但我看到仍然没有接受的答案,所以我会试一试。

听起来你要做的就是使用1个控制器来有效地保持3个独立的屏幕。您尝试在屏幕之间切换,具体取决于用户在UISegmentedControl中选择的内容,并且您不希望用户只需横向滑动即可在视图之间进行平移。为什么不只有3个不同的视图控制器?我认为这是设置您要做的事情的更期望的方式,因此您会发现它更容易实现。

答案 3 :(得分:0)

Swift 3,将UIScrollViewDelegate设置为您的班级,然后使用下面的代码。

scrollView.isDirectionalLockEnabled = true

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.contentOffset.x>0 {
            webView.scrollView.contentOffset.x = 0.0
        }
    }