0

ここに画像の説明を入力

x = 0.0、x = 320.0、x = 640.0 のスクロールビューに 3 つのテーブルビューを配置しました。ユーザーがテーブルビューを水平方向にスワイプすると (上部にあるため)、スワイプイベントをそのスーパービューに渡したいと思います。ユーザーがテーブルビューを垂直方向にスワイプすると、テーブルビューは垂直方向にスクロールする必要があります。

どうすればこれを達成できますか?

4

2 に答える 2

2

からタッチを渡すには、次のUIScrollViewコードをカテゴリとして使用します。

@implementation UIScrollView (FixedApi)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];

    NSLog(@"touch view = %@", [[touch view].class description]);
    if ([[[touch view].class description] isEqualToString:@"UITableViewCellContentView"]) {
        //To pass the touch to UITableViewCell
    } else if ([[[touch view].class description] isEqualToString:@"UITableView"] && isHorizntalSCroll == true && pageNumber == 2) {
        //To pass the touch to UITableView

    } else if ([[[touch view].class description] isEqualToString:@"UIView"]) {
        //To pass the touch to UIView
    } else {
    [self.superview touchesBegan:touches withEvent:event]; // or 1 nextResponder, depends
    [super touchesBegan:touches withEvent:event];
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if ( !self.dragging ) [self.nextResponder.nextResponder touchesEnded:touches withEvent:event];
    [super touchesEnded:touches withEvent:event];
}

@end

垂直/水平スクロールを決定するには、次のコードを使用できます。

.h ファイル<UIScrollViewDelegate>

BOOL pageControlIsChangingPage;
CGPoint startPos;
int     scrollDirection;
int CX; //The width of the pages.
BOOL isHorizntalSCroll;
int pageNumber;

.m ファイル

#pragma mark -
#pragma mark UIScrollViewDelegate stuff
- (void)scrollViewDidScroll:(UIScrollView *)_scrollView {
    if (scrollDirection==0){//we need to determine direction
        //use the difference between positions to determine the direction.
        if (abs(startPos.x-scrollView.contentOffset.x)<abs(startPos.y-scrollView.contentOffset.y)){          
            NSLog(@"Vertical Scrolling");
            scrollDirection=1;
            isHorizntalSCroll = false;
            [scrollView setPagingEnabled:NO];
        } else {
            NSLog(@"Horitonzal Scrolling");
            scrollDirection=2;
            isHorizntalSCroll = ture;
            [scrollView setPagingEnabled:YES];
        }
    }

    if (scrollDirection==1) {
        [scrollView setContentOffset:CGPointMake(startPos.x,scrollView.contentOffset.y) animated:NO];
    } else if (scrollDirection==2){
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x,startPos.y) animated:NO];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView {
    if (pageControlIsChangingPage) {
        return;
    }

    CGFloat pageWidth = _scrollView.frame.size.width;
    int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    pageControl.currentPage = page;
    pageNumber = page;
    NSLog(@"page number = %d",page);
    if (page == 3 || page == 0) {
        [scrollView setContentSize:CGSizeMake(CX, personalInfo.frame.size.height + 100)];
    } else {
        [scrollView setContentSize:CGSizeMake(CX, [scrollView bounds].size.height)];
    }

    pageControlIsChangingPage = NO;
}

#pragma mark -
#pragma mark PageControl stuff
- (IBAction)changePage:(id)sender {
    /*
     *  Change the scroll view
     */
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * pageControl.currentPage;
    frame.origin.y = 0;

    [scrollView scrollRectToVisible:frame animated:YES];

    /*
     *  When the animated scrolling finishings, scrollViewDidEndDecelerating will turn this off
     */
    pageControlIsChangingPage = YES;
}

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

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollViews willDecelerate:(BOOL)decelerate {
    if (decelerate) {
        scrollDirection=3;
    }
}

それでおしまい、

于 2012-10-24T07:11:42.400 に答える
0

IBまたはコードを介して各テーブルビューの水平スクロールを無効contentsizeにし、ベーススクロールビューを960に設定すると、問題なく動作heightOfTableviewするはずです...これでうまくいくはずです。

于 2012-10-24T07:03:40.487 に答える