4

UIPanGestureRecognizer を使用して、ユーザーが画面上で UIImageView をドラッグできるプログラムを作成しようとしています。私はいくつかの異なる方法を試しましたが、それを理解できません。送信者/要求者を作成する必要があるかどうかわかりません。私の理解では、ジェスチャーを処理できる UIView に UIImageView を配置する必要があります。私のプログラムには、View Controller - AdvancedViewController1 があります。AdvancedView1 という名前の UIView を作成しました。インターフェイス Builder で、AdvancedView1 を AdvancedViewController 1 に挿入しました。以下は、コントローラー.h.mビューのファイルです。関連するコードのみを含めました。私が近いかどうか、そしてコードを修正する方法を教えてください。よろしくお願いします。

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 では、IBOutlet を AdvancedView1 にリンクして UIView にリンクし、option1 を移動できるようにしたい UIImageView にリンクしました。

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];
}
4

1 に答える 1

12

pan: セレクターで 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]ビューを開始するときにオンにするだけです。

于 2010-12-23T18:31:38.077 に答える