Voice Chat UI improvements

This commit is contained in:
Ilya Laktyushin
2020-12-09 20:51:11 +04:00
parent 0a8d06f51f
commit f7c6962e78
12 changed files with 110 additions and 59 deletions

View File

@@ -26,20 +26,23 @@ public final class VoiceChatOverlayController: ViewController {
}
private var isButtonHidden = false
private var isSlidOffscreen = false
func update(hidden: Bool, slide: Bool, animated: Bool) {
guard let actionButton = self.controller?.actionButton, actionButton.supernode === self else {
return
}
if self.isButtonHidden == hidden {
if self.isButtonHidden == hidden || (!slide && self.isSlidOffscreen) {
return
}
self.isButtonHidden = hidden
if animated {
let transition: ContainedViewLayoutTransition = .animated(duration: 0.4, curve: .spring)
if hidden {
if slide {
self.isSlidOffscreen = true
transition.updateSublayerTransformOffset(layer: actionButton.layer, offset: CGPoint(x: 70.0, y: 0.0))
} else {
actionButton.layer.removeAllAnimations()
actionButton.layer.animateScale(from: 1.0, to: 0.001, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false, completion: { [weak actionButton] _ in
@@ -48,7 +51,8 @@ public final class VoiceChatOverlayController: ViewController {
}
} else {
if slide {
self.isSlidOffscreen = false
transition.updateSublayerTransformOffset(layer: actionButton.layer, offset: CGPoint())
} else {
actionButton.layer.removeAllAnimations()
actionButton.isHidden = false
@@ -135,7 +139,7 @@ public final class VoiceChatOverlayController: ViewController {
}
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if let actionButton = self.controller?.actionButton, actionButton.supernode === self {
if let actionButton = self.controller?.actionButton, actionButton.supernode === self && !self.isButtonHidden {
let actionButtonSize = CGSize(width: 84.0, height: 84.0)
let actionButtonFrame = CGRect(origin: CGPoint(x: actionButton.position.x - actionButtonSize.width / 2.0, y: actionButton.position.y - actionButtonSize.height / 2.0), size: actionButtonSize)
if actionButtonFrame.contains(point) {
@@ -169,17 +173,49 @@ public final class VoiceChatOverlayController: ViewController {
return self.displayNode as! Node
}
init(actionButton: VoiceChatActionButton) {
private var disposable: Disposable?
init(actionButton: VoiceChatActionButton, navigationController: NavigationController?) {
self.actionButton = actionButton
super.init(navigationBarPresentationData: nil)
self.statusBar.statusBarStyle = .Ignore
self.additionalSideInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 75.0)
if let navigationController = navigationController {
let controllers: Signal<[UIViewController], NoError> = .single([])
|> then(navigationController.viewControllersSignal)
let overlayControllers: Signal<[UIViewController], NoError> = .single([])
|> then(navigationController.overlayControllersSignal)
self.disposable = (combineLatest(queue: Queue.mainQueue(), controllers, overlayControllers)).start(next: { [weak self] controllers, overlayControllers in
if let strongSelf = self {
var hasVoiceChatController = false
for controller in controllers {
if controller is VoiceChatController {
hasVoiceChatController = true
}
}
var hidden = true
if controllers.count == 1 || controllers.last is ChatController {
hidden = false
}
if overlayControllers.count > 0 {
hidden = true
}
if hasVoiceChatController {
hidden = false
}
strongSelf.controllerNode.update(hidden: hidden, slide: true, animated: true)
}
})
}
}
deinit {
print("")
self.disposable?.dispose()
}
required init(coder aDecoder: NSCoder) {