2012-05-08 37 views
10

Điều này phải đơn giản, nhưng tôi gặp sự cố khi xoay UIImageView toàn bộ 360 độ, lặp lại vĩnh viễn.Xoay UIImageView theo chiều kim đồng hồ

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState animations:^{ 
    self.reloadButton.imageView.transform = CGAffineTransformRotate(self.reloadButton.imageView.transform, -M_PI); 
} completion:^(BOOL finished) { 

}]; 

Theo các tài liệu, các signedness của góc tôi vượt qua để CGAffineTransformRotate xác định hướng luân chuyển, nhưng mã trên quay ngược chiều kim đồng. Tương tự với M_PI.

Góc theo radian, theo đó ma trận này xoay trục tọa độ hệ thống. Trong iOS, một giá trị dương xác định ngược chiều kim đồng hồ và giá trị âm xác định xoay theo chiều kim đồng hồ. Trong Mac OS X, giá trị dương xác định xoay theo chiều kim đồng hồ và giá trị âm chỉ định xoay vòng ngược chiều kim đồng hồ.

+0

sẽ xảy ra nếu bạn làm như luân chuyển trên lớp imageViews với một CATransform3D gì? –

+0

bạn có thử xoay các góc khác (180 độ) không? – giorashc

+0

@David Cảm ơn bạn đã đề xuất nhưng điều này tạo ra kết quả tương tự: self.reloadButton.imageView.layer.transform = CATransform3DMakeRotation (-M_PI, 0, 0, 1); – Morrowless

Trả lời

14

Christoph đã đi đúng hướng, nhưng có một cách tốt hơn để giữ cho nó quay mà không reinvoke nó trong hoạt hình đại biểu mỗi khi nó kết thúc. Điều này đơn giản là sai.

Chỉ cần đặt thuộc tính repeatCount của hoạt ảnh của bạn thành HUGE_VALF.

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.fromValue = @0.0f; 
animation.toValue = @(2*M_PI); 
animation.duration = 0.5f;    // this might be too fast 
animation.repeatCount = HUGE_VALF;  // HUGE_VALF is defined in math.h so import it 
[self.reloadButton.imageView.layer addAnimation:animation forKey:@"rotation"]; 

Như đã nêu in the documentation, điều này sẽ khiến hoạt ảnh lặp lại mãi mãi.

+1

Ok, không thực sự nghĩ về nó, bởi vì 270 độ là đủ cho tôi. Đặt số lặp lại là tốt hơn, tôi sẽ thay đổi tương ứng. – Christoph

+1

Cảm ơn bạn đã nhập mã! hoạt động GREAT – eric

+0

Chỉ cần sử dụng 'CGFLOAT_MAX' thay vì nhập nội dung nào đó. –

1

Xin lỗi bỏ lỡ phần đầu tiên, xem quay tốt sử dụng góc nhỏ:

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     redView.transform = CGAffineTransformRotate(redView.transform, M_PI_2); 
    } completion:^(BOOL finished) { 

    }]; 

tôi không thể tìm thấy bất kỳ lời giải thích ý nghĩa tại sao nó không thành công với M_PI.

+0

Lặp lại chính xác những gì tôi muốn, vấn đề là nó không quay theo chiều kim đồng hồ. – Morrowless

+0

Tôi nghĩ rằng vì trạng thái cuối cùng của vòng quay giống như trạng thái ban đầu – giorashc

1

Tôi đã gặp phải vấn đề tương tự cách đây một thời gian. Tôi không nhớ lý do cho vấn đề đó, nhưng đây là giải pháp của tôi:

/** 
* Incrementally rotated the arrow view by a given angle. 
* 
* @param degrees Angle in degrees. 
* @param duration Duration of the rotation animation. 
*/ 
- (void)rotateArrowViewByAngle:(CGFloat)degrees 
        withDuration:(NSTimeInterval)duration { 

    CABasicAnimation *spinAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    spinAnimation.fromValue = [NSNumber numberWithFloat:self.currentAngle/180.0 * M_PI]; 
    spinAnimation.toValue = [NSNumber numberWithFloat:degrees/180.0 * M_PI]; 
    spinAnimation.duration = duration; 
    spinAnimation.cumulative = YES; 
    spinAnimation.additive = YES; 
    spinAnimation.removedOnCompletion = NO; 
    spinAnimation.delegate = self; 
    spinAnimation.fillMode = kCAFillModeForwards; 

    [self.arrowView.layer addAnimation:spinAnimation forKey:@"spinAnimation"]; 

    self.currentAngle = degrees; 
} 

và sau đó bạn có thể sử dụng phương pháp đại biểu

- (void)animationDidStart:(CAAnimation *)theAnimation 
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 

để xoay giữ cho nó quay. Ngoài ra, các thông số về độ và thời lượng có thể là số thực sự cao ... nếu điều này là đủ.

UPDATE:
Như đã trình bày bởi yinkou,

spinAnimation.repeatCount = HUGE_VALF;  // HUGE_VALF is defined in math.h so import it 

là cách tốt hơn mà khởi động lại các hình ảnh động trong các đại biểu.

XIN LƯU Ý:
self.currentAngle là thuộc tính ghi nhớ vòng quay cuối cùng hiện tại.
Tôi cần điều đó để làm cho chế độ xem xoay trái và phải.

Các vấn đề liên quan