重新加载视图时,UILabel没有采用适当的帧

时间:2015-11-09 21:52:12

标签: ios swift frame

因此,我的应用程序的主屏幕有一个汉堡包按钮,可用于导航到应用程序的其他部分。话虽如此,有人可能会在应用的其他部分收到通知,所以我试图添加一个指标,这只是UILabel的一个子类,显示在汉堡包上按钮。当视图首次加载时,它看起来像这样,这很好:

好的,所以当用户打开导航抽屉时,我会为汉堡包按钮设置动画并通过隐藏它来移除通知(self.badge.hidden = true),它会消失,就像这样:

enter image description here

现在我面临的问题是,当视图重新生成动画时,通知徽章会在一个非常奇怪的地方结束,即使没有帧更改,并且如果我打印出帧,它会&#39 ; s应该以编程方式确切位于其中,但它的实际情况最终看起来非常奇怪,就像左上角的小气泡一样:

enter image description here

所有我要添加的内容都在我的委托方法中,当导航抽屉关闭时,我尝试self.badge.hidden = false。显然,这里有一些奇怪的东西。

但更奇怪的是,如果我导航到另一个视图,说我按导航抽屉中的一个按钮,然后返回到主视图,那么隐藏工作正常,当我取消隐藏通知徽章,然后它出现在它应该的位置!正如我所说,只有当我离开主屏幕然后返回它时才会发生这种情况,但是当应用程序首次加载并且我转到导航抽屉时,通知徽章会放在错误的位置并且也非常小。我试过很多东西试图让它发挥作用。最初我在重新初始化徽章视图之前,我使用与加载视图时相同的框架将其添加回来,但它仍然以它现在看起来的方式结束。我也尝试将其设置为nil并将其从superView中删除而不是隐藏它,但我尝试过的所有不同的事情都导致了同样的事情:仅在导航前的主屏幕上在其他地方,徽章在关闭导航抽屉后不会在正确的位置结束。我可以发布更多代码或回答您可能遇到的任何其他问题,但请帮助我,我无法解决这个问题!

这是viewDidAppear中的初始化代码:

    badge = SwiftBadge(frame: CGRectMake(15, -5, 15, 15))
    menuButton.addSubview(badge!)
    menuButton.bringSubviewToFront(badge!)

创建我的menuButton(我在viewDidLoad中执行)

menuButton = UIButton(frame: CGRectMake(0, 0, 20, 20))
menuButton.setBackgroundImage(UIImage(named: "Side menu.png"), forState: .Normal)
let addBarItem = UIBarButtonItem(customView: addButton)
let menuButtonItem = UIBarButtonItem(customView: menuButton)
self.navigationItem.setLeftBarButtonItem(menuButtonItem, animated: true)

编辑2:

旋转汉堡包按钮的代码

let animationDuration = self.revealViewController().toggleAnimationDuration
        UIView.animateWithDuration(animationDuration, animations: { () -> Void in
            if !self.menuButtonRotated {
                //self.badge?.removeFromSuperview()
                self.badge?.hidden = true
                self.menuButton.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
                self.menuButtonRotated = true
                print("Menu frame after rotation: \(self.menuButton.frame)")
            } else {
                self.menuButton.transform = CGAffineTransformMakeRotation(CGFloat(0))
                self.menuButtonRotated = false
                self.badge?.hidden = false
            }
            }, completion: { (bool) -> Void in
                if !self.menuButtonRotated {
                //self.badge = SwiftBadge(frame: CGRectMake(250, 250, 100, 100))
                print("New menu frame: \(self.menuButton.frame)")
                print("New badge frame: \(self.badge!.frame)")
                //self.view.addSubview(self.badge!)
                //self.badge?.hidden = false
            }
    })

注释掉的代码是我尝试过的其他一些东西。

1 个答案:

答案 0 :(得分:0)

经过多次调试和拔毛后,我终于找到了解决方法。无论出于何种原因,似乎动画结束后我的menuButton帧都没有设置,所以我不得不将我的动画代码更改为下面的内容,希望这会有助于后来看的人:

UIView.animateWithDuration(animationDuration, animations: { () -> Void in
            if !self.menuButtonRotated {
                self.badge?.hidden = true
                self.badge?.removeFromSuperview()
                self.badge = nil
                self.menuButton.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
                self.menuButtonRotated = true
                print("Menu frame after rotation: \(self.menuButton.frame)")
            } else {
                self.menuButton.transform = CGAffineTransformMakeRotation(CGFloat(0))
                self.menuButtonRotated = false
            }
            }, completion: { (bool) -> Void in
                if !self.menuButtonRotated {
                    print("New menu frame: \(self.menuButton.frame)")
                    print("New badge frame: \(self.badge?.frame)")
                    let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.05 * Double(NSEC_PER_SEC)))
                    dispatch_after(delayTime, dispatch_get_main_queue()) {
                        self.badge = SwiftBadge(frame: CGRectMake(13, -7, 15, 15))
                        self.badge?.alpha = 0.95
                        self.menuButton.addSubview(self.badge!)
                        self.menuButton.layoutIfNeeded()
                    }
            }
})