premium mensajes features efectos con apple ios swift autolayout imessage

ios - features - mensajes con efectos iphone



¿Por qué la guía de diseño superior se mueve en mi extensión de iMessage? (3)

Creo que esto era un error conocido en iOS 10 beta anterior. Tuve el mismo problema y la guía de diseño superior e inferior funciona como espero después de actualizar la versión de iOS a la última.

Tengo una extensión de iMessage y tengo algunos problemas con la guía de diseño superior. Tengo un MSMessagesAppViewController que maneja los cambios entre los estilos de presentación. En mi extensión, tengo un botón. Cuando hace clic, realizo la transición al estilo de presentación ampliado y luego presento un controlador de vista de forma modal. Aquí está el problema: mi IU en el segundo VC se está ocultando detrás de la barra de navegación superior. Pensé que esto era extraño ya que establecí mis limitaciones en la guía de diseño superior. Así que busqué en mi código y comencé a depurar la guía de diseño superior. Noté que después de la transición al estilo de presentación ampliado, topLayoutGuide.length = 86. Así es como debería ser. Pero cuando presento el segundo controlador de vista modalmente, la guía de diseño superior se restablece a 0. ¿Por qué no es 86 como debería ser? Aquí está mi código:

En mi viewController principal:

@IBAction func addStickerButtonPressed(_ sender: AnyObject) { shouldPerformCreateSegue = true theSender = sender requestPresentationStyle(.expanded) } override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) { if presentationStyle == .expanded { if shouldPerformCreateSegue == true { shouldPerformCreateSegue = false performSegue(withIdentifier: "CreateStickerSegue", sender: theSender)//here is where I present the new viewController } else { searchBar.becomeFirstResponder() searchBar.placeholder = nil searchBar.showsCancelButton = true searchBar.tintColor = UIColor.white } } else { searchBar.showsCancelButton = false } print(topLayoutGuide.length) //This prints out 86 }

En el otro controlador de vista presentado de forma modal:

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.view.addConstraint(navBar.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor)) print(topLayoutGuide.length) //This prints out 0 }


Como solución alternativa utilizo UIPresentationController , que cambia el controlador de vista modal por los puntos de topLayoutGuide.length :

class MyViewController: MSMessagesAppViewController { private func presentModalViewController() { let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = .savedPhotosAlbum imagePicker.modalPresentationStyle = .custom imagePicker.transitioningDelegate = self present(imagePicker, animated: true, completion: nil) } } // MARK: - UIViewControllerTransitioningDelegate extension MyViewController: UIViewControllerTransitioningDelegate { func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { let vc = PresentationController(presentedViewController: presented, presenting: presenting) // I really don''t want to hardcode the value of topLayoutGuideLength here, but when the extension is in compact mode, topLayoutGuide.length returns 172.0. vc.topLayoutGuideLength = topLayoutGuide.length > 100 ? 86.0 : topLayoutGuide.length return vc } } class PresentationController: UIPresentationController { var topLayoutGuideLength: CGFloat = 0.0 override var frameOfPresentedViewInContainerView: CGRect { guard let containerView = containerView else { return super.frameOfPresentedViewInContainerView } return CGRect(x: 0, y: topLayoutGuideLength, width: containerView.bounds.width, height: containerView.bounds.height - topLayoutGuideLength) } }

El único problema es cuando llama a presentModalViewController desde el modo compacto, topLayoutGuide.length es topLayoutGuide.length por un motivo desconocido. Así que tuve que codificar un valor para ese caso.


Utilicé una versión ligeramente variada de Andrey

class MyViewController: MSMessagesAppViewController { private func presentModalViewController() { let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = .savedPhotosAlbum imagePicker.modalPresentationStyle = .custom imagePicker.transitioningDelegate = self present( imagePicker, animated: true, completion: nil ) } } extension MyViewController: UIViewControllerTransitioningDelegate { func presentationController( forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController ) -> UIPresentationController? { let vc = PresentationController( presentedViewController: presented, presenting: presenting ) vc.framePresented = modalBoundaries.frame return vc } } class PresentationController: UIPresentationController { var framePresented = CGRect.zero override var frameOfPresentedViewInContainerView: CGRect { return framePresented } }

modalBoundaries es una UIView ficticia restringida (a través de XIB en mi caso) para respetar cualquier longitud de TopLayoutGuide.