Мне любопытно относительно 'надлежащего' метода для достижения следующей функциональности с помощью Quarts2D:
Я хочу иметь представление и смочь добавить круг в любой координате. Как только я добавляю круг, он должен расшириться на предопределенном уровне; я также хотел бы повторить этот процесс и иметь число если эти расширяющиеся круги.
Думайте ракетная команда:
Обычно, если я писал это в C++ с помощью SDL или некоторой другой графической библиотеки, я был бы:
Имейте класс для представления 'растущего круга', Имеют вектор/массив для содержания указателей на все 'растущие круги', я создаю.
Все диаметры кругов были бы увеличены каждая галочка, и в моем renderloop я выполню итерации списка и нарисую соответствующие круги к моему буферу.
Это, однако, кажется, не соответствует хорошо тому, как я обычно использовал представления в предыдущей разработке iPhone.
Таким образом, я предполагаю, что это довольно открыто, но существует ли 'корректный' путь к чему-то вроде этого?
Это было бы в игровом стиле цикла (как описано выше), или я должен разделять на подклассы UIView
для 'кругового' объекта и переопределения drawRect
? Я предполагаю, что должен был бы затем добавить каждый круг путем создания представления и добавления его к моему основному представлению?
Первоначальное расследование также принесло мне через ссылки на класс CAShapeLayer, хотя я предполагаю, что это могло бы быть почти таким же как реализация UIView разделение на подклассы техники.
Вот один из способов сделать это. Добавьте следующий код в подкласс UIViewController, и вы получите круг, который растет, а затем исчезает, куда бы вы ни коснулись:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self addGrowingCircleAtPoint:[[touches anyObject] locationInView:self.view]];
}
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
if (flag && [[anim valueForKey:@"name"] isEqual:@"grow"]) {
// when the grow animation is complete, we fade the layer
CALayer* lyr = [anim valueForKey:@"layer"];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.fromValue = [lyr valueForKey:@"opacity"];
animation.toValue = [NSNumber numberWithFloat:0.f];
animation.duration = .5f;
animation.delegate = self;
lyr.opacity = 0.f;
[animation setValue:@"fade" forKey:@"name"];
[animation setValue:lyr forKey:@"layer"];
[lyr addAnimation:animation forKey:@"opacity"];
} else if (flag && [[anim valueForKey:@"name"] isEqual:@"fade"]) {
// when the fade animation is complete, we remove the layer
CALayer* lyr = [anim valueForKey:@"layer"];
[lyr removeFromSuperlayer];
[lyr release];
}
}
- (void)addGrowingCircleAtPoint:(CGPoint)point {
// create a circle path
CGMutablePathRef circlePath = CGPathCreateMutable();
CGPathAddArc(circlePath, NULL, 0.f, 0.f, 20.f, 0.f, (float)2.f*M_PI, true);
// create a shape layer
CAShapeLayer* lyr = [[CAShapeLayer alloc] init];
lyr.path = circlePath;
// don't leak, please
CGPathRelease(circlePath);
lyr.delegate = self;
// set up the attributes of the shape layer and add it to our view's layer
lyr.fillColor = [[UIColor redColor] CGColor];
lyr.position = point;
lyr.anchorPoint = CGPointMake(.5f, .5f);
[self.view.layer addSublayer:lyr];
// set up the growing animation
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
animation.fromValue = [lyr valueForKey:@"transform"];
// this will actually grow the circle into an oval
CATransform3D t = CATransform3DMakeScale(6.f, 4.f, 1.f);
animation.toValue = [NSValue valueWithCATransform3D:t];
animation.duration = 2.f;
animation.delegate = self;
lyr.transform = t;
[animation setValue:@"grow" forKey:@"name"];
[animation setValue:lyr forKey:@"layer"];
[lyr addAnimation:animation forKey:@"transform"];
}