如何在不重置位置的情况下更改 UIButton?

Posted

技术标签:

【中文标题】如何在不重置位置的情况下更改 UIButton?【英文标题】:How to change UIButton without reset position? 【发布时间】:2018-01-13 06:55:17 【问题描述】:

我做了一个可拖动的按钮

let buttonGesture = UIPanGestureRecognizer(target: self, action: #selector(draggedButton(_:)))
menuButton.isUserInteractionEnabled = true
menuButton.addGestureRecognizer(buttonGesture)

当按钮拖动到某个位置时,图像会发生变化。

@objc func draggedButton(_ sender:UIPanGestureRecognizer)
    self.view.bringSubview(toFront: menuButton)
    let translation = sender.translation(in: self.view)

    menuButton.center = CGPoint(x: menuButton.center.x + translation.x, y: menuButton.center.y + translation.y)
    sender.setTranslation(CGPoint.zero, in: self.view)

    if(menuButton.center.x < 100)
        menuButton.setImage(UIImage(named: "newimage"), for: UIControlState.normal)
    

但是setImage之后,按钮会重置位置,如何防止呢?

【问题讨论】:

我试过了,效果很好 【参考方案1】:

尝试设置按钮背景图像而不是按钮图像。由于设置图像会重新调整其位置。

【讨论】:

我也试过了,当我拖动到原点小于 100 时,它会更新图像并且按钮的框架没有重置到其原始位置。您能否添加任何示例图像,以便我可以清楚地了解问题。 视频可以吗?我录制了一个视频。 https://streamable.com/43jar,图片和背景图是一样的。 我也试试这个,https://streamable.com/uk1dz,即使我将图像设置为其他按钮,它仍然会重置位置。第一个视频我用setImage,第二个视频我用setBackgroundImage,你可以看到他们没有什么不同【参考方案2】:

我有同样的问题,这是我的解决方案:

    取消设置图像,将按钮设为空白,其中没有图形 为初始状态和第二状态创建新的 UIImageView,包括您的 UIImagesviewDidLoad() 中的 UIViewController 中设置 UIImageViewbounds = UIButton.bounds设置初始图片 调用UIButton.addSubview(UIImageView) 在您使用 UIButton.setImage() 的方法中调用 UIImageViewimage = UIImage

这是一个例子:

    class VC : UIViewController
       let image_initial : UIImage = UIImage("img_1")
       let image_second : UIImage = UIImage("img_2")
       let imageview_menu : UIImageView = UIImageView()
       @IBOutlet weak var button_menu: UIButton!

       override func viewDidLoad()
           super.viewDidLoad()
           //...
           self.imageview_menu.bounds = button_menu.bounds
           self.imageview_menu.image = image_initial
           self.button_menu.addSubview(imageview_menu)
           //...
       
       @objc func draggedButton(_ sender:UIPanGestureRecognizer)
           //...your code
           if(menuButton.center.x < 100)
              imageview_menu.image = image_second
           

       
    

如果您还没有找到解决方案,希望这对您有所帮助。 :)

【讨论】:

以上是关于如何在不重置位置的情况下更改 UIButton?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 git reset 在不丢失本地更改的情况下重置未推送的提交

PyQt 在不重置样式的情况下更改 QPushButton 背景颜色

如何在不重置Java的情况下绘制多个对象

如何在不重置其当前状态的情况下从一个视图控制器到自身进行转场?

如何在不更改字体本身的情况下更改 uilabel 的字体大小?

如何在不影响背景的情况下更改网页内容?