NSImageView надеется, когда из местоположения при попытке повернуть. Как это остановить?
Я вращаю NSImageView из его центра, который работает отлично, однако, когда я запускаю анимацию, NSImageView переходит от своего местоположения к случайному месту. Я не знаю, почему это происходит. Пожалуйста помоги.
Я разрабатываю, как я все это делаю. Также я предоставляю ссылку на Github, чтобы вы могли запустить ее, если хотите.
Код:
// on button press animation will be started
-(void)buttonPressed:(id)sender{
// setting the anchor point of the view
_img.layer.anchorPoint = CGPointMake(0.5f, 0.5f);
// calling the animation function
[self startRefreshAnimation];
}
// in order to repeate the animation
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
[self startRefreshAnimation];
}
// the function that will handel all the animation stuff
-(void)startRefreshAnimation {
CABasicAnimation *anim2 = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
anim2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
NSNumber* toValue = [NSNumber numberWithFloat:0 * (M_PI / 180.0f)];
NSNumber* fromValue = [NSNumber numberWithFloat:(360.0f) * (M_PI / 180.0f)];
anim2.fromValue = toValue;
anim2.toValue = fromValue;
anim2.duration = 1.0f;
anim2.delegate = self;
[_img.layer addAnimation:anim2 forKey:@"transform"];
}
3 ответа
Код выглядит хорошо для меня для задачи анимации, которую вы требуете. Просто переместите строку anchorPoint, вот так:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
_img.layer.anchorPoint = CGPointMake(0.5f, 0.5f);
}
РЕДАКТИРОВАТЬ: в основном, положение слоя определяется с точки зрения местоположения anchorPoint слоя. Когда вы устанавливаете положение слоя, вы затем устанавливаете положение центра слоя в системе координат его суперслоя. Поскольку положение относительно точки привязки слоя, изменение этой точки привязки при сохранении той же позиции перемещает слой. Итак, вам нужно будет установить anchorPoint перед рендерингом подпредставления.
Также, для бесконечного повтора, вы можете избежать написания метода animationDidStop, используя это свойство:
anim2.repeatCount = HUGE_VALF;
Установите привязку слоя так, чтобы он вращался вокруг правильного центра, затем немедленно переместите его, чтобы учесть новую точку привязки (в противном случае он изменит свое положение):
let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotateAnimation.toValue = CGFloat(-M_PI * 2.0)
rotateAnimation.duration = 1.0
viewToRotate.layer?.anchorPoint = CGPoint(x: 0.5, y: 0.5)
viewToRotate.layer?.position = viewToRotate.center
viewToRotate.layer?.addAnimation(rotateAnimation, forKey: nil)
С...
extension NSView {
var center: CGPoint {
get {
return CGPointMake(NSMidX(self.frame), NSMidY(self.frame))
}
}
Вам необходимо установить положение слоя в окне просмотра изображений. Добавьте это в метод buttonPressed:
//Position of the imgView
CGRect frame = _img.layer.frame;
float xCoord = frame.origin.x + frame.size.width;
float yCoord = frame.origin.y + frame.size.height;
CGPoint myPoint = CGPointMake(xCoord, yCoord);
_img.layer.position = myPoint;
[self startRefreshAnimation]
таким образом, вы можете перемещать imageView в.xib, и анимация будет происходить в правильном месте.
Редактировать: решение @Nishant намного красивее..