Vì một số lý do, khi tôi cố gắng tạo hoạt ảnh cho textColor, nó sẽ không hoạt động. TextColor đột ngột thay đổi từ A thành B. Có thể tạo hiệu ứng cho nó, từ màu đỏ sang màu đen không?
Vì một số lý do, khi tôi cố gắng tạo hoạt ảnh cho textColor, nó sẽ không hoạt động. TextColor đột ngột thay đổi từ A thành B. Có thể tạo hiệu ứng cho nó, từ màu đỏ sang màu đen không?
Câu trả lời:
Câu trả lời này đã lỗi thời và không phải là giải pháp tốt cho câu hỏi ban đầu. Câu trả lời của @strange bên dưới tốt hơn nhiều và nên được sử dụng thay cho câu trả lời này: https://stackoverflow.com/a/20892927/76559
// Câu trả lời cũ bên dưới
Các textColor
bất động sản không được xác định như là animatable trong các tài liệu, vì vậy tôi không nghĩ rằng bạn có thể làm điều đó với một khối hình động UIView đơn giản ...
Điều này có thể được thực hiện khá thô sơ với NSTimer
tốc độ bắn mỗi vài mili giây, mỗi lần cài đặt màu dần dần từ màu này sang màu khác.
Tôi nói điều này là thô thiển vì nó sẽ yêu cầu một mảng hoặc một số vùng chứa giá trị màu đặt trước khác đi từ màu bắt đầu đến màu kết thúc và tôi chắc rằng có cách bạn có thể làm điều này bằng cách sử dụng hoạt ảnh cốt lõi hoặc thứ gì đó, tôi chỉ không không biết nó là gì.
CADisplayLink
thay vì sử dụng NSTimer
cho hoạt ảnh lái theo cách thủ công vì nó được đồng bộ hóa với các bản cập nhật hiển thị. Xem WWDC 2014 Phiên 236: Xây dựng Tương tác có thể gián đoạn và đáp ứng vào khoảng 13:00.
Thay vào đó, bạn đã thử sử dụng chuyển đổi hình chữ thập trên chính đối tượng như thế này chưa, nó sẽ cung cấp cho bạn hiệu ứng mờ dần dần đẹp mắt từ màu này sang màu khác:
Mục tiêu C
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];
Nhanh
UIView.transitionWithView(creditsLabel, duration: 0.25, options: .TransitionCrossDissolve, animations: {
self.creditsLabel.textColor = UIColor.redColor()
},
completion: nil)
Điều này tốt hơn là sử dụng NSTimers, CATextLayers, v.v. vì nhiều lý do khác nhau. CATextLayer không có hỗ trợ thích hợp cho text kerning hoặc NSAttributedText, và NSTimers có độ trễ (cộng với quá nhiều mã). Hoạt ảnh chuyển tiếp ở trên thực hiện thủ thuật và cũng có thể được sử dụng trong hoạt ảnh chuỗi. Tôi đã gặp vấn đề tương tự và đã thử các giải pháp ở trên nhưng thay vào đó, mã đơn giản này hoạt động kỳ diệu.
UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
Giải pháp Swift 4 :
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
UILabel
thuộc with
tính. Nếu bạn làm điều gì đó giống như transition(with: outerView.label…)
và cố gắng thiết lập nó bên trong, điều đó sẽ không thành công.
options: .easeInOut
, vì vậy tôi đã thay đổi nó thành .transitionCrossDissolve
và hoạt động.
Lý do mà textColor không thể hoạt hình là do UILabel sử dụng CALayer thông thường thay vì CATextLayer.
Để làm cho textColor có thể hoạt hình (cũng như văn bản, phông chữ, v.v.), chúng ta có thể phân lớp UILabel để làm cho nó sử dụng CATextLayer.
Đây là khá nhiều công việc, nhưng may mắn là tôi đã làm nó :-)
Bạn có thể tìm thấy lời giải thích đầy đủ + phần thay thế nguồn mở thả vào cho UILabel trong bài viết này
Bạn có thể thử tạo một phiên bản khác của UILabel hoặc bất kỳ phiên bản nào có textColor, rồi áp dụng hoạt ảnh giữa hai phiên bản đó (phiên bản với textColor cũ và một phiên bản có textColor mới).
Đây là điều DUY NHẤT hiệu quả với tôi:
let changeColor = CATransition()
changeColor.duration = 1
CATransaction.begin()
CATransaction.setCompletionBlock {
selected.label.layer.addAnimation(changeColor, forKey: nil)
selected.label.textColor = .blackColor()
}
selected.nameLabel.textColor = .redColor()
CATransaction.commit()
Đây là mã của tôi để tạo hoạt ảnh cho màu văn bản nhãn. Phần quan trọng là đặt textColor thành clearColor trước hoạt ảnh
label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
cập nhật nhanh chóng 3.0
Tôi vừa thay đổi từ nhận xét @budidino
UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)
Cảm ơn câu trả lời của @ Strange , hoạt động hoàn hảo trong Swift 5, Xcode 11 với một chút thay đổi cú pháp. Tôi đã tạo hoạt ảnh màu văn bản cho nhiều UILabels, nếu đây cũng là trường hợp của bạn, hãy thử điều này
for label in [label1, label2, ...] as [UILabel] { // loop through a @IBOutlet UILabel array
UIView.transition(with: label, duration: 0.3, options: .transitionCrossDissolve, animations: {
label.textColor = .label
}, completion: nil)
}