/
RatingBar.swift
executable file
·139 lines (136 loc) · 5.05 KB
/
RatingBar.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//
// RatingBar.swift
//
// Created by Ragaie alfy on 7/10/17.Egypt ()+201113938736)
// Copyright © 2017 Ragaie alfy. All rights reserved.
//
import UIKit
@IBDesignable open class RatingBar: UIView {
@IBOutlet weak var rate1: UIButton!
@IBOutlet weak var rate2: UIButton!
@IBOutlet weak var rate3: UIButton!
@IBOutlet weak var rate4: UIButton!
@IBOutlet weak var rate5: UIButton!
public var ID : String!
var delegate : RatingBarDelegate!
public var rateValue : Int! = 0
private var allRatingButton : [UIButton]! = []
private var tags : [Int] = [0,0,0,0,0]
@IBInspectable public var rateImage: UIImage? {
didSet {
self.setNeedsDisplay()
}
}
@IBInspectable public var halfrateImage: UIImage? {
didSet {
self.setNeedsDisplay()
}
}
@IBInspectable public var unrateImage: UIImage? {
didSet {
setRatingValue(rateValue: 0)
self.setNeedsDisplay()
}
}
@IBInspectable public var ratingValue: Double = 0 {
didSet {
setRatingValue(rateValue: ratingValue)
}
}
// MARK: Initializers
override public init(frame : CGRect) {
super.init(frame : frame)
initSubviews()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initSubviews()
initActionAndDelegete()
}
func initSubviews() {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "RatingBar", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as? UIView
// to make view fit view in design you welcome.
view?.frame = self.bounds
view?.autoresizingMask = [UIView.AutoresizingMask.flexibleWidth, UIView.AutoresizingMask.flexibleHeight]
allRatingButton = [rate1,rate2,rate3,rate4,rate5]
addSubview(view ?? UIView())
// initalize images
// rateImage = UIImage(named: "star3", in: bundle,compatibleWith: nil)!
// halfrateImage = UIImage(named: "star2", in: bundle,compatibleWith: nil)!
// // if unrateImage != nil {
// unrateImage = UIImage(named: "star1", in: bundle,compatibleWith: nil)!
// }
}
func initActionAndDelegete() {
rate1.addTarget(self, action: #selector(RatingBar.changeRating(_:)), for: .touchUpInside)
rate2.addTarget(self, action: #selector(RatingBar.changeRating(_:)), for: .touchUpInside)
rate3.addTarget(self, action: #selector(RatingBar.changeRating(_:)), for: .touchUpInside)
rate4.addTarget(self, action: #selector(RatingBar.changeRating(_:)), for: .touchUpInside)
rate5.addTarget(self, action: #selector(RatingBar.changeRating(_:)), for: .touchUpInside)
}
open func setRatingValue(rateValue : Double) {
// rate value from 1 to 5
if rateValue == 0 {
for item in allRatingButton{
item.isUserInteractionEnabled = true
}
// break you dont need to set item with zero rating value
// return
} else {
for item in allRatingButton {
item.isUserInteractionEnabled = false
}
}
//print(rateValue)
if rateValue <= 0 {
for item in allRatingButton {
item.setBackgroundImage(unrateImage, for: .normal)
}
} else {
var rate = rateValue
self.rateValue = Int(rate)
if rate > 5 {
rate = rate.truncatingRemainder(dividingBy: 5)
}
if rate <= 5 {
let stringNumber = String(rate).split(separator: ".")
let firstNumber : Int! = Int(stringNumber[0])
let secandNumber : Int! = Int(stringNumber[1])
if firstNumber >= 1 {
for iii in 0...firstNumber - 1 {
allRatingButton[iii].setBackgroundImage(rateImage, for: .normal)
}
}
if secandNumber > 0 {
allRatingButton[firstNumber].setBackgroundImage(halfrateImage, for: .normal)
}
}
}
}
@objc func changeRating(_ sender : UIButton) {
// remove all rating button
for item in allRatingButton {
item.setBackgroundImage(unrateImage, for: .normal)
item.tag = 0
}
let currentNumber = Int(sender.restorationIdentifier ?? "") ?? 0
var numberToSelect = 0
numberToSelect = tags[currentNumber - 1] == 0 ? currentNumber : currentNumber - 1
for iii in 0..<numberToSelect {
allRatingButton[iii].setBackgroundImage(rateImage, for: .normal)
tags[iii] = 1
}
for jjj in numberToSelect..<5 {
tags[jjj] = 0
}
callDelegate(value: numberToSelect)
}
func callDelegate(value : Int) {
if delegate != nil {
delegate.ratingBar(ratingBar: self, didChangeValue: value)
rateValue = value
}
}
}