Почему презентация слоя представления не работает правильно для меня? - PullRequest
2 голосов
/ 09 декабря 2010

Я хочу получить позицию представления во время его анимации и перемещения из одной позиции в другую. Я пытался использовать presentationLayer, чтобы получить информацию о местоположении действия, и попытался распечатать местоположение, когда UIView движется.

Вот что печатает:

2010-12-08 16:56:50.496 Exp[31219:207] point: NSPoint: {45, 45}</p> <p>2010-12-08 16:56:50.696 Exp[31219:207] point: NSPoint: {45, 45}</p> <p>2010-12-08 16:56:50.896 Exp[31219:207] point: NSPoint: {45, 45}</p> <p>2010-12-08 16:56:51.096 Exp[31219:207] point: NSPoint: {45, 45}</p> <p>2010-12-08 16:56:51.296 Exp[31219:207] point: NSPoint: {45, 45}</p> <p>2010-12-08 16:56:51.496 Exp[31219:207] point: NSPoint: {245, 245} <<----------------------------------------</p> <p>2010-12-08 16:56:51.696 Exp[31219:207] point: NSPoint: {245, 245}</p> <p>2010-12-08 16:56:51.896 Exp[31219:207] point: NSPoint: {245, 245}</p> <p>2010-12-08 16:56:52.096 Exp[31219:207] point: NSPoint: {245, 245}

обратите внимание на стрелку, конечная точка распечатывается напрямую, без указания точек на пути. Кто-нибудь может помочь?

ниже мой код:

Вот как это печатается:

-(void)print</p> <p>{ NSLog([NSMutableString stringWithFormat:@"point: %@",[NSValue valueWithCGPoint:((CALayer *)[bomb.layer presentationLayer]).position]]);<br> }

Я использовал таймер для многократной распечатки анимированного представления «Бомба»

-(id)initWithCoder:(NSCoder *)aDecoder</p> <p>{ if (self=[super initWithCoder:aDecoder]) {</p> <pre><code> bomb = [[BombView alloc]init]; bomb.frame = CGRectMake(30, 30, 30, 30); bomb.backgroundColor = [UIColor yellowColor]; [self addSubview:bomb]; timer = [NSTimer timerWithTimeInterval:PRINTINTERVAL // defined to be 0.2 target: self selector: @selector(print) userInfo: nil repeats: YES]; [[NSRunLoop currentRunLoop] addTimer:timer forMode: NSDefaultRunLoopMode]; } return self;

}

Вот как это анимировано: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event</p> <p>{</p> <pre><code> CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"position"]; animation.duration = 10.0; animation.delegate = bomb; [bomb.layer addAnimation:animation forKey:@"animatePosition"]; bomb.center = CGPointMake(bomb.center.x+200, bomb.center.y+200);

}

когда я нажимаю, «бомба» будет двигаться, и распечатанная информация должна постепенно меняться. Потому что он движется с такой низкой скоростью в течение 10 секунд.

Движется нормально, но печатается неправильно.

1 Ответ

0 голосов
/ 08 декабря 2011

Это может быть потому, что вы используете NSTimer для печати диагностики. Это будет выполнено, но, возможно, не в потоке main, что даст вам неверные результаты.

Вы можете использовать таймер, но вместо этого он может запустить метод, который, в свою очередь, вызывает другой метод для диагностики. Последнее вы будете выполнять в потоке main, используя performSelectorOnMainThread.

timer = [NSTimer timerWithTimeInterval:PRINTINTERVAL // defined to be 0.2

                                         target: self

                                           selector: @selector(timedPrint)

                                           userInfo: nil

                                            repeats: YES]; 

, то:

- (void)timedPrint
{
[self performSelectorOnMainThread:@selector(print)];
}

В качестве альтернативы, вместо использования currentRunLoop используйте mainRunLoop.

Если это не разрешит запрос, то, возможно, это из-за трех разных уровней в архитектуре Core Animation; модель, презентация и рендеринг. Возможно, что слой рендеринга изменился - как вы можете видеть - но presentationLayer еще не был обновлен.

Есть довольно много связанных вопросов именно по этому вопросу. Например:

Скажет ли мне -presentationLay значения в полете для вида, пока он анимируется?

Почему для тестирования хитов нужно использовать презентационный слой CALayer?

...