Làm cách nào để bạn di chuyển một CALayer ngay lập tức (không có hoạt ảnh)


80

Tôi đang cố kéo một CALayerứng dụng iOS.

Ngay sau khi tôi thay đổi thuộc tính vị trí của nó, nó sẽ cố chuyển động sang 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 CALayersngay lập tức? Tôi dường như không thể hiểu được API Core Animation.


liên quan đến QA cực kỳ cũ này, vấn đề quan trọng hiện nay là: stackoverflow.com/a/56980329/294884
Fattie

Câu trả lời:


168

Bạn muốn kết thúc cuộc gọi của mình như sau:

[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í còn không nghĩ về CATransaction. Cảm ơn rất nhiều!
Mel

5
Đúng, 6 năm rưỡi sau. Vẫn hữu ích. : D
Fogmeister

1
iOS7 hỗ trợ tốc ký mới:[UIView performWithoutAnimation:<#^(void)actionsWithoutAnimation#>];
k06a

2
7 năm, 7 tháng và 17 ngày sau: vẫn hữu ích. Cảm ơn!
kanobius

1
ngón tay cái lên 9 năm sau
nshuman

32

Tiện ích mở rộng Swift 3:

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

Sử dụng :

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

1
Nó rất hữu ích để thêm @noescapethuộc tính vào khối cho phép (và làm cho nó rõ ràng) mà selfkhông cần thiết trong khối
Andrew

22

Bạn cũng có thể sử dụng chức năng tiện lợi

[CATransaction setDisableActions:YES] 

cũng.

Lưu ý: Hãy nhớ đọc các bình luận của Yogev Shelly để hiểu bất kỳ lỗi nào có thể xảy ra.


5
Quan trọng, ảnh hưởng này tất cả CALayer do đó bạn muốn hành động bật lại tính sau khi bạn đã hoàn tất, tức là [CATransaction setDisableActions: YES]
Yogev Shelly

Chết tiệt, tôi nên nói thế. Tiết kiệm tốt. Lệnh vô hiệu hóa hoạt ảnh cho đến khi nó được đặt thành KHÔNG hoặc cho đến khi công cụ hoạt ảnh đồ họa cốt 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 bạn đã giải tỏa điều đó cho mọi người.
Biclops

15

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

Do đó, một giải pháp thay thế dễ dàng hơn (theo ý kiến ​​của tôi) setDisableActionslà sử dụng setAnimationDurationvới giá trị 0.0.

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

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

3

Kết hợp các câu trả lời trước đó ở đây cho Swift 4, để làm rõ ràng thời lượng hoạt ảnh ...

extension CALayer
{
    class func perform(withDuration duration: Double, actions: () -> Void) {
        CATransaction.begin()
        CATransaction.setAnimationDuration(duration)
        actions()
        CATransaction.commit()
    }
}

Sử dụng...

CALayer.perform(withDuration: 0.0) {
            aLayer.frame = aFrame
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.