如何在Apple Developer Tutorial中创建RatingControl类的不同实例?

时间:2019-05-08 14:13:56

标签: ios swift uistackview

我需要创建一个与RatingControl类非常相似的类,该类是在创建FoodTracker教程时创建的。与我的唯一区别是,我需要该类能够创建评分控件的不同实例,该实例随图像类型的不同而不同。因此,我不仅需要拥有我的positivePointRatingButtons UIButton数组,还需要它能够实例化negativePointRatingButtonssuperPointRatingButtons。我只是不想为此目的再上一堂课,而且我是新来的,所以我想得到一些帮助。

import UIKit

@IBDesignable class PointRatingControl: UIStackView {

    //MARK: Properties

    private var positivePointRatingButtons = [UIButton]()
    private var negativePointRatingButtons = [UIButton]()
    private var superPointRatingButtons = [UIButton]()

    var rating = 0 {

        didSet {

            updatePointButtonSelectionStates()
        }
    }

    @IBInspectable var circleType: Int = 1 {

        didSet {

            setupButtons()
        }
    }

    @IBInspectable var circleSize: CGSize = CGSize(width: 30.0,  height: 30.0) {

        didSet {

            setupButtons()
        }
    }

    @IBInspectable var circleCount: Int = 10 {

        didSet {

            setupButtons()
        }
    }

    //MARK: Initialization

    override init(frame: CGRect) {

        super.init(frame: frame)
        setupButtons()
    }

    required init(coder: NSCoder) {

        super.init(coder: coder)
        setupButtons()
    }

    //MARK: Button Action

    @objc func ratingButtonTapped(button: UIButton) {


        guard let index = positivePointRatingButtons.index(of: button) else {

            fatalError("The button, \(button), is not in the positiveRatingButtons array: \(positivePointRatingButtons)")
        }

        // Calculate the rating of the selected button
        let selectedRating = index + 1

        if selectedRating == rating {
            // If the selected star represents the current rating, reset the rating to 0.
            rating = 0
        } else {
            // Otherwise set the rating to the selected star
            rating = selectedRating
        }
    }

    //MARK: Private Methods

    private func setupButtons() {

        // Clear any existing buttons
        for button in positivePointRatingButtons {

            removeArrangedSubview(button)
            button.removeFromSuperview()
        }

        positivePointRatingButtons.removeAll()

        // Load button images, since its @IDDesignable in order to show in the interface builder you have to specifyexplicitly the catalog's bundle, as opposed to just using UIImage(named:) method
        let bundle = Bundle(for: type(of: self))
        let emptyCircle = UIImage(named: "greenCirclePhoto", in: bundle, compatibleWith: self.traitCollection)
        let selectedCircle = UIImage(named: "greenFilledCirclePhoto", in: bundle, compatibleWith: self.traitCollection)
        let highlightedCircle = UIImage(named: "greenSelectedCirclePhoto", in: bundle, compatibleWith: self.traitCollection)

        for _ in 0..<circleCount {

            let button = UIButton()

            button.setImage(emptyCircle, for: .normal)
            button.setImage(selectedCircle, for: .selected)
            button.setImage(highlightedCircle, for: .highlighted)
            button.setImage(highlightedCircle, for: [.highlighted, .selected])

            button.translatesAutoresizingMaskIntoConstraints = false
            button.heightAnchor.constraint(equalToConstant: circleSize.height).isActive = true
            button.widthAnchor.constraint(equalToConstant: circleSize.width).isActive = true

            button.addTarget(self, action: #selector(PointRatingControl.ratingButtonTapped(button:)), for: .touchUpInside)

            addArrangedSubview(button)

            positivePointRatingButtons.append(button)
        }

        updatePointButtonSelectionStates()
    }

    private func updatePointButtonSelectionStates() {

        for (index, button) in positivePointRatingButtons.enumerated() {

            // If the index of a button is less than the rating, that button should be selected.
            button.isSelected = index < rating
        }
    }
}

Id希望能够同时使用我定义的@IBInspectable属性来使用circleType,这样我就可以使用1、2、3整数来表示每种情况。

1 个答案:

答案 0 :(得分:0)

我想出了办法。我只是做了一个开关盒,以根据ratingType变量加载不同的图像