2015-02-28 17 views
6

Trong ứng dụng của tôi, tôi có một UIView đó là sử dụng CALayer để đạt được một cái bóng:hình ảnh động mượt mà khi hiệu ứng động của CALayer shadowPath

@implementation MyUIView 

    - (instancetype) initWithFrame:(CGRect)frame { 
     self = [super initWithFrame:frame]; 
     if(!self) return self; 

     self.layer.shadowColor = [UIColor colorWithWhite:0 alpha:.2].CGColor; 
     self.layer.shadowOffset = CGSizeMake(0, 2); 
     self.layer.shadowOpacity = 1; 
     self.layer.shadowRadius = 1; 

     return self; 
    } 

@end 

Nếu tôi muốn bất cứ điều gì tiếp cận hiệu suất hợp lý, tôi phải xác định CALayer ' s shadowPath:

@implementation MyUIView 

    - (void) setFrame:(CGRect)frame { 
     [super setFrame:frame]; 

     self.layer.shadowPath = CGPathCreateWithRect(self.bounds, NULL); 
    } 

@end 

tôi đã nhận thấy hai điều bất cứ khi nào tôi động này UIView:

  1. Nếu tôi không sử dụng shadowPath, bóng hoạt ảnh cùng với xoay vòng và thay đổi kích thước khung hình. Thông báo trước ở đây là hoạt hình rất chậm và thiếu hiệu suất chung.

  2. Nếu tôi làm sử dụng một shadowPath bất cứ khi nào UIView được dưới hình dạng một hình ảnh động trơn tru và kịp thời, tuy nhiên quá trình chuyển đổi của bóng chính nó là nhiều hơn nữa khối tương tự (và ít mịn) hơn là không có shadowPath.

Ví dụ:

Edit:

Nó đáng chú ý là những animations đang tiềm ẩn - Tôi không gọi họ bản thân mình. Chúng là kết quả của việc quay UIViewController với hướng thiết bị. Bóng đổ trên UIView thay đổi kích thước trong khi xoay.

+0

phần của vấn đề là trong khi đường dẫn là animatable, họ không có _implicit_ hình ảnh động (những người mà được kích hoạt bởi thay đổi thuộc tính). Vì vậy, trong khi xoay khung hình hoạt hình, nhưng đường dẫn ngay lập tức thay đổi thành giá trị cuối cùng của nó. –

+0

@ DavidRönnqvist Ah. Điều đó có ý nghĩa. Có cách nào để thực hiện việc này theo cách thủ công không? – mattsven

+0

Có, bạn có thể thêm hoạt ảnh theo cách thủ công. Nhưng trừ khi bạn nhận được cùng một khoảng thời gian và thời gian như hoạt hình khung, nó sẽ không nhìn đúng. –

Trả lời

4

Tôi đã cố gắng tái tạo hành vi được hiển thị trong hai gif bạn cung cấp nhưng không thành công (có thể bạn có thể chỉnh sửa câu hỏi của mình bằng mã hoạt ảnh, ví dụ: UIView animateWithDuration:animations:).

Tuy nhiên, ở đâu đó trong tâm trí tôi, tôi nhớ rằng thỉnh thoảng tôi gặp phải vấn đề tương tự, và hóa ra tôi phải rasterize khung cảnh để làm cho nó mượt mà.

Vì vậy, tôi không thể đảm bảo rằng nó giải quyết vấn đề cho bạn, nhưng hãy thử xem:

self.layer.shouldRasterize = YES; 
self.layer.rasterizationScale = [[UIScreen mainScreen] scale]; 
+0

Tôi không hoạt ảnh theo cách thủ công, đây chỉ là bộ điều khiển chế độ xem xoay cùng với hướng thiết bị. Tôi sẽ thử đề xuất của bạn. – mattsven

+0

Xin chào Dennis, điều này, ngoài * không * bằng cách sử dụng 'shadowPath', đã giải quyết nó. Điều này giải quyết hiệu suất hit mà không sử dụng 'shadowPath' thường sẽ gây ra. Cảm ơn! (Tôi sẽ trao tiền thưởng khi giới hạn thời gian 7 giờ) – mattsven

+0

Rất vui được! Cảm ơn bạn đã chỉ ra rằng bạn đã xoay thiết bị và bạn không sử dụng 'shadowPath' trong phiên bản cuối cùng của mình. – Dennis

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