Display activity indicator inside UIButton

后端 未结 10 1720
囚心锁ツ
囚心锁ツ 2021-01-31 17:36

I would like to change the content of a UIButton to an ActivityIndicator after it is pressed.

I know buttons have an imageView and a titleLabel, but I don\'t know how to

10条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-31 18:10

    @Boris: This should not be in an extension.

    Here it is in swift 3/4, with improved code: disables button, works with images and titles.

    class LoadingButton: UIButton {
    
        struct ButtonState {
            var state: UIControlState
            var title: String?
            var image: UIImage?
        }
    
        private (set) var buttonStates: [ButtonState] = []
        private lazy var activityIndicator: UIActivityIndicatorView = {
            let activityIndicator = UIActivityIndicatorView()
            activityIndicator.hidesWhenStopped = true
            activityIndicator.color = self.titleColor(for: .normal)
            self.addSubview(activityIndicator)
            activityIndicator.translatesAutoresizingMaskIntoConstraints = false
            let xCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerX, relatedBy: .equal, toItem: activityIndicator, attribute: .centerX, multiplier: 1, constant: 0)
            let yCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerY, relatedBy: .equal, toItem: activityIndicator, attribute: .centerY, multiplier: 1, constant: 0)
            self.addConstraints([xCenterConstraint, yCenterConstraint])
            return activityIndicator
        }()
    
        func showLoading() {
            activityIndicator.startAnimating()
            var buttonStates: [ButtonState] = []
            for state in [UIControlState.disabled] {
                let buttonState = ButtonState(state: state, title: title(for: state), image: image(for: state))
                buttonStates.append(buttonState)
                setTitle("", for: state)
                setImage(UIImage(), for: state)
            }
            self.buttonStates = buttonStates
            isEnabled = false
        }
    
        func hideLoading() {
            activityIndicator.stopAnimating()
            for buttonState in buttonStates {
                setTitle(buttonState.title, for: buttonState.state)
                setImage(buttonState.image, for: buttonState.state)
            }
            isEnabled = true
        }
    
    }
    

提交回复
热议问题