2

を使用して垂直方向に変換される UIView があります

currentView.layer.affineTransform = CATransform3DGetAffineTransform(CATransform3DConcat(currentView.layer.transform,CATransform3DMakeRotation(M_PI, 1.0, 0.0, 0.0f)));

ここで、タッチを使用してこの UIView をある場所から別の場所に移動する必要があります。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

}

しかし、私は変換を維持することができません。どうすればこれを達成できますか?

基本的に、次の呼び出しを使用して UIView にいくつかの UI 要素を追加しました

-(void)AddItemOnView:(UIView*)aView
               Angle:(CGFloat)aDegree
             XOrigin:(CGFloat)aXOrigin
             YOrigin:(CGFloat)aYOrigin
               Width:(CGFloat)aWidth
              Height:(CGFloat)aHeight
               FlipX:(CGFloat)aFlipHorrizontal
               FlipY:(CGFloat)aFlipVerticle
{
    UIView* currentView = aView;
    if(currentView)
    {
        CGFloat angle = aDegree;
        CGFloat flipHorrizontal = aFlipHorrizontal;
        CGFloat flipVerticle = aFlipVerticle;
        CGFloat xOrigin = aXOrigin;
        CGFloat yOrigin = aYOrigin;
        CGFloat width = aWidth;
        CGFloat height = aHeight;

        currentView.layer.anchorPoint = CGPointMake(0.0f, 0.0f);
        currentView.frame = CGRectIntegral(CGRectMake(0, 0, width, height));

        /* Flip The View Horrizontly*/
        if(flipHorrizontal < 0)
        {
            /* Concat With previous Layer Operation */

            currentView.layer.affineTransform = CATransform3DGetAffineTransform(CATransform3DConcat(currentView.layer.transform,CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0f)));

            /* Need to set anchor point ==> Top Right Corner */
            currentView.layer.anchorPoint = CGPointMake(1.0f, 0.0f);

        }

        /* Flip The View Verticaly*/
        if(flipVerticle < 0)
        {
            /* Concat With previous Layer Operation */

            currentView.layer.affineTransform = CATransform3DGetAffineTransform(CATransform3DConcat(currentView.layer.transform,CATransform3DMakeRotation(M_PI, 1.0, 0.0, 0.0f)));

            if(flipHorrizontal < 0)
            {
                /* This needs to set as we have already done flip X */

                /* Need to set anchor point ==> Bottom Right Corner */
                currentView.layer.anchorPoint = CGPointMake(1.0f, 1.0f);
            }
            else
            {
                /* Need to set anchor point ==> Bottom Left Corner */
                currentView.layer.anchorPoint = CGPointMake(0.0f, 1.0f);
            }

        }

        /* Perform Rotation */
        if(angle != 0)
        {
            /* Concat With previous Layer Operation */

            currentView.layer.affineTransform = CATransform3DGetAffineTransform(CATransform3DConcat(currentView.layer.transform,CATransform3DMakeRotation(DegreesToRadians(angle), 0, 0, 1.0)));

            if(flipHorrizontal < 0 || flipVerticle < 0)
            {
                /* Countinue with previous anchor point */
            }
            else
            {
                /* Need to set anchor point ==> Top Left Corner */
                currentView.layer.anchorPoint = CGPointMake(0.0f, 0.0f);
            }

        }

        /* Set Origins of View */
        currentView.layer.position = CGPointMake(xOrigin, yOrigin);
        [self addSubview:currentView];
    }

}

今、これらの追加されたUIViewを変換して移動しようとしています。

4

1 に答える 1

4

「私は変換を維持することができません」とはどういう意味かわかりませんとにかく、ここでは少し異なるアプローチが役立つと思います。

まず、「Identity」変換以外の変換をビューに適用すると、frameプロパティは無意味になります。originこれは、そのメンバーを使用してビューの位置を変更できないことを意味します。代わりにビューのcenterプロパティを使用する必要があります。

また、ドラッグについてUIPanGestureRecognizerは、メソッドの代わりにa を使用することを強くお勧めしますtouches...。これは、ジェスチャ レコグナイザーが状態を維持し、物をドラッグするのが非常に簡単だからです。

コード例を次に示します。

// Create your view and apply all the transforms you want
// --code here--

// Create and assign the UIPanGestureRecognizer
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panDetected:)];
[self.currentView addGestureRecognizer:panGesture];

// Here is where the dragging happens
-(void)panDetected:(UIPanGestureRecognizer*)panGesture {

    // Get the view that detected the gesture
    UIView *view = panGesture.view;

    // If dragging started or changed...
    if (panGesture.state == UIGestureRecognizerStateBegan || panGesture.state == UIGestureRecognizerStateChanged) {

        // Get the translation in superview coordinates
        CGPoint translation = [panGesture translationInView:view.superview];

        // Get your view's center
        CGPoint viewCenter = view.center;

        // Add the delta 
        viewCenter.x += translation.x;
        viewCenter.y += translation.y;
        view.center = viewCenter;

        // Reset delta from the gesture recognizer
        [panGesture setTranslation:CGPointZero inView:view.superview];
    }
}

回転変換を持つビューを使用して、私のプロジェクトでこのコードをテストしましたが、完全に機能します。

お役に立てれば!

于 2013-10-28T19:27:37.243 に答える