Puede ser la primera librería Toast adaptada a iOS Smart Island en toda la red - JFPopup

Me inscribí en el primer desafío del Proyecto Golden Stone: comparta el pozo de premios de 100,000, este es mi segundo artículo, haga clic para ver los detalles del evento

prefacio

Un artículo que escribí el año pasado presentó en detalle un conjunto de bibliotecas de componentes emergentes de Swift que escribí, un elegante componente emergente de Swift: JFPopup . En él se adapta un conjunto de ToastView, que coincide con un nuevo conjunto de estilo interactivo de Smart Island para la serie Apple iPhone14 Pro y superior de este año, por lo que inesperadamente pensé si ToastView también se puede adaptar a Smart Island, por lo que este artículo entró en siendo. Mi último artículo ha presentado en detalle el uso específico de JFPopup.Este artículo explica principalmente el proceso mental de adaptación a Smart Island.

Efecto específico:

uso

Aunque ya lo he presentado en el último artículo, lo volveré a escribir aquí. Además, Smart Island Toast es compatible con iPhone 14 Pro y modelos superiores de forma predeterminada, y no se requiere ninguna operación adicional. Si no es un modelo de Smart Island, está centrado de forma predeterminada y también es compatible con la parte superior e inferior. Para obtener parámetros más detallados, consulte un elegante componente emergente de Swift: JFPopup

Brindis:


//默认仅文案

JFPopupView.popup.toast(hit: "默认toast,支持灵动岛")

//带logo ,内置success or fail

JFPopupView.popup.toast(hit: "支付成功", icon: .success)

JFPopupView.popup.toast(hit: "支付失败", icon: .fail)

//自定义logo

JFPopupView.popup.toast(hit: "自定义", icon: .imageName(name: "face"))

复制代码

Cargando:


DispatchQueue.main.async {

JFPopupView.popup.loading()

}

DispatchQueue.main.asyncAfter(deadline: .now() + 3) {

JFPopupView.popup.hideLoading()

JFPopupView.popup.toast(hit: "刷新成功")

}

复制代码

El proceso específico de adaptación a Smart Island

Dado que Apple ha dicho oficialmente que ActivityKit se lanzará en la segunda mitad del año, se añadirá la Api que se adapta a Smart Island. Por lo tanto, actualmente no existe una API oficial que se pueda adaptar para nosotros. Así que solo puedo morder la bala y pensar en el plan de adaptación por mi cuenta.

- En primer lugar, debe conocer el tamaño del área de Smart Island

Usamos el método más estúpido para tomar directamente una captura de pantalla del simulador para calcular el tamaño por nosotros mismos. Se puede restaurar al menos el 99% del efecto. Como se muestra en la figura, el área de Smart Island tiene aproximadamente 120 dt de ancho y 34 dp de alto, y la esquina semicircular tiene naturalmente 17 dt. Aproximadamente 10 dp en la parte superior y centrado en la pantalla. Con esta información, podemos simular naturalmente los efectos de transición de acercamiento y alejamiento de Smart Island.

- Se agregó animación Smart Island a ToastView

Hemos agregado la enumeración de animación de Smart Island sobre la base original


public enum JFToastPosition {

case center

case top

case bottom

case dynamicIsland //新增灵动岛位置动画

}

复制代码

El código de animación de transición para volver a implementar los protocolos de presente y descarte es el siguiente

Expandir:


let originSize = contianerView.jf.size

if config.toastPosition == .dynamicIsland {

contianerView.jf_size = CGSize(width: 120, height: 34)

contianerView.center = CGPoint(x: CGSize.jf.screenSize().width / 2, y: 27)

}

let updateV = {

contianerView.center = CGPoint(x: CGSize.jf.screenSize().width / 2, y: CGSize.jf.screenSize().height / 2)

if config.toastPosition == .top {

contianerView.jf_top = CGFloat.jf.navigationBarHeight() + 15

} else if config.toastPosition == .bottom {

contianerView.jf_bottom = CGSize.jf.screenHeight() - CGFloat.jf.safeAreaBottomHeight() - 15

} else if config.toastPosition == .dynamicIsland {

contianerView.jf_size = originSize

contianerView.center = CGPoint(x: CGSize.jf.screenSize().width / 2, y: originSize.height / 2 + 10)

}

contianerView.layoutIfNeeded()

}

guard config.withoutAnimation == false else {

updateV()

transitonContext?.completeTransition(true)

completion?(true)

return

}

if config.toastPosition == .dynamicIsland {

UIView.animate(withDuration: 0.25) {

updateV()

} completion: { finished in

transitonContext?.completeTransition(true)

completion?(finished)

}

return

}

复制代码

desaparecer:


UIView.animate(withDuration: 0.25, animations: {

if config.toastPosition == .dynamicIsland {

contianerView?.layer.cornerRadius = 17

contianerView?.jf_size = CGSize(width: 120, height: 34)

contianerView?.center = CGPoint(x: CGSize.jf.screenSize().width / 2, y: 27)

}

contianerView?.subviews.forEach({ v in

if config.toastPosition == .dynamicIsland {

v.isHidden = true

} else {

v.alpha = 0

}

})

contianerView?.alpha = 0

}) { (finished) in

transitonContext?.completeTransition(true)

completion?(finished)

}

复制代码

final

Lo anterior es todo el proceso de adaptación de mi componente integrado JFPopup JFToastView a la animación de Smart Island. Si Apple actualiza la Api en la segunda mitad del año, la readaptaré lo antes posible.

Supongo que te gusta

Origin juejin.im/post/7145630021372084232
Recomendado
Clasificación