C4:向“self”以外的对象添加平移

时间:2013-10-07 19:24:45

标签: panning c4

我观看了C4教程,向对象添加了一个平移手势,并在平移完成时将其设置为动画以返回其原始位置。我正在尝试将其添加到三个单独的对象中。到目前为止,我已经使用了一个对象来移动它并将其重置为CGPoint,但为了使其工作,我必须将平移手势添加到“自身”,而不是对象。作为参考,我几乎使用了这里的代码:

http://www.c4ios.com/tutorials/interactionPanning

如果我将手势添加到对象本身,当然,它会平移,但它会将自己留在最后一个触摸位置。但是,我假设将手势放在“自我”上不仅会影响我想要移动的对象,而且我希望能够单独移动这三个对象。


我使用与示例中使用的“move”方法大致相同的修改:

-(void)move:(UIPanGestureRecognizer *)recognizer { 
    [character move:recognizer]; 
    if (recognizer.state == UIGestureRecognizerStateEnded) { 
        [character setCenter: charStartOrigin]; 
    } 
} 

然后生成对象的新方法:

-(void)createCharacters { 
    character = [C4Shape ellipse:charStart]; 
    [character addGesture:PAN name:@"pan" action:@"move:"]; 
    [self.canvas addShape:character]; 
}

1 个答案:

答案 0 :(得分:1)

您正在使用的示例链接是偷偷摸摸的。因为我知道画布上只有一个物体,所以我知道我可以让它看起来像是在淘汰标签。这对于多个对象不起作用,正如您已经想到的那样。

要让不同的对象独立移动,并识别拖动它们的时间,您需要子类化对象并为它们提供自己的“能力”。

要做到这一点我:

  1. 子类C4Shape
  2. 向新班级添加自定义行为
  3. 在画布上创建子类对象
  4. 每个步骤的代码如下所示:

    子类

    你必须创建一个给自己一些行为的子类。既然你正在使用形状,我也是这样做的。我调用我的子类Character,其文件如下所示:

    Character.h

    #import "C4Shape.h"
    
    @interface Character : C4Shape
    @property (readwrite, atomic) CGPoint startOrigin;
    @end
    

    我在形状中添加了一个属性,以便我可以设置它的起始原点(即它将返回的点)。

    Character.m

    #import "Character.h"
    
    @implementation Character
    
    -(void)setup {
        [self addGesture:PAN name:@"pan" action:@"move:"];
    }
    
    -(void)move:(UIGestureRecognizer *)sender {
        if(sender.state == UIGestureRecognizerStateEnded) {
            self.center = self.startOrigin;
        } else {
            [super move:sender];
        }
    }
    
    @end
    

    在C4对象的子类中,setup的调用方式与对画布的调用方式相同......所以,这是我为此对象添加手势的地方。设置在newalloc / init被调用后运行。

    我希望使用自定义行为覆盖move:方法。在这个方法中我抓住了手势识别器,如果它的状态是UIGestureRecognizerStateEnded,那么我想要动画回到起始原点。否则,我希望move:喜欢它,所以我只需调用运行默认[super move:sender]方法的move:

    这就是子类。

    创建子类对象

    我的工作区如下所示:

    #import "C4WorkSpace.h"
    //1
    #import "Character.h"
    
    @implementation C4WorkSpace {
        //2
        Character *charA, *charB, *charC;
    }
    
    -(void)setup {
        //3
        CGRect frame = CGRectMake(0, 0, 100, 100);
    
        //4
        frame.origin = CGPointMake(self.canvas.width / 4 - 50, self.canvas.center.y - 50);
        charA = [self createCharacter:frame];
        frame.origin.x += self.canvas.width / 4.0f;
        charB = [self createCharacter:frame];
        frame.origin.x += self.canvas.width / 4.0f;
        charC = [self createCharacter:frame];
    
        //5
        [self.canvas addObjects:@[charA,charB,charC]];
    }
    
    -(Character *)createCharacter:(CGRect)frame {
        Character *c = [Character new];
        [c ellipse:frame];
        c.startOrigin = c.center;
        c.animationDuration = 0.25f;
        return c;
    }
    
    @end
    

    我在工作区中添加了一个方法,用于创建Character对象并将其添加到屏幕上。这个方法通过调用它的Character方法创建一个new对象(我必须这样做,因为它是C4Shape的子类),把它变成一个椭圆形,带有我给出的框架设置其startOrigin,更改其animationDuration

    工作区的其余部分发生了什么(注意:步骤在上面的代码中标记):

    1. #import子类,以便我可以用它创建对象
    2. 我创建了3个对象对象的引用。
    3. 我创建了一个框架,用于构建每个新对象
    4. 对于每个对象,我通过更改其原点来重新定位frame,然后使用它来创建一个使用我编写的createCharacter:方法的新对象。
    5. 我将所有新对象添加到canvas
    6. 注意:因为我使用startOrigin属性创建了我的子类,所以我可以在该类中始终动画回到该点。我也可以随时在画布上设置这一点。