2008-10-22 50 views
58

Tôi đang cố gắng kéo một CALayer trong một ứng dụng iOS.Làm thế nào để bạn di chuyển một CALayer ngay lập tức (không có hoạt ảnh)

Ngay sau khi tôi thay đổi thuộc tính vị trí của nó nó cố gắng động đến vị trí mới và nhấp nháy khắp nơi:

layer.position = CGPointMake(x, y) 

Làm thế nào tôi có thể di chuyển CALayers ngay lập tức? Tôi dường như không thể nhìn xung quanh API hoạt ảnh lõi.

Trả lời

131

Bạn muốn quấn cuộc gọi của bạn trong những điều sau đây:

[CATransaction begin]; 
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions]; 
layer.position = CGPointMake(x, y); 
[CATransaction commit]; 
+1

Đó chính xác là nó. Tôi thậm chí không nghĩ đến CATransaction. Cảm ơn rất nhiều! – Mel

+3

2 năm sau ,, cảm ơn, lol. – nacho4d

+3

5 năm sau, cảm ơn! – MichaelScaria

17

Bạn cũng có thể sử dụng chức năng thuận tiện

[CATransaction setDisableActions:YES] 

là tốt.

Lưu ý: Hãy chắc chắn đọc ý kiến ​​của Yogev Shelly để hiểu bất kỳ gotchas nào có thể xảy ra.

+4

Quan trọng, điều này ảnh hưởng đến tất cả CALayer, do đó bạn muốn có thể kích hoạt lại các hành động sau khi bạn đã hoàn tất, nghĩa là [CATransaction setDisableActions: YES] –

+0

Tôi nên nói vậy. Tiết kiệm tốt. Lệnh vô hiệu hóa hoạt ảnh cho đến khi nó được đặt thành NO hoặc cho đến khi công cụ đồ họa động lõi đã hoàn thành một chu kỳ chạy. Không chắc đó có phải là từ thích hợp cho nó hay không:/Nhưng Cảm ơn vì đã dọn dẹp mọi thứ cho mọi người. – Biclops

12

Như những người khác đã đề xuất, bạn có thể sử dụng CATransaction.
Sự cố xảy ra do CALayer có thời lượng hoạt ảnh ngầm định mặc định là 0,25 giây.

Do đó, cách thay thế dễ dàng hơn (theo ý kiến ​​của tôi) là setDisableActions là sử dụng setAnimationDuration với giá trị 0.0.

[CATransaction begin]; 
[CATransaction setAnimationDuration:0.0]; 
layer.position = CGPointMake(x, y); 
[CATransaction commit]; 
+0

Dễ nhớ, dễ hiểu khi bạn đọc lại mã và dễ nhập hơn. Cảm ơn! –

10

Swift 3 Extension:

extension CALayer { 
    class func performWithoutAnimation(_ actionsWithoutAnimation:() -> Void){ 
     CATransaction.begin() 
     CATransaction.setValue(true, forKey: kCATransactionDisableActions) 
     actionsWithoutAnimation() 
     CATransaction.commit() 
    } 
} 

Cách sử dụng:

CALayer.performWithoutAnimation(){ 
    someLayer.position = newPosition 
} 
+0

Thật hữu ích khi thêm thuộc tính '@ noescape' vào khối để cho phép (và làm cho nó rõ ràng) rằng' self' không cần thiết trong khối – Andrew

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