UIButton 上的 UIControl.State.Highlighted 图像仅在第一次触摸事件后有效

Posted

技术标签:

【中文标题】UIButton 上的 UIControl.State.Highlighted 图像仅在第一次触摸事件后有效【英文标题】:UIControl.State.Highlighted image on UIButton only works after first touch event 【发布时间】:2019-01-23 11:26:05 【问题描述】:

我有一组按钮,我希望在触摸时通过不同的突出显示图像交叉淡入淡出。下面的技术工作正常,但仅在同一按钮上的第二次触摸事件之后。第一次触摸会在整个按钮上产生标准的“褪色深灰色”;从那时起,future 会通过突出显示的图片正确地交叉淡入淡出。

我只在模拟器中测试过,是他的问题吗?如果没有,我如何在每次触摸时产生正确的突出显示状态?谢谢!

@IBOutlet weak var someButton: UIButton!       
@IBAction func someButton(_ sender: UIButton) 

    UIView.transition(with: sender, duration: 0.3, options: .transitionCrossDissolve, animations: 
        sender.setImage(UIImage(named: "My Image.png"), for: UIControl.State.highlighted)
    , completion: nil)

//...other functions


【问题讨论】:

【参考方案1】:

在设置UIButton 属性时或在viewDidLoad() 中通过编写下面的代码来设置按钮的突出显示图像。

yourButton.setImage(UIImage(named: "My Image.png"), for: UIControl.State.highlighted)

您的代码无法运行的原因

按钮操作@IBAction func someButton(_ sender: UIButton) 总是只在用户手指松开时调用,所以此时 UIButton 首次没有高亮状态的图像。后来,图像通过动画设置,因此动画完美。

编辑

您可以通过创建如下所示的单独函数来使用 firebase 调用或其他一些事件操作来转换 UIButton。使用UIButtonoutlet 访问该按钮。

@IBOutlet weak var someButton: UIButton!

func buttonTransition() 

    UIView.transition(with: sender, duration: 0.3, options: .transitionCrossDissolve, animations: 
        someButton.setImage(UIImage(named: "My Image.png"), for: UIControl.State.highlighted)
    , completion: nil)

所以,您可以从任何地方调用buttonTransition() 函数。

【讨论】:

有没有办法从按钮本身外部调用它?我希望能够从按钮按下或 Firebase 调用运行转换。当我尝试任何其他with: 项目时,我不断收到Cannot convert value of type '/**Some type*/' to expected argument type 'UIView' 我已经编辑了答案@moosgrn。请查看 Edit 以澄清您的疑问。如果还有任何问题,请随时在此处发表评论.. !! ?【参考方案2】:

它正在处理第二次点击,因为您已经在按钮点击动作中编写了转换代码。只需在 viewDidLoad 或 viewWillApear 中编写该代码,它就会在第一次单击之前工作,并将在按钮上设置转换。在 viewDidLoad 中写这样的东西:

 override func viewDidLoad() 
    super.viewDidLoad()
    UIView.transition(with: button, duration: 0.3, options: .transitionCrossDissolve, animations: 
        self.button.setImage(UIImage(named: "image.png"), for: UIControl.State.highlighted)
    , completion: nil)

这里的button是storyboard中创建的按钮的outlet变量。

【讨论】:

以上是关于UIButton 上的 UIControl.State.Highlighted 图像仅在第一次触摸事件后有效的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIButton 上的 UIImageView 会在触摸时重新出现?

同一视图上的 tableview 和 UIButton

UIButton 上的 CGAffineTransformMakeTranslation 问题

避免 UIPickerView ios 上的 UIButton 覆盖

我可以更改 UIButton 上的色调颜色,但不能更改 UIImage

UIButton 上的图像