按下时如何使 UIButton 收缩为 UIActivityIndi​​cator?

Posted

技术标签:

【中文标题】按下时如何使 UIButton 收缩为 UIActivityIndi​​cator?【英文标题】:How to Make an UIButton Shrink Into an UIActivityIndicator When Pressed? 【发布时间】:2019-12-02 17:47:58 【问题描述】:

我正在尝试创建一个 UIButton,当点击它时它会缩小为一个活动指示器。我所指的 UIButton 名为 Request Ride。我已经设置了大部分代码,但是由于某种原因按钮不会缩小并且指示器不会显示?我会附上应用的图片和我的代码。

// 我的应用

// 我需要的最终结果

// 主故事板

// HomeVC

@IBAction func actionBtnWasPressed(_ sender: Any) 
        actionBtn.animateButton(shouldLoad: true, withMessage: nil)
    

// 圆形阴影按钮

class RoundedShadowButton: UIButton 

    // Variables
    var originalSize: CGRect?

    func setupView() 
        originalSize = self.frame
        self.layer.cornerRadius = 5.0
        self.layer.shadowRadius = 10.0
        self.layer.shadowColor = UIColor.darkGray.cgColor
        self.layer.shadowOpacity = 0.3
        self.layer.shadowOffset = CGSize.zero
    

    override func awakeFromNib() 
        setupView()
    

    func animateButton(shouldLoad: Bool, withMessage message: String?) 

        let spinner = UIActivityIndicatorView()
        spinner.style = .large
        spinner.color = UIColor.darkGray
        spinner.alpha = 0.0
        spinner.hidesWhenStopped = true
        spinner.tag = 21

        if shouldLoad 
            self.addSubview(spinner)
            self.setTitle("", for: .normal)
            UIView.animate(withDuration: 0.2, animations: 
                self.layer.cornerRadius = self.frame.height / 2
                self.frame = CGRect(x: self.frame.midX - (self.frame.height / 2), y: self.frame.origin.y, width: self.frame.height, height: self.frame.height)
            )  (finished) in
                if finished == true 
                    spinner.startAnimating()
                    spinner.center = CGPoint(x: self.bounds.width / 2 + 1, y: self.bounds.width / 2 + 1)
                    UIView.animate(withDuration: 0.2) 
                        spinner.alpha = 1.0
                    
                
            
            self.isUserInteractionEnabled = false
         else 
            self.isUserInteractionEnabled = true

            for subview in self.subviews 
                if subview.tag == 21 
                    subview.removeFromSuperview()
                
            

            UIView.animate(withDuration: 0.2) 
                self.layer.cornerRadius = 5.0
                self.frame = self.originalSize!
                self.setTitle(message, for: .normal)
            
        
    

【问题讨论】:

邮政编码而不是图片。 @MojtabaHosseini 我编辑了帖子以添加我的代码:) 【参考方案1】:

一个明显的事情是这条线是完全错误的:

spinner.center = CGPoint(x: self.frame.width / 2 + 1, y: self.frame.width / 2 + 1)

您错误地放置了微调器。如果活动视图是按钮的子视图,那么它需要居中在按钮的 bounds 中间,而不是它的框架。

我得到的效果有点像你描述的:

所以如果你的价值观正确,这应该是可能的。

【讨论】:

我该如何解决这个问题? 我明白,但这是我第一次以编程方式执行活动指示器 添加了“截屏视频”,表明一个人可能可以做你想做的事情。 K 我将边界添加到微调器中心,接下来我需要修复什么?

以上是关于按下时如何使 UIButton 收缩为 UIActivityIndi​​cator?的主要内容,如果未能解决你的问题,请参考以下文章

按下时将 UIbutton 添加为子视图无法调用 Selector

IOS:按下时不要改变颜色UIButton

如何在nib文件中按下时禁用UIButton高亮显示?

按下时更改图像的 UIButton - 但更改图像时效果不佳

UIButton 按下时移动

按下时使用 UIViewAnimationTransitionFlipFromRight 翻转 UIButton 并在“另一侧”显示新按钮