2012-07-01 4 views
2

gestureRecognizers을 구현하는 customScrollView 클래스 내에 실제로 터치 대리자 함수 (touchBegan:withEvent 또는 touchEnded:withEvent)를 삽입하려고합니다.제스처 인식기 대리자 : 터치 위임 함수 구현 방법

인식기 개체의 대리자를 self로 설정하려고하면 SDK에 "호환되지 않는 ID 유형"이라는 경고 메시지가 나타납니다.

GestureRecognizer의 대리자 프로토콜에는 이러한 기능이 포함되어 있지 않지만 내 사용자 지정보기에서 앞서 언급 한 기능을 사용하려면 어떤 대리인을 트리거해야하는지 알지 못합니다.

@interface TapScrollView : UIScrollView { 

    // id<TapScrollViewDelegate> delegate; 
    NSMutableArray *classementBoutons; 
    int n; 
    int o; 
//UIImageView *bouton; 

} 
//@property (nonatomic, assign) id<TapScrollViewDelegate> delegate; 
//@property (nonatomic, retain) UIImageView *bouton; 

//@property (strong, nonatomic) UIPanGestureRecognizer *bouton01pan; 

-(id)init; 
-(void)initierScrollView; 

-(void) createGestureRecognizers; 
-(IBAction)handlePanGesture:(UIPanGestureRecognizer*)sender; 


@end 



#import "TapScrollView.h" 


@implementation TapScrollView 

//@synthesize bouton; 

- (void)setUpBoutonView { 
    // Create the placard view -- its init method calculates its frame based on its image 
    //boutonHome *aBoutonMain = [[boutonHome alloc] init]; 
    //self.boutonMain = aBoutonMain; 
    //[boutonMain setCenter:CGPointMake(200, 200)]; 
    //[self addSubview:boutonMain]; 
} 

- (id) init 
{ 
    if (self = [super init]) 
    { 
     NSLog(@"Classe TapScrollView initiée"); 
    } 
    return self; 
} 


-(void)initierScrollView 
{ 
    int i; 
    for (i=0; i<6; i++) { 

     UIImage *image = [UIImage imageNamed:@"back.png"]; 
     UIImageView *bouton = [[UIImageView alloc] initWithImage:image]; 
     [bouton setTag:i]; 
     [bouton setFrame:CGRectMake(72+20*i,10,62,55)]; 
     [classementBoutons insertObject:bouton atIndex:i]; 
     bouton.userInteractionEnabled = YES; 

     UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; 
     recognizer.delegate = self; 
     [bouton addGestureRecognizer:recognizer]; 
     [self addSubview:bouton]; 
} 
} 
//- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
//{  
// UITouch *touch = [touches anyObject]; 
//[super touchesBegan:touches withEvent:event]; 

    // for (o=1; o<6; o++) { 
    // if ([touch view] == [self viewWithTag:o]) 
    // { 
    // UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:[classementBoutons objectAtIndex:o] action:@selector(handlePanGesture:)]; 
    // [[classementBoutons objectAtIndex:o] addGestureRecognizer:recognizer]; 
    // bouton01 = [self viewWithTag:o]; 
    // } 
    // } 

    //CGPoint touchPoint = [touch locationInView:self]; 
    //[self animateFirstTouchAtPoint:touchPoint]; 
    // return; 
//} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for (n=0; n<6; n++) { 
     NSLog(@"touche cancelled"); 
     [[classementBoutons objectAtIndex:n] setFrame:CGRectMake((72+20)*n,10,62,55)]; 
    } 


} 

//- (id<TapScrollViewDelegate>) delegate { 
// return (id<TapScrollViewDelegate>)super.delegate; 
//} 

//- (void) setDelegate:(id<TapScrollViewDelegate>) aDelegate 
//{ 
// super.delegate = aDelegate; 
//} 

#define GROW_ANIMATION_DURATION_SECONDS 0.15 
#define SHRINK_ANIMATION_DURATION_SECONDS 0.15 



-(IBAction)handlePanGesture:(UIPanGestureRecognizer*)recognizer 
{ 
    NSLog(@"Mouvement ok"); 
    CGPoint translation = [recognizer translationInView:self]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
             recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self]; 

} 
@end 

답변

2

지정하십시오 :이 방법으로

@interface TapScrollView : UIScrollView <UIGestureRecognizerDelegate> { 

, 당신의 경고를

이 답변 주셔서 감사합니다

빅터 마리 여기

내 코드입니다 나는 당신이 무엇을하려고하는지 완전히 명확하지 않다는 것을 인정해야하지만, 사라져야한다. 그렇기 때문에 다른 문제가있을 수 있습니다.

+0

답변 해 주셔서 감사합니다. gestureRecognizers에 대한 위임 프로토콜에서 해당 기능을 찾지 못했지만 작동했습니다 (아마도 슈퍼 클래스에 대한 참조 일 수 있습니다). –

+2

'touchesCancelled'와 그 패밀리는'UIResponder'에 속하므로 스크롤 뷰 파생 클래스에 이미 정의되어 있습니다. 당신은 이미 할 수 있듯이, 물론, 그들을 오버라이드 할 수 있습니다 ... – sergio

관련 문제