0

次の階層があります。

VC -> UIView -> UISCrollView

UIView はたまたま UIScrollView のデリゲートであり、インスタンス変数として UIScrollView を所有しています。

UIView .h:

#import <UIKit/UIKit.h>
#import "ImageScrollView.h"


@interface Scroller : UIView <UIScrollViewDelegate>{

      ImageScrollView *scroller;
}


@end

.m:

#import "Scroller.h"

@implementation Scroller

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        DLog(@"");
        [self initScroll];
    }
    return self;
}


-(void)initScroll{

    DLog(@"");
    scroller = [[ImageScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200, 200)];
    scroller.delegate = self;

    [self addSubview:scroller];

}


- (void)scrollViewDidScroll:(UIScrollView *)sender {

    // Update the page when more than 50% of the previous/next page is visible
    CGFloat pageWidth = self.frame.size.width;
    int page = floor((scroller.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    DLog(@"%d",page);

}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

    DLog(@"");

}

注: 現在のところ、どのデリゲート メソッドも呼び出されません。ただし、iPhone画面のUIScrollViewはブラックボックスとして表示されます。

#import "ImageScrollView.h"

@implementation ImageScrollView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        DLog(@"%f %f",frame.size.width,frame.size.height);
        [self configUI];
        [self configSelf];

    }
    return self;
}


-(void)configUI{

    self.backgroundColor = [UIColor blackColor];
    self.contentSize = CGSizeMake(1000, 400);
    self.showsHorizontalScrollIndicator = YES;

}


-(void)configSelf{

    self.scrollEnabled = YES;

}



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

    DLog(@"");

    for (UITouch *touch in touches) {

        CGPoint _location = [touch locationInView:touch.view];
        [self processTouch:_location];
    }

    [self.delegate scrollViewDidEndDecelerating:self];

}


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

     DLog(@"");

    for (UITouch *touch in touches) {

        CGPoint _location = [touch locationInView:touch.view];
        [self processTouch:_location];
    }


}


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

     DLog(@"");

    for (UITouch *touch in touches) {

        CGPoint _location = [touch locationInView:touch.view];
        [self processTouch:_location];
    }


}


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

    [self touchesEnded:touches withEvent:event];
}

注: IUScrollViewSubclass では、touchesEnded または touchesMoved メソッドは呼び出されません。

私は何を間違っていますか?

このコードは機能しますが、ビュー コントローラーをデリゲートとして uiscrollview に割り当てると、

4

1 に答える 1

0

あなたのコードを実装すると、うまくいきます。

何が起こっているのかをより詳しく確認するために、次の行を追加しました。

NSLog (@"%@",NSStringFromSelector(_cmd));

すべてのメソッドの開始時。

scrollView 内をパンすると、これはログです。

ScrollViewTest1[4155:707] scrollViewDidScroll:
ScrollViewTest1[4155:707] 0
ScrollViewTest1[4155:707] scrollViewDidScroll:
ScrollViewTest1[4155:707] 0
ScrollViewTest1[4155:707] scrollViewDidScroll:
ScrollViewTest1[4155:707] 0
ScrollViewTest1[4155:707] scrollViewDidEndDecelerating:

タッチは scrollView の組み込み panGestureRecognizer によってインターセプトされるため、タッチ メソッドは呼び出されません。

scrollView 内をタップすると、ログは次のようになります。

ScrollViewTest1[4155:707] touchesBegan:withEvent:
ScrollViewTest1[4155:707] processTouch:
ScrollViewTest1[4155:707] scrollViewDidEndDecelerating:
ScrollViewTest1[4155:707] touchesEnded:withEvent:
ScrollViewTest1[4155:707] processTouch:

scrollView として呼び出された Touches は、独自のgestureRecognizer のタッチ イベントを取得していません。

于 2013-02-18T00:03:04.713 に答える