2016-08-17 2 views
0

안녕하세요. 저는 별 모양의 버튼을 만들려고합니다. 클릭하면 빈 별에서 채워진 별 모양으로 변하고 그 반대도 마찬가지입니다. 이 별표는 표보기에 포함되어 각 개별 셀의 가장 오른쪽에 별표가 표시됩니다.UIView 하위 클래스 : 터치하면 테이블보기의 별 모양의 단추가 반응하지 않습니다.

문제는 시뮬레이터를 실행할 때 빈 별이 모두 정상적으로 표시되지만 채워진 모양으로 모양을 변경할 수 없다는 것입니다. 웹 전체에서 탐색했지만 문제의 원인을 파악할 수있는 솔루션을 찾을 수 없습니다.

별 모양의 단추를 디자인하기 위해 만든 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를 오버라이드 (override) 할 필요가

답변

0

. UIButton의 선택된 멤버 변수를 사용하여 상태를 토글 할 수도 있습니다. 당신의 ViewController에서

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 
    } 
} 

:

let star = StarFilling() 
star.userInteractionEnabled = true 
self.view.addSubview(star) 
+0

안녕하세요, 귀하의 조언 주셔서 감사합니다! 당신이이 일에 열심히 노력해 주셔서 감사합니다. – Daniel

+0

유일한 문제는 XCode가 Thread1 : Signal SIGABRT 오류를 던졌습니다. 모든 콘센트를 점검하고 인터넷에서 할 수있는 일을했지만 불행히도 오류가 계속됩니다. 이 문제에 대한 제안 사항이 있습니까? – Daniel

+1

해결했습니다! 귀하의 코드 주셔서 감사합니다 :). 이제 모든 것이 잘 작동합니다. 나는 마침내 너무 안심했습니다. – Daniel