Panning C4:将平移添加到除“平移”以外的对象;“自我”;

Panning C4:将平移添加到除“平移”以外的对象;“自我”;,panning,c4,Panning,C4,我观看了C4教程,内容是向对象添加平移手势,并在平移完成后设置动画使其返回原始位置。我试图将其添加到三个单独的对象中。到目前为止,我让它使用一个对象来移动它并将其重置为一个CG点,但是为了使它工作,我必须将平移手势添加到“自我”,而不是对象。作为参考,我基本上使用了以下代码: 如果我将手势添加到对象本身,当然,它会四处平移,但它只会在最后一次触摸的位置离开自己。然而,我假设,将手势保留在“self”上不仅会影响我想要移动的对象,而且我希望能够单独移动这三个对象 我对示例中使用的“move”方

我观看了C4教程,内容是向对象添加平移手势,并在平移完成后设置动画使其返回原始位置。我试图将其添加到三个单独的对象中。到目前为止,我让它使用一个对象来移动它并将其重置为一个CG点,但是为了使它工作,我必须将平移手势添加到“自我”,而不是对象。作为参考,我基本上使用了以下代码:

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



我对示例中使用的“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]; 
}

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

要使不同的对象独立移动,并识别它们何时被拖动,您需要对对象进行子类化,并赋予它们自己的“能力”

为此,我:

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

    #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
    ,其文件如下所示:

    字符.h

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

    性格

    在C4对象的子类中,
    setup
    以与画布相同的方式被调用。。。这就是我为这个物体添加手势的地方。调用
    new
    alloc
    /
    init
    后运行安装程序

    move:
    方法是我想用自定义行为覆盖的地方。在这个方法中,我捕捉手势识别器,如果它的状态是
    uigestureRecognitzerStateEnded
    ,那么我希望动画回到起始原点。否则,我希望它像应该的那样
    移动:
    ,因此我只需调用运行默认
    移动:
    方法的
    [super move:sender]

    子类就是这样

    创建子类对象 我的工作区如下所示:

    #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
    
    我已经在我的工作区中添加了一个方法,该方法创建了一个
    字符
    对象并将其添加到屏幕上。此方法通过调用其
    新方法创建
    角色
    对象(我必须这样做,因为它是
    C4Shape
    的子类),使用我给它的帧将它变成椭圆,设置它的
    startOrigin
    ,更改它的
    动画持续时间

    工作区其余部分的情况如下(注意:上述代码中标记了这些步骤):

  • 我导入子类,这样我就可以用它创建对象了
  • 我创建了3个对角色对象的引用
  • 我将创建一个框架,用于构建每个新对象
  • 对于每个对象,我通过更改其原点重新定位
    frame
    ,然后使用我编写的
    createCharacter:
    方法创建一个新对象
  • 我将所有新对象添加到
    画布

  • 注意:因为我用一个
    startOrigin
    属性创建了我的子类,所以我能够在该类中始终将动画设置回该点。我还可以随时从画布上设置该点。

    如果你能发布你正在使用的代码,那么我可以更直接地提供帮助。我对示例中使用的“move”方法进行了大致相同的修改:-(void)move:(uipangestureerecognizer*)recognizer{[character move:recognizer];If(recognizer.state==UIgestureRecognitizerStateEnded){[character setCenter:charStartOrigin];}}}然后是生成对象的新方法:-(void)createCharacters{character=[C4Shape ellipse:charStart];[character add手势:平移名称:@“平移”操作:@“移动:”;[self.canvas addShape:character];}注意,我是如何将手势添加到子类中的
    self
    的?在本例中,它表示
    字符
    对象,而不是画布。C4(和ObjC)中的所有子类可以将自己称为
    self
    。谢谢,这很好用!不过仅供将来参考,因为我来自Java背景-底部的方法本质上是类的“构造函数”,是吗?当您从C4Shape(C4Object)继承时与NSObject相比,“构造函数”实现是否需要写入工作区而不是.m文件中?再次感谢!在C4/ObjC中,构造函数是以单词
    init
    开头的方法。基本的init方法是:
    -(id)init{…}
    ,因此创建字符的方法在技术上不是构造函数。
    [character new]
    方法只是包装
    [[character alloc]init];
    …这“本质上”是
    字符
    类的构造函数。
    #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