Пример ссылки, с которой вы работаете, скрыт. Поскольку я знал, что на холсте будет только один объект, я знал, что могу сделать так, будто я панорамирую этикетку. Это не будет работать для нескольких объектов, как вы уже поняли.
Чтобы разные объекты двигались независимо друг от друга и распознавали, когда они перетаскиваются, вам нужно создать подкласс для объектов и присвоить им собственные «способности».
Для этого я:
- Подкласс
C4Shape
- Добавить пользовательское поведение в новый класс
- Создание подклассов объектов на холсте
Код для каждого шага выглядит следующим образом:
подклассы
Вы должны создать подкласс, который дает себе какое-то поведение. Поскольку вы работаете с фигурами, я тоже сделал это таким образом. Я называю свой подкласс Character
, его файлы выглядят так:
Персонаж.h
#import "C4Shape.h"
@interface Character : C4Shape
@property (readwrite, atomic) CGPoint startOrigin;
@end
Я добавил к фигуре свойство, чтобы установить ее начальную точку (то есть точку, в которую она вернется).
Персонаж.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
вызывается так же, как и для холста... Итак, здесь я добавляю жест для этого объекта. Установка запускается после вызова new
или alloc
/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
.
Вот что происходит с остальной частью рабочего пространства (ПРИМЕЧАНИЕ: шаги отмечены в приведенном выше коде):
- Я
#import
подкласс, чтобы я мог создавать объекты с ним
- Я создаю 3 ссылки на объекты Character.
- Я создаю каркас, который буду использовать для создания каждого из новых объектов.
- Для каждого объекта я перемещаю
frame
, изменяя его происхождение, а затем использую его для создания нового объекта с помощью написанного мной метода createCharacter:
.
- Я добавляю все свои новые объекты в файл
canvas
.
ПРИМЕЧАНИЕ. Поскольку я создал свой подкласс со свойством startOrigin
, я могу в этом классе всегда анимировать к этой точке. Я также могу установить эту точку с холста, когда захочу.
person
C4 - Travis
schedule
07.10.2013