因此,我的应用程序的主屏幕有一个汉堡包按钮,可用于导航到应用程序的其他部分。话虽如此,有人可能会在应用的其他部分收到通知,所以我试图添加一个指标,这只是UILabel
的一个子类,显示在汉堡包上按钮。当视图首次加载时,它看起来像这样,这很好:
好的,所以当用户打开导航抽屉时,我会为汉堡包按钮设置动画并通过隐藏它来移除通知(self.badge.hidden = true
),它会消失,就像这样:
现在我面临的问题是,当视图重新生成动画时,通知徽章会在一个非常奇怪的地方结束,即使没有帧更改,并且如果我打印出帧,它会&#39 ; s应该以编程方式确切位于其中,但它的实际情况最终看起来非常奇怪,就像左上角的小气泡一样:
所有我要添加的内容都在我的委托方法中,当导航抽屉关闭时,我尝试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
}
})
注释掉的代码是我尝试过的其他一些东西。
答案 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()
}
}
})