mirror of https://github.com/xaoxuu/ProHUD
默认动画
This commit is contained in:
parent
e7029c3751
commit
6eee00880b
|
@ -58,43 +58,20 @@ class CapsuleVC: ListVC {
|
|||
}
|
||||
|
||||
list.add(title: "不同位置、不同动画") { section in
|
||||
section.add(title: "顶部,缩放") {
|
||||
section.add(title: "顶部,默认滑入") {
|
||||
Capsule(.info("一条简短的消息")) { capsule in
|
||||
capsule.config.animateBuildIn { window, completion in
|
||||
let duration = 1.0
|
||||
let d0 = duration * 0.2
|
||||
let d1 = duration
|
||||
window.transform = .init(scaleX: 0.001, y: 0.001)
|
||||
window.alpha = 0
|
||||
UIView.animate(withDuration: d0, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0.5) {
|
||||
window.transform = .init(scaleX: 0.01, y: 0.5)
|
||||
}
|
||||
UIView.animate(withDuration: d1, delay: d0 * 0.2, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5) {
|
||||
window.transform = .identity
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
UIView.animate(withDuration: duration * 0.4, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1) {
|
||||
window.alpha = 1
|
||||
}
|
||||
}
|
||||
capsule.config.animateBuildOut { window, completion in
|
||||
let duration = 0.8
|
||||
UIView.animate(withDuration: duration, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1) {
|
||||
window.transform = .init(scaleX: 0.0001, y: 0.5)
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
UIView.animate(withDuration: duration * 0.6, delay: duration * 0.4, usingSpringWithDamping: 1, initialSpringVelocity: 1) {
|
||||
window.alpha = 0
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
section.add(title: "中间,默认缩放") {
|
||||
Capsule(.middle.info("一条简短的消息")) { capsule in
|
||||
|
||||
}
|
||||
}
|
||||
section.add(title: "中间,黑底白字,透明渐变") {
|
||||
Capsule(.middle.info("一条简短的消息")) { capsule in
|
||||
capsule.config.tintColor = .white
|
||||
capsule.config.cardCornerRadius = 4
|
||||
capsule.config.cardCornerRadius = 8
|
||||
capsule.config.contentViewMask { mask in
|
||||
mask.layer.backgroundColor = UIColor.black.withAlphaComponent(0.75).cgColor
|
||||
}
|
||||
|
@ -118,11 +95,13 @@ class CapsuleVC: ListVC {
|
|||
}
|
||||
}
|
||||
}
|
||||
section.add(title: "底部,渐变背景,回弹滑入") {
|
||||
section.add(title: "底部,渐变背景,默认回弹滑入") {
|
||||
Capsule(.bottom.enter("点击进入")) { capsule in
|
||||
capsule.config.tintColor = .white
|
||||
capsule.config.cardEdgeInsets = .init(top: 16, left: 24, bottom: 16, right: 24)
|
||||
capsule.config.customTextLabel { label in
|
||||
label.textColor = .white
|
||||
label.font = .boldSystemFont(ofSize: 16)
|
||||
}
|
||||
capsule.config.contentViewMask { mask in
|
||||
mask.effect = .none
|
||||
|
@ -137,24 +116,6 @@ class CapsuleVC: ListVC {
|
|||
mask.layer.insertSublayer(gradientLayer, at: 0)
|
||||
}
|
||||
capsule.config.cardCornerRadius = .infinity
|
||||
capsule.config.animateBuildIn { window, completion in
|
||||
window.transform = .init(translationX: 0, y: 240)
|
||||
window.alpha = 0
|
||||
UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 0.75, initialSpringVelocity: 0.5) {
|
||||
window.transform = .identity
|
||||
window.alpha = 1
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
}
|
||||
capsule.config.animateBuildOut { window, completion in
|
||||
UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0.5) {
|
||||
window.transform = .init(translationX: 0, y: 240)
|
||||
window.alpha = 0
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
}
|
||||
}.onTapped { capsule in
|
||||
Alert(.message("收到点击事件").duration(1)).push()
|
||||
capsule.pop()
|
||||
|
@ -181,7 +142,7 @@ extension Capsule.ViewModel {
|
|||
func enter(_ text: String?) -> Self {
|
||||
self.message(text)
|
||||
.icon(.init(systemName: "arrow.right.circle.fill"))
|
||||
.duration(.infinity)
|
||||
// .duration(.infinity)
|
||||
}
|
||||
|
||||
static var systemError: Self {
|
||||
|
|
|
@ -54,6 +54,10 @@ open class Capsule: Controller {
|
|||
|
||||
@objc public var position: Position = .top
|
||||
|
||||
public func position(position: Position) -> Self {
|
||||
self.position = position
|
||||
return self
|
||||
}
|
||||
public static var top: Self {
|
||||
let obj = Self.init()
|
||||
obj.position = .top
|
||||
|
|
|
@ -62,18 +62,45 @@ extension Capsule: HUD {
|
|||
navEvents[.onViewWillAppear]?(self)
|
||||
if isNew {
|
||||
window.isHidden = false
|
||||
func completion() {
|
||||
self.navEvents[.onViewDidAppear]?(self)
|
||||
}
|
||||
if let animateBuildIn = config.animateBuildIn {
|
||||
animateBuildIn(window) {
|
||||
self.navEvents[.onViewDidAppear]?(self)
|
||||
}
|
||||
animateBuildIn(window, completion)
|
||||
} else {
|
||||
let duration = config.animateDurationForBuildInByDefault
|
||||
window.transform = .init(translationX: 0, y: -window.frame.maxY - 20)
|
||||
UIView.animateEaseOut(duration: duration) {
|
||||
window.transform = .identity
|
||||
} completion: { done in
|
||||
self.navEvents[.onViewDidAppear]?(self)
|
||||
switch position {
|
||||
case .top:
|
||||
window.transform = .init(translationX: 0, y: -window.frame.maxY - 20)
|
||||
UIView.animateEaseOut(duration: duration) {
|
||||
window.transform = .identity
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
case .middle:
|
||||
let d0 = duration * 0.2
|
||||
let d1 = duration
|
||||
window.transform = .init(scaleX: 0.001, y: 0.001)
|
||||
window.alpha = 0
|
||||
UIView.animate(withDuration: duration, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5) {
|
||||
window.transform = .identity
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
UIView.animate(withDuration: duration * 0.4, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1) {
|
||||
window.alpha = 1
|
||||
}
|
||||
case .bottom:
|
||||
let offsetY = AppContext.appBounds.height - newFrame.maxY + 100
|
||||
window.transform = .init(translationX: 0, y: offsetY)
|
||||
UIView.animate(withDuration: duration, delay: 0, usingSpringWithDamping: 0.75, initialSpringVelocity: 0.5) {
|
||||
window.transform = .identity
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
} else {
|
||||
view.layoutIfNeeded()
|
||||
|
@ -91,21 +118,41 @@ extension Capsule: HUD {
|
|||
guard let window = attachedWindow, let windowScene = windowScene else { return }
|
||||
AppContext.capsuleWindows[windowScene]?[vm.position] = nil
|
||||
navEvents[.onViewWillDisappear]?(self)
|
||||
func completion() {
|
||||
window.isHidden = true
|
||||
window.transform = .identity
|
||||
self.navEvents[.onViewDidDisappear]?(self)
|
||||
}
|
||||
if let animateBuildOut = config.animateBuildOut {
|
||||
animateBuildOut(window) {
|
||||
window.isHidden = true
|
||||
window.transform = .identity
|
||||
self.navEvents[.onViewDidAppear]?(self)
|
||||
}
|
||||
animateBuildOut(window, completion)
|
||||
} else {
|
||||
let duration = config.animateDurationForBuildOutByDefault
|
||||
UIView.animateEaseOut(duration: duration) {
|
||||
window.transform = .init(translationX: 0, y: -window.frame.maxY - 20)
|
||||
} completion: { done in
|
||||
window.isHidden = true
|
||||
window.transform = .identity
|
||||
self.navEvents[.onViewDidDisappear]?(self)
|
||||
let oldFrame = window.frame
|
||||
switch vm.position {
|
||||
case .top:
|
||||
UIView.animateEaseOut(duration: duration) {
|
||||
window.transform = .init(translationX: 0, y: -oldFrame.maxY - 20)
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
case .middle:
|
||||
UIView.animate(withDuration: duration * 0.6, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0.5) {
|
||||
window.transform = .init(scaleX: 0.001, y: 0.001)
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
UIView.animate(withDuration: duration * 0.4, delay: duration * 0.2, usingSpringWithDamping: 1, initialSpringVelocity: 0.5) {
|
||||
window.alpha = 0
|
||||
}
|
||||
case .bottom:
|
||||
let offsetY = AppContext.appBounds.height - oldFrame.maxY + 100
|
||||
UIView.animate(withDuration: duration, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0) {
|
||||
window.transform = .init(translationX: 0, y: offsetY)
|
||||
} completion: { done in
|
||||
completion()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue