旋转UIBarButtonItem Swift

4
在Swift中,我有一个汉堡栏按钮,当点击时,我希望该汉堡栏按钮旋转90度(使线条垂直),然后再次单击它时,将其恢复到原始状态(水平)。
注意:请确保此解决方案适用于UIBarButtonItem,因为某些解决普通UIButton的方案不起作用。
3个回答

8
我使用UIBarButtonItem内部的UIButton来实现这个功能,并使用一个具有垂直或非垂直状态的变量。

这是我的故事板设置 enter image description here

以下是简单视图控制器的代码

import UIKit

class ViewController: UIViewController {

    var isVertical : Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func rotateAction(_ sender: Any) {
        if(!self.isVertical)
        {
            UIView.animate(withDuration: 0.2, animations: { 
                self.navigationItem.leftBarButtonItem?.customView?.transform =  CGAffineTransform(rotationAngle: 90 * .pi / 180)
            }, completion: { (finished) in
                self.isVertical = true
            })
        }else{
            UIView.animate(withDuration: 0.2, animations: {
                self.navigationItem.leftBarButtonItem?.customView?.transform =  CGAffineTransform.identity
            }, completion: { (finished) in
                self.isVertical = false
            })
        }

    }


}

结果

在此输入图片描述

希望这可以帮到你。


非常感谢您的帮助!我按照您的方法做了,动画效果非常好!不幸的是,有一个问题,当您点击汉堡包时,它不像以前那样打开侧边栏。而且,当我尝试在通过侧边菜单访问的其他屏幕上以相同的方式设置动画时,它会出现错误,并显示“类型'AboutWhoKnew'的值没有成员'isVertical'”(AboutWhoKnew是一个Swift文件的名称)。非常感谢您的帮助! - C.Elam
我之前打开侧边菜单的方法是使用UIBarButtonItem汉堡包的IBOutlet,在每个与视图控制器连接的Swift文件中,我在viewDidLoad()中添加了"hamburger.target = self.revealViewController()"和"hamburger.action = #selector(SWRevealViewController.revealToggle(_:))"。 - C.Elam
@C.Elam,你解决了你的问题吗?你可以将此代码添加到你的基础viewController中,这样就可以在你的整个应用程序中使用。你也可以定义一个自定义的UIButton类,并在那里定义isVertical属性。如果需要帮助,请告诉我。请接受我的答案。最好的问候。 - Reinier Melian
我没有解决我的问题。我有点困惑你刚才说的话,你能解释一下吗?所以,在我添加这个整体使它垂直之前,我有一个叫做hamburger的IBOutlet,然后在viewDidLoad()中,我有之前在其他评论中输入的代码,并且一切都正常工作并且它执行了revealViewController。但是,无论如何,我该如何使用你给我的代码来实现revealViewController呢? - C.Elam
所以我最终解决了其中一个问题,即在设置其他视图控制器时出现错误的问题。不幸的是,我不知道如何使点击按钮时显示revealViewController。 - C.Elam
@C.Elam 我很高兴,你终于弄清楚了,恭喜! - Reinier Melian

2
@IBAction func rotateAction1(_ sender: Any) {
    if (!self.isVertical) {

        UIView.animate(withDuration: 0.2, animations: {
            self.navigationItem.leftBarButtonItem?.customView?.transform = CGAffineTransform(rotationAngle: 90 * .pi / 180)
        }, completion: {
            (finished) in
            self.isVertical = true

        })

        revealViewController().revealToggle(true)
    } else {
        UIView.animate(withDuration: 0.2, animations: {
            self.navigationItem.leftBarButtonItem?.customView?.transform = CGAffineTransform.identity
        }, completion: {
            (finished) in
            self.isVertical = false
        })
        revealViewController().revealToggle(false)
    }
}

也许更好的做法是将 revealViewController().revealToggle(false)revealViewController().revealToggle(true) 放在动画结束的块中,等待动画结束后再显示和隐藏侧边菜单,这样可能会更好,但这取决于你。 - Reinier Melian

0

Swift 4:

func rotateBarButton() {

        let button = UIButton(frame: CGRect(x: 0, y: 0, width: 40, height: 40)) // Create new button & set its frame
        button.setImage(#imageLiteral(resourceName: "settings"), for: UIControlState()) // Assign an image
        let lef = UIBarButtonItem(customView: button)
        self.navigationItem.leftBarButtonItem = lef// Set as barButton's customView

        // Gets you half way there //
        UIView.animate(withDuration: 0.8, delay: 0.1, options: UIViewAnimationOptions.curveEaseIn, animations: {
            self.navigationItem.leftBarButtonItem?.customView?.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI))
        }, completion: nil)
        // Rotates all the way around //
        UIView.animate(withDuration: 0.5, delay: 0.5, options: UIViewAnimationOptions.curveEaseIn, animations: {
            self.navigationItem.leftBarButtonItem?.customView?.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI * 2))
        }, completion: nil)
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接