swift3で星マークが5つ並んだレーティングの値を変更するコードを作成しています。
デフォルトは白抜きの星が5つ表示されている状態で、いずれかの星をタップすると、左からタップした星までが黒抜きの星に変更されるという内容です。
再度同じ星をタップすると、デフォルトに戻ります。
UIViewのカスタムクラスで、draw関数をオーバーライドして、その中に白抜きの星が5つ表示されているコードを書いて実際に表示されている状態です。
touchesBegan関数をオーバーライドして、画面をタップしたら画像を表示するコードのところで、タップした位置の座標は取れているのですが、画像表示ができません。
ご教授願います。
swift import UIKit @IBDesignable class MPPRatingButton: UIView { //Viewのデフォルト位置 var origin: CGPoint = CGPoint(x: 0, y: 0) //黒抜きの星 let fullStar = UIImage(named: "fullStar") //白抜きの星 let emptyStar = UIImage(named: "emptyStar") //星の間のパディング var padding = 4 //星の数 var numOfStar = 5 //星の状態(デフォルトを白抜きとする) var rateStatus : Bool = false /// 初期化 init() { super.init(frame: CGRect(x: 0, y: 0, width: (emptyStar?.size.width)! * 5 + CGFloat(padding) * CGFloat(numOfStar + 1), height: (emptyStar?.size.height)!)) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func draw(_ rect: CGRect) { for i in 0..<5 { var paddingNo = CGFloat(padding * (i + 1)) var emptyStarNum = (emptyStar?.size.width)! * CGFloat(i) var pointOfStar = paddingNo + emptyStarNum emptyStar?.draw(at: CGPoint(x: pointOfStar, y: 0)) } } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { //タップした座標の取得 let touch : UITouch = touches.first! as UITouch let location : CGPoint = touch.location(in: self) //とりあえず仮の位置に表示 //if(0 < location.x){ // fullStar?.draw(at: CGPoint(x: 0, y: 0)) //setNeedsDisplay() } } }
あなたの回答
tips
プレビュー