Wednesday, October 4, 2017

Làm spinner trong Swift

Swift có picker để sổ ra một danh sách có sẵn cho người dùng chọn, tuy nhiên nó không đẹp lắm.


Ta muốn tự làm một cái tương tự spinner trong Android cho nó bắt mắt hơn.
Khai báo một label và một nút bấm, ta muốn nút bấm này khi ấn sẽ bật ra một danh sách chọn như sau.


var la: UILabel!
var bu:UIButton!
Khai báo một mảng các năm để chọn
let data=["2000","2001","2002","2003","2004","2005","2006","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023"]
Định vị, set kiểu, set sẵn cho nút là “2017”. Label để chữ màu cam.
bu = UIButton(frame: CGRect(x:80, y: 530, width: 100, height: 32))
setn(bu,"2017")
la = UILabel(frame: CGRect(x: 80, y: 500, width: 100, height: 25))
la.text = "Đinh Dậu"
la.textColor = UIColor.orangeColor()
view.addSubview(bu)
view.addSubview(la)
Hàm set kiểu cho nút như sau
func setn(bun:UIButton,_ t: String){
let a=NSMutableAttributedString(string: t, attributes: [NSForegroundColorAttributeName: UIColor.blueColor(), NSFontAttributeName: UIFont(name: "Arial", size: 15.0)!])
        bun.setAttributedTitle(a, forState: .Normal)
        bun.backgroundColor = hex("#e6e6fa")
        bun.layer.cornerRadius = 16
        bun.layer.borderColor = hex("#6699cc").CGColor
        bun.layer.borderWidth = 1
    }
Tạo một hàm để dùng dialog hiển thị danh sách chọn, copy xuống trên ngoặc đóng cuối cùng.
func spinner(sender: UIButton){
let alert = UIAlertController(title: "Chọn năm", message: "", preferredStyle: .Alert)
for i in 0..<data.count {
            alert.addAction(UIAlertAction(title: String(data[i]), style: UIAlertActionStyle.Default, handler: { (action: UIAlertAction) ->Voidin

let a=NSMutableAttributedString(string: self.data[i], attributes: [NSForegroundColorAttributeName: UIColor.blueColor(), NSFontAttributeName: UIFont(name: "Arial", size: 15.0)!])
self.bu.setAttributedTitle(a, forState: .Normal)

let h=String(self.data[i])
let nam=Int(h)
let namam=self.canchi(nam!)
self.la.text=namam
self.la.textColor = UIColor.blueColor()
            }))
        }
        alert.addAction(UIAlertAction(title: "Cancel",
            style: UIAlertActionStyle.Cancel,
            handler:nil))
self.presentViewController(alert, animated: true, completion: nil)
    }
Ta dùng dialog hiện danh sách, khi người dùng chọn năm ta lấy kết quả đổi ra năm âm lịch và set ra label, để label chữ màu xanh.
Hàm đổi năm như sau.
func canchi(nam:Int)->String {
let soducan = nam % 10
var Can = ""
if (soducan == 1) {
            Can = "Tân"
        }
elseif (soducan == 2) {
            Can = "Nhâm"
        }
elseif (soducan == 3) {
            Can = "Quý"
        }
elseif (soducan == 4) {
            Can = "Giáp"
        }
elseif (soducan == 5) {
            Can = "Ất"
        }
elseif (soducan == 6) {
            Can = "Bính"
        }
elseif (soducan == 7) {
            Can = "Đinh"
        }
elseif (soducan == 8) {
            Can = "Mậu"
        }
elseif (soducan == 9) {
            Can = "Kỷ"
        }
else {
            Can = "Canh"
        }
let soduchi = nam % 12
var Chi = "";
if (soduchi == 1) {
            Chi = "Dậu"
        }
elseif (soduchi == 2) {
            Chi = "Tuất"
        }
elseif (soduchi == 3) {
            Chi = "Hợi"
        }
elseif (soduchi == 4) {
            Chi = "Tý"
        }
elseif (soduchi == 5) {
            Chi = "Sửu"
        }
elseif (soduchi == 6) {
            Chi = "Dần"
        } elseif (soduchi == 7) {
            Chi = "Mão"
        }
elseif (soduchi == 8) {
            Chi = "Thìn"
        }
elseif (soduchi == 9) {
            Chi = "Tỵ"
        }
elseif (soduchi == 10) {
            Chi = "Ngọ"
        }
elseif (soduchi == 11) {
            Chi = "Mùi"
        }
else {
            Chi = "Thân"
        }
return Can + " " + Chi
    }
Cuối cùng gắn hàm vào nút trong viewDidLoad
bu.addTarget(self, action: #selector(ViewController.spinner(_:)), forControlEvents: UIControlEvents.TouchUpInside)
Chạy thử xem kết quả, ban đầu trông như sau.


Sau khi chọn từ danh sách, label lại có màu xanh, đó là màu ta đã set trong hàm.


No comments:

Post a Comment