【问题标题】:Making a UIView update behind another one in the same view controller在同一个视图控制器中进行另一个 UIView 更新
【发布时间】:2016-06-08 06:03:33
【问题描述】:

我正在快速制作一个使用 cocoapod 框架 BBSlideoutMenu 来显示菜单的应用程序。我也在使用 cocoapod 框架ChameleonFramework。我想做的是让我正在使用的汉堡按钮在打开时改变颜色。我还没有实现它,但我也想让顶部的栏透明。我已经记录了它here,所以你可以看到发生了什么。基本上,只有当我滑开菜单时,视图才会更新。

免责声明:我知道使用汉堡菜单被视为糟糕的代码设计,不幸的是,这是我在这个应用程序中所需要的。

这是我的代码:

import UIKit
import BBSlideoutMenu
import ChameleonFramework

class ViewController: UIViewController, BBSlideoutMenuDelegate {

    @IBOutlet var slideMenu: BBSlideoutMenu!


    var button: HamburgerButton! = nil
    var menuOpen = false;
    let screenSize: CGRect = UIScreen.mainScreen().bounds
    let topBar = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height * 0.1))

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib
        view.backgroundColor = UIColor.whiteColor()
        topBar.backgroundColor = FlatRed()
        button = HamburgerButton(frame: CGRectMake(0, 20, 54, 54))
        button.addTarget(self, action: #selector(toggleMenu(_:)), forControlEvents:.TouchUpInside)
        topBar.addSubview(button)
        view.addSubview(topBar)

    }

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

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        slideMenu.setupEdgePan()
        slideMenu.slideDirection = .Right
        slideMenu.shrinkAmount = 0
        slideMenu.slideTravelPercent = 0.87
        slideMenu.menuOffset = 0
        slideMenu.zoomFactor = 1
        slideMenu.springEnabled = false
        slideMenu.backgroundColor = FlatRed()
        slideMenu.delegate = self
        slideMenu.setupEdgePan()
    }

    func toggleMenu(sender : HamburgerButton!) {
        if(menuOpen) {
            slideMenu.dismissSlideMenu(animated: true, time: nil)
        } else {
            slideMenu.presentSlideMenu(true) { () -> Void in
                //Runs after menu is presented
            }
        }
    }

    func didPresentBBSlideoutMenu(menu: BBSlideoutMenu) {
        menuOpen = true
        button.changeColor(UIColor.blackColor())
    }

    func didDismissBBSlideoutMenu(menu: BBSlideoutMenu) {
        menuOpen = false
        button.changeColor(UIColor.whiteColor())
    }

}

我使用的是this hamburger menu button,它是用CoreGraphicsQuartzCore创建的,并添加了以下更改颜色的功能。

func changeColor(color: UIColor) {
        for layer in [ self.topStroke, self.middleStroke, self.bottomStroke ] {
            layer.fillColor = nil
            layer.strokeColor = color.CGColor
            layer.lineWidth = 4
            layer.miterLimit = 4
            layer.lineCap = kCALineCapRound
            layer.masksToBounds = true

            let strokingPath = CGPathCreateCopyByStrokingPath(layer.path, nil, 4, .Round, .Miter, 4)

            layer.bounds = CGPathGetPathBoundingBox(strokingPath)

            layer.actions = [
                "strokeStart": NSNull(),
                "strokeEnd": NSNull(),
                "transform": NSNull()
            ]

            self.layer.addSublayer(layer)
        }
    }

编辑:我尝试在按钮、topBar 上使用setNeedsDisplay,并在函数toggleMenudidPresentBBSlideoutMenudidDismissBBSlideoutMenu 中连续使用它们,但没有成功

我也尝试在实际视图(self.view)上调用它

【问题讨论】:

    标签: ios swift core-graphics cocoapods quartz-core


    【解决方案1】:

    尝试调用setNeedsDisplay按钮。

    【讨论】:

    • 我试过了,没用。我会在说明中添加一个说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2019-11-12
    • 2023-03-11
    相关资源
    最近更新 更多