Wednesday, October 4, 2017

Tô chữ nhiều màu Swift

Bình thường, để tô màu chữ label ta dùng lệnh
la.textColor = UIColor.blueColor()
Lệnh này làm toàn bộ chữ có màu xanh, nếu ta muốn chữ chỗ xanh chỗ đỏ, ta phải dùng NSMutableAttributedString.
let text="Đâylà chữ ví dụ"
let at =  NSMutableAttributedString(string: text,attributes: [NSFontAttributeName:UIFont.boldSystemFontOfSize(17)])
        at.addAttribute(NSForegroundColorAttributeName, value:UIColor.redColor(), range: NSMakeRange(0,4))
        at.addAttribute(NSForegroundColorAttributeName, value: UIColor.greenColor(), range: NSRange(location:6,length:5))
       la.attributedText = at

Tiếp theo, ta có một chuỗi có nhiều dòng, ta muốn mỗi dòng có một màu. Thông thường ta phải set mỗi dòng vào 1 label rồi tô màu riêng của label đó. Nhưng với lớp NSMutableAttributedString ta có thể làm ngay trong một label.
Giả sử chuỗi của ta có 7 dòng từ Thứ Hai đến Chủ Nhật, ta muốn set mỗi dòng một màu, chỉ trong 1 label duy nhất.
Ta sẽ khai báo một mảng array các thứ
var thu=[String](count: 7, repeatedValue: " ")
        thu[0]="Thứ hai"
        thu[1]="Thứ ba"
        thu[2]="Thứ tư"
        thu[3]="Thứ năm"
        thu[4]="Thứ sáu"
        thu[5]="Thứ by"
        thu[6]="Ch nhật"
Khai báo các màu sẽ dùng
let mau1 = [NSForegroundColorAttributeName: UIColor.blackColor(), NSFontAttributeName: UIFont.systemFontOfSize(17)]
let mau2 = [NSForegroundColorAttributeName: UIColor.brownColor(), NSFontAttributeName: UIFont.systemFontOfSize(17)]
let mau3 = [NSForegroundColorAttributeName: UIColor.redColor(), NSFontAttributeName: UIFont.systemFontOfSize(17)]
let mau4 = [NSForegroundColorAttributeName: UIColor.orangeColor(),NSFontAttributeName: UIFont.systemFontOfSize(17)]
let mau5 = [NSForegroundColorAttributeName: UIColor.grayColor(), NSFontAttributeName: UIFont.systemFontOfSize(17)]
let mau6 = [NSForegroundColorAttributeName: UIColor.blueColor(), NSFontAttributeName: UIFont.systemFontOfSize(17)]
let mau7 = [NSForegroundColorAttributeName: UIColor.cyanColor(), NSFontAttributeName: UIFont.systemFontOfSize(17)]
let at = NSMutableAttributedString()
var p1 = NSMutableAttributedString()
Canh lề trái luôn
let pa = NSMutableParagraphStyle()
        pa.alignment = .Left
Dùng lệnh for duyệt mảng để set màu cho từng dòng.
for i in0..<thu.count{
if thu[i] == "Thứ hai" {
        p1 = NSMutableAttributedString(string: thu[i] + "\n", attributes: mau1)
            }
elseif thu[i] == "Thứ ba" {
        p1 = NSMutableAttributedString(string: thu[i] + "\n", attributes: mau2)
            }
elseif thu[i] == "Thứ tư" {
        p1 = NSMutableAttributedString(string: thu[i] + "\n", attributes: mau3)
                          }
elseif thu[i] == "Thứ năm" {
        p1 = NSMutableAttributedString(string: thu[i] + "\n", attributes: mau4)
                           }
elseif thu[i] == "Thứ sáu"{
       p1 = NSMutableAttributedString(string: thu[i] + "\n", attributes: mau5)
                            }
elseif thu[i] == "Thứ by"{
        p1 = NSMutableAttributedString(string: thu[i] + "\n", attributes: mau6)
            }
else {
      p1 = NSMutableAttributedString(string: thu[i] + "\n", attributes: mau7)
            }
 at.appendAttributedString(p1)
at.addAttribute(NSParagraphStyleAttributeName,value:pa, range:NSMakeRange(0,1))
 }
la.numberOfLines = 0
la.attributedText = at
la.sizeToFit()
Bạn chạy thử sẽ thấy kết quả như trên.
Dòng la.numberOfLines = 0 để label có thể set được nhiều dòng, nếu không nó chỉ hiển thị dòng đầu tiên.

Dòng cuối là để label có đủ chiều cao hiển thị được 7 dòng.

No comments:

Post a Comment