2017-02-23 9 views
0

私はプログラムで作成したUIButtonを持っています。実際にはそれはUIButtonでなければならない、私はちょうどイメージの上のある領域をマークする可能性を持つ必要がある。UIButton - 移動とスケール

私はそれが必要な機能 - オブジェクトを移動し、サイズを変更します。これには2つの方法があります:

- (void) objMove:(id) sender withEvent:(UIEvent *) event 
{ 
UIControl *control = sender; 
UITouch *t = [[event allTouches] anyObject]; 
CGPoint pPrev = [t previousLocationInView:control]; 
CGPoint p = [t locationInView:control]; 
CGPoint center = control.center; 
center.x += p.x - pPrev.x; 
center.y += p.y - pPrev.y; 
control.center = center; 
} 

- (void)objScale:(UIPinchGestureRecognizer *)recognizer 
{ 
UIView *pinchView = recognizer.view; 
CGRect bounds = pinchView.bounds; 
CGPoint pinchCenter = [recognizer locationInView:pinchView]; 
pinchCenter.x -= CGRectGetMidX(bounds); 
pinchCenter.y -= CGRectGetMidY(bounds); 
CGAffineTransform transform = pinchView.transform; 
transform = CGAffineTransformTranslate(transform, pinchCenter.x, pinchCenter.y); 
CGFloat scale = recognizer.scale; 
transform = CGAffineTransformScale(transform, scale, scale); 
transform = CGAffineTransformTranslate(transform, -pinchCenter.x, -pinchCenter.y); 
pinchView.transform = transform; 
recognizer.scale = 1.0; 
} 

スケールが正常に機能します。オブジェクトのサイズを変更するまでは動きがよく見える - オブジェクトを増やすと指よりも動きが遅くなり、逆も同じ場合は元のサイズよりも小さいオブジェクトが指よりも速く動く。なぜこのように機能するのですか?

+1

サイズ変更後にボタンサイズを更新しようとしましたか?彼はそれを移動しようとすると古いサイズに応答している可能性があります。 –

+0

@Ricardo Alves、私はこのようなスムージーを試しました。 'pinchView.frame = CGRectMake(bounds.origin.x、bounds.origin.y、bounds.origin.x + bounds.size.width、bounds.origin.y + bounds.size.height); 'objScale'で、スケールを壊します=( – user5599807

答えて

2

私はあなたが多分それは動作しますが、このようにコードを変更し

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 
// get startPoint and startCenter here 
} 

- (void) objMove:(id) sender withEvent:(UIEvent *) event 
{ 
UIControl *control = sender; 
UITouch *t = [[event allTouches] anyObject]; 
CGPoint p = [t locationInView:control]; 
startCenter.x += p.x - startPoint.x; 
startCenter.y += p.y - startPoint.y; 
control.center = startCenter; 
} 
ににstartPointとstartCenterを得るべきだと思います。

現在のセンターは現在のセンター、pは現在のポイント、pPrevは前のポイントです。 現在のセンターが以前のポイントを移動したサイズが正しくありません。 動的距離ではなく、相対距離を取得する必要があります。

関連する問題