2010-12-23 6 views
4

사용자가 UIPanGestureRecognizer를 사용하여 UIImageView를 화면 주위로 끌 수있는 프로그램을 만들려고합니다. 나는 몇 가지 다른 방법을 시도했지만 그것을 알아낼 수 없습니다. 보낸 사람/요청자를 만들어야하는지 잘 모르겠습니다. 내 이해 UIImageView 제스처를 처리 할 수있는 UIView에 배치해야합니다. 내 프로그램에는 View Controller-AdvancedViewController1이 있습니다. AdvancedView1이라는 UIView를 만들었습니다. Interface Builder에서 AdvancedViewController에 AdvancedView1을 삽입했습니다. 1. 다음은 컨트롤러 및 뷰에 대한 .h.m 파일입니다. 관련된 코드 만 포함 시켰습니다. 내가 가깝고 내 코드를 수정하는 방법을 알려주십시오. 귀하의 도움에 미리 감사드립니다.UIPanGestureRecognizer를 사용하여 UIImageView를 이동할 수 없습니다.

AdvancedViewController1.h 
#import <UIKit/UIKit.h> 
#import "AdvancedView1.h" 
@interface AdvancedViewController1 : UIViewController { 
UIWindow *window; 
AdvancedView1 *advancedView1; 
UIImageView * option1; 
} 
@property (retain) IBOutlet AdvancedView1 *advancedView1; 
@property (retain) IBOutlet UIImageView *option1; 
@end 

는 IB에서 나는 움직일 수 할있는 UIImageView에있는 UIView 및 옵션 1에 AdvancedView1에 함께 IBOutlet을 연결했다.

AdvancedViewController.m 

#import "AdvancedViewController1.h" 
#import "AdvancedView1.h" 
@implementation AdvancedViewController1 
@synthesize advancedView1; 
@synthesize option1 

- (void)viewDidLoad { 
UIGestureRecognizer *pangr = [[UIPanGestureRecognizer alloc]  initWithTarget:self.advancedView1 action:@selector(pan:)]; 
pangr.delegate = self; 
[self.advancedView1 addGestureRecognizer:pangr]; 
[pangr release];  
[super viewDidLoad]; 
} 

AdvancedView1.h 

#import <UIKit/UIKit.h> 
#import "AdvancedViewController1.h" 
@class AdvancedView1; 
@interface AdvancedView1 : UIView{ 
CGPoint* origin; 
} 
@property (nonatomic) CGPoint* origin; 
@end 

AdvancedView1.m 
#import "AdvancedView1.h" 
#import "AdvancedViewController1.h" 
@implementation AdvancedView1; 
@synthesize origin; 

- (void)pan:(UIPanGestureRecognizer *) gesture 
{ 
if ((gesture.state == UIGestureRecognizerStateChanged) || 
(gesture.state == UIGestureRecognizerStateEnded)) { 

CGPoint translation = [gesture translationInView:self]; 
gesture.origin = CGPointMake(gesture.origin.x+translation.x,  gesture.origin.y+translation.y); 
[gesture setTranslation:CGPointZero inView:self]; 
} 

답변

12

실제로 팬 : 선택기에서 UIView의 위치를 ​​설정해야합니다. 그리고 그것의 외부가 아닌 AdvancedView 클래스 내에서 수행하기 때문에 위치 업데이트가 상위 뷰 (포함)에 상대적이기 때문에 뷰의 상위 뷰 ([self superview])를 가져와야합니다. 이 시도 :

- (void)pan:(UIPanGestureRecognizer *)gesture 
{ 
    if ((gesture.state == UIGestureRecognizerStateChanged) || 
     (gesture.state == UIGestureRecognizerStateEnded)) { 

    CGPoint location = [gesture locationInView:[self superview]]; 

    [self setCenter:location]; 
    } 
} 

당신이 당신의 서브 클래스보기가 사용자 상호 작용 또는 제스처 인식기가 작동하지 않습니다 수 있는지 확인해야합니다 유의하십시오. 보기를 초기화 할 때 [self setUserInteractionEnabled:YES]으로 설정하면됩니다.

+0

응답 해 주셔서 감사합니다. 가까이 가고 있지만 몇 가지 질문이 있습니다. 터치했을 때 UIView가 패닝되지만 팬 제스처를 끝내면 뷰가 사라집니다. 왜 그런가? 또한, 내가 뭘하려고 UIView 내에서 UIImageView 허용 이동,하지만 지금은이 코드로 전체 UIView 이동합니다. 이것이 가능한가? 또는 여러 UIView를 만들어 각 이미지를 이동할 수 있도록 각각 하나의 이미지를 넣어야합니까? – JulianF

+0

bravo는'[self setUserInteractionEnabled : YES]'경고를 추가합니다. 나는 내가 추측하고있는 약간의 시간을 구했다. – NSTJ

관련 문제