大家好。我正在尝试制作一个星形按钮,当您单击它时,它会从空星变成实心星,反之亦然。该星形包含在表格视图中,因此每个单元格的最右侧都有一个星形。
问题是,当我运行模拟器时,空星会很好地显示出来,但我无法使其变形为实心形状。我浏览了整个网络,但找不到导致问题的解决方案。
我包括为设计星形按钮而设计的UIView子类。
另外,这是我第一次使用stackoverflow,因此,如果有更好的方式表达问题或获得帮助的更好方式,请告诉我。
谢谢大家。
import UIKit
class StarFilling: UIView {
//MARK: Properties
var marking = 0{
didSet {
setNeedsLayout()
}
}
var starList = [UIButton]()
// MARK: Initialization
required init?(coder aDecoder: NSCoder){
super.init(coder: aDecoder)
let filledStarImage = UIImage(named: "filledStar")
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 33, height: 33))
button.addTarget(self, action: "fillingStar", forControlEvents: UIControlEvents.TouchDown)
button.setImage(emptyStarImage, forState: .Normal)
button.setImage(filledStarImage, forState: .Selected)
button.setImage(filledStarImage, forState: [.Highlighted, .Selected])
addSubview(button)
}
// MARK: Button Action
func fillingStar(button: UIButton){
if(marking == 0){
marking = 1
}
else{
marking = 0
}
updateButtonSelectionStates()
}
func updateButtonSelectionStates(){
if(marking==1){
for button in starList{
button.selected = true
}
}
}
}
最佳答案
您需要覆盖touchesBegan和pointInside才能使子视图(即星形按钮)接收事件。您还可以使用UIButton的选定成员变量来切换状态。
class StarFilling: UIView {
override init (frame : CGRect)
{
super.init(frame : frame)
initStar()
}
convenience init ()
{
self.init(frame:CGRect.zero)
}
required init?(coder aDecoder: NSCoder){
super.init(coder: aDecoder)
initStar()
}
func initStar()
{
let filledStarImage = UIImage(named: "star_filled")
let emptyStarImage = UIImage(named: "star_empty")
let button = UIButton(frame: CGRect(x: 300, y: 100, width: 100, height: 60))
button.userInteractionEnabled = true
button.addTarget(self, action: #selector(StarFilling.fillingStar(_:)), forControlEvents: UIControlEvents.TouchUpInside)
button.setImage(emptyStarImage, forState: .Normal)
button.setImage(filledStarImage, forState: .Selected)
addSubview(button)
}
// MARK: Button Action
func fillingStar(sender : UIButton)
{
sender.selected = !sender.selected
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
for view in subviews
{
view.touchesBegan(touches, withEvent: event)
}
}
override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool
{
return true
}
}
在您的ViewController中:
let star = StarFilling()
star.userInteractionEnabled = true
self.view.addSubview(star)
关于swift - UIView子类:表格 View 中的星形按钮在触摸时不会做出相应的 react ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38988907/