1

私は現在XCodeで遊んでいますが、Objective-C / Cocoa Touchなどの経験がないので、これがひどく初歩的な質問である場合は我慢してください。私は何日もグーグルに答えを試みてきて、行き止まりに飽きてきたので、皆さんにだけ尋ねます。

水平方向にパンするメニューを作成しようとしています。

私は現在、にアタッチされてUILabelsいるマスターUIViewオブジェクト内に3を保持していUIPanGestureRecognizerます。

handlePanメソッドを使用して、ユーザーのパンジェスチャに従って* menuview オブジェクトを受信および変換しましたが、要素を前後にスナップする場所を計算するために、 PanGestureがリリースされたときにの中心座標を見つける必要があります。UIViewUIViewUIView

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:self.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 150);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];

if(recognizer.state == UIGestureRecognizerStateEnded)
{
    if(recognizer.view.center.x >= 576);{
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5];
        menuview.transform = CGAffineTransformMakeTranslation((764 - menuview.center.x), 0);
        [UIView commitAnimations];

    }

    if(recognizer.view.center.x && menuview.center.x >= 264);{
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5];
        menuview.transform = CGAffineTransformMakeTranslation((406 - menuview.center.x), 0);
        [UIView commitAnimations];

    }

    if(recognizer.view.center.x < 264);{
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5];
        menuview.transform = CGAffineTransformMakeTranslation((122 - menuview.center.x), 0);
        [UIView commitAnimations];

    }

}

}

UIViewユーザーがを離したときの中心がどこにあるかに応じて、x軸上の3つのポイントの1つにスナップしようとしていたことがわかりますPanGesture

現時点では、「recognizer.view.center.x」ifステートメントを無視しているように動作しています。リリースされた場所に関係なく、x = 122(122 --menuview.center.x)にスナップします。

私はこれらのifステートメントを次のように試しました:

if(menuview.center.x >= 576);{... 

などですが、それも失敗します。

UIViewsユーザーがリリースしたときの現在の位置に基づいてアクションを作成するには、これらのifステートメントに何を入力する必要がありますPanGestureか?

ありがとう、

クリス

4

3 に答える 3

2

これは私が使用するものです、うまくいけばそれはあなたを助けるでしょう:

.h

#import <QuartzCore/QuartzCore.h>

これらの2つのフロートをデルケア

float firstX;
float firstY;

.m

-(void)moveHorizontallyAndVertically:(id)sender {
[[[(UITapGestureRecognizer*)sender view] layer] removeAllAnimations];

//  [self.view bringSubviewToFront:[(UIPanGestureRecognizer*)sender view]];
CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view];
if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {
    firstX = [myView center].x;
    firstY = [myView center].y;


}

translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y);

[myView setCenter:translatedPoint];

if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
    CGFloat finalX = translatedPoint.x + (0.0*[(UIPanGestureRecognizer*)sender velocityInView:self.view].x);
    CGFloat finalY = translatedPoint.y + (0.0*[(UIPanGestureRecognizer*)sender velocityInView:self.view].y);
    if(finalX < 0) {
        finalX = 0;
    }
    else if(finalX > 320) {
        finalX = 320;
    }
    if(finalY < 0) {
        finalY = 0;
    }
    else if(finalY > 480) {
        finalY = 480;
    }
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    [myView setCenter:CGPointMake(finalX, finalY)];
    [UIView commitAnimations];
}

}

于 2012-08-07T01:14:56.527 に答える
0

これは、アニメーションブロックでCGRectMakeを使用して新しいフレームを設定するだけでも実行できました。UIGestureRecognizerStateEndedでも行われます

[UIView animateWithDuration:0.1f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{ 
                               NSLog(@"before: %@",NSStringFromCGPoint(piece.center));
                               piece.frame = CGRectMake(targImgView.frame.origin.x,
                               targImgView.frame.origin.y,                                                                                      
                               targImgView.frame.size.width,
                               targImgView.frame.size.height);                                                                      
                               NSLog(@"after: %@",NSStringFromCGPoint(piece.center));
                              } 
                  completion:nil];
于 2013-12-29T05:33:17.377 に答える
0

これはすべて、InterfaceBuilderとAutolayoutを使用して可能です。これを行うために使用したコードは次のとおりです。

@property (weak,nonatomic) IBOutlet NSLayoutConstraint *buttonXConstraint;  
@property (weak,nonatomic) IBOutlet NSLayoutConstraint *buttonYConstraint;  

次に、それらIBOutletsをInterfaceBuilderのHorizo​​ntalConstraint(X Position)とVertical Constraint(Y Position)に接続します。制約が最も近いビューではなく、ベースビューに接続されていることを確認してください。

パンジェスチャをフックし、次のコードを使用してオブジェクトをドラッグします。

- (IBAction)panPlayButton:(UIPanGestureRecognizer *)sender
{
  if(sender.state == UIGestureRecognizerStateBegan){

  } else if(sender.state == UIGestureRecognizerStateChanged){
     CGPoint translation = [sender translationInView:self.view];

     //Update the constraint's constant
     self.buttonXConstraint.constant += translation.x;
     self.buttonYConstraint.constant += translation.y;

     // Assign the frame's position only for checking it's fully on the screen
     CGRect recognizerFrame = sender.view.frame;
     recognizerFrame.origin.x = self.buttonXConstraint.constant;
     recognizerFrame.origin.y = self.buttonYConstraint.constant;

     // Check if UIImageView is completely inside its superView
     if(!CGRectContainsRect(self.view.bounds, recognizerFrame)) {
         if (self.buttonYConstraint.constant < CGRectGetMinY(self.view.bounds)) {
             self.buttonYConstraint.constant = 0;
         } else if (self.buttonYConstraint.constant + CGRectGetHeight(recognizerFrame) > CGRectGetHeight(self.view.bounds)) {
             self.buttonYConstraint.constant = CGRectGetHeight(self.view.bounds) - CGRectGetHeight(recognizerFrame);
         }

         if (self.buttonXConstraint.constant < CGRectGetMinX(self.view.bounds)) {
             self.buttonXConstraint.constant = 0;
         } else if (self.buttonXConstraint.constant + CGRectGetWidth(recognizerFrame) > CGRectGetWidth(self.view.bounds)) {
             self.buttonXConstraint.constant = CGRectGetWidth(self.view.bounds) - CGRectGetWidth(recognizerFrame);
         }
     }

     //Layout the View
     [self.view layoutIfNeeded];
 } else if(sender.state == UIGestureRecognizerStateEnded){
于 2014-03-20T16:05:11.743 に答える