Làm thế nào để tạo hiệu ứng cho thuộc tính textColor của UILabel?


82

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:


6

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 textColorbấ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 NSTimertố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ì.


hoặc: hàm ném ra một mảng có giá trị RGB giữa A và B và một tỷ lệ phần trăm nhất định. Không biết bất cứ điều gì về thuật toán màu sắc.
dontWatchMyProfile

đây là cách giải quyết tốt: ở đâyở đây nhờ Anna Karenina
chó rừng

4
Bạn nên sử dụng CADisplayLinkthay vì sử dụng NSTimercho 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.
Douglas Hill

đây KHÔNG phải là câu trả lời được chấp nhận nữa ngay cả khi nó đúng vào thời điểm đó. xem câu trả lời của lạ bên dưới
bitwit

Stack Overflow sẽ không cho phép tôi xóa câu trả lời lỗi thời này, vì nó đã được chấp nhận. Câu trả lời của Checkout @ lạ bên dưới.
Jasarien

194

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.


7
Đẹp, thanh lịch, thực sự là giải pháp tốt nhất và sạch sẽ nhất.
maksa

17
Tuyệt quá. Hoạt động trong Swift cũng giống như vậy:UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
SimplGy

8
chỉ một lưu ý: Điều này chỉ hoạt động khi nhãn tĩnh. Nếu bạn làm điều này và vị trí của nhãn đang được sửa đổi, hoạt ảnh mờ dần sẽ hiển thị tạo tác xấu xí.
Lukas Petr

Không hoạt động đối với tôi trên Xcode 10.2.1 và Swift 5. Phương thức 'shokaveli' bên dưới không hoạt động
Martin

Tôi đã tìm cách thực hiện điều này trong SwiftUI, nhưng có vẻ như nó không được hỗ trợ vào thời điểm đó.
philippe 25/09/19

58

Giải pháp Swift 4 :

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
  self.yourLabel.textColor = .red
}, completion: nil)

Lưu ý, điều này chỉ hoạt động nếu bạn có một phiên bản của UILabelthuộc withtí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.
Sam Soffes

Không hiệu quả với tôi vì một số lý do. Nó đột ngột thực hiện thay đổi thay vì dần dần trong suốt hoạt ảnh. :(
ScottyBlades

1
@ScottyBlades có thể bạn đang làm hoạt ảnh trên chuỗi nền? Thử đặt mã UIView.transition bên trong dấu ngoặc vuông DispatchQueue.main.async {}.
budidino,

1
FYI - Lần đầu tiên tôi thử không hiệu quả và đó là do tôi đã làm options: .easeInOut, vì vậy tôi đã thay đổi nó thành .transitionCrossDissolve và hoạt động.
LeoGalante

13

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


9

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).


7

Đâ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()

6

Đâ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) { }];

0

Tôi thấy khá dễ dàng khi đặt một UIView bên dưới nhãn và tạo hiệu ứng cho độ mờ của nó. Nhãn phải được thêm vào chế độ xem đó. Có thể không phải là một giải pháp tốt từ quan điểm tiêu thụ tài nguyên, nhưng khá đơn giản.


0

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)

0

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)
}
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.