【iOS開發系列】scrollView中的directionalLockEnabled

scrollView中的directionalLockEnabled的功能本來就是用來讓用戶每次只在一個方向上滾動,豎直或者水平,但是如果初始移動方向處於45°左右的時候,這個鎖就失效了。

蘋果官方發現了這個問題,在官方文檔裏有如下描述,但是沒有解決:

"If this property is NO, scrolling is permitted in both horizontal and vertical directions. If this property is YES and the user begins dragging in one general direction (horizontally or vertically), the scroll view disables scrolling in the other direction. If the drag direction is diagonal, then scrolling will not be locked and the user can drag in any direction until the drag completes. The default value is NO"

這是stackoverflow上的討論:http://stackoverflow.com/questions/728014/uiscrollview-paging-horizontally-scrolling-vertically 

@property (nonatomic) CGPoint scrollViewStartPosPoint;
@property (nonatomic) int     scrollDirection;

@synthesize scrollViewStartPosPoint = _scrollViewStartPosPoint;
@synthesize scrollDirection = _scrollDirection;

- (id)initWithFrame:(CGRect)frame
{
     _scrollDirection = 0;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (self.scrollDirection == 0){//we need to determine direction
        //use the difference between positions to determine the direction.
        if (abs(self.scrollViewStartPosPoint.x-scrollView.contentOffset.x)<
            abs(self.scrollViewStartPosPoint.y-scrollView.contentOffset.y)){
            //Vertical Scrolling
            self.scrollDirection = 1;
        } else {
            //Horitonzal Scrolling
            self.scrollDirection = 2;
        }
    }
    //Update scroll position of the scrollview according to detected direction.
    if (self.scrollDirection == 1) {
        scrollView.contentOffset = CGPointMake(self.scrollViewStartPosPoint.x,scrollView.contentOffset.y);
    } else if (self.scrollDirection == 2){
        scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x,self.scrollViewStartPosPoint.y);
    }
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{
    self.scrollViewStartPosPoint = scrollView.contentOffset;
    self.scrollDirection = 0;
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{
    if (decelerate) {
        self.scrollDirection =0;
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{
    self.scrollDirection =0;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event]; // always forward touchesBegan -- there's no way to forward it later
//    if (_isHorizontalScroll)
//        return; // UIScrollView is in charge now
//    if ([touches count] == [[event touchesForView:self] count]) { // initial touch
//        _originalPoint = [[touches anyObject] locationInView:self];
//        _currentChild = [self honestHitTest:_originalPoint withEvent:event];
//        _isMultitouch = NO;
//    }
//    _isMultitouch |= ([[event touchesForView:self] count] > 1);
//    [_currentChild touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
     [super touchesMoved:touches withEvent:event];
//    if (!_isHorizontalScroll && !_isMultitouch) {
//        CGPoint point = [[touches anyObject] locationInView:self];
//        if (fabsf(_originalPoint.x - point.x) > kThresholdX && fabsf(_originalPoint.y - point.y) < kThresholdY) {
//            _isHorizontalScroll = YES;
//            [_currentChild touchesCancelled:[event touchesForView:self] withEvent:event]
//        }
//    }
//    if (_isHorizontalScroll)
//        [super touchesMoved:touches withEvent:event]; // UIScrollView only kicks in on horizontal scroll
//    else
//        [_currentChild touchesMoved:touches withEvent:event];
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章