5
votes

ios13 UIPopoverViewController montrant UITableViewController - Problèmes de zone sûre / Parties manquantes de la table

Dans le même thème que ce post:

iOS 13 - UIPopoverPresentationController sourceview content visible dans la flèche

J'ai un UITableViewController instancié à partir du Storyboard. Je le présente dans un UIPopoverViewController.

Selon l'orientation, j'ai un côté manquant ou le haut manquant et le contenu de _UITableViewHeaderFooterViewBackground fait défiler la flèche.

Qu'est-ce qui ne va pas:

Ce sont quand c'est sur le dessus, mais si ça se présente sur le côté alors tout le côté

entrez la description de l'image ici entrez la description de l'image ici

entrez la description de l'image ici

MODIFIER: J'utilise les guides de zone de sécurité:

entrez la description de l'image ici

Comme je l'ai dit précédemment, j'ai fait glisser depuis la bibliothèque d'objets un tout nouvel UITVC, puis j'ai modifié la cellule prototype en fonction des exigences de mon application.

Je n'ai apporté aucune modification aux commutateurs ou paramètres de zone de sécurité.

Je ne modifie aucun insert de zone de sécurité ni aucun ajustement du code.

Alors, merci @Alex, mais ce n'est pas le problème, ou si c'est le cas, je ne sais pas quoi faire.

MODIFIER 2:

Cet après-midi, je me suis assuré de n'avoir aucun code dans mes classes qui effectue le formatage, les couleurs, les insertions ou TOUT ce qui concerne TOUTE forme de modification des cellules de tableau par défaut.

J'ai ensuite complètement supprimé mon UITVC dans IB et en ai créé un nouveau, j'ai créé une nouvelle cellule prototype sans style, sauf pour mettre une UIImageView dans la cellule.

J'ai veillé à ce que l'UITVC, la tableviewcell et la vue de contenu aient tous `` Safe Area '' et `` Safe Margins '' cochés dans IB.

Reconstruction de l'application et exécution.

EXACTEMENT LE MÊME.

J'ai toujours le contenu et l'arrière-plan sur la flèche et si j'ajoute ensuite une bordure autour de la table, le côté de présentation est «coupé».

MODIFIER 3:

JE SAIS QUEL EST LE PROBLÈME!!!

C'est le _UITableViewHeaderFooterViewBackground qui ne joue pas bien avec AutoLayout !!

Je ne sais pas comment y remédier, mais c'est là le problème.

entrez la description de l'image ici

EDIT 4 / Mise à jour:

Aujourd'hui, j'ai créé l'application suivante, et le bogue est toujours présent - même sans les en-têtes de section!

  1. Dans IB, créez un UIVC avec deux boutons, l'un en haut à gauche, l'autre en haut à droite.

  2. Faites glisser un UITVC depuis le catalogue d'actifs et placez-le sur un côté du VC d'origine, puis faites glisser un UIVC de la bibliothèque d'actifs et placez-le de l'autre côté.

  3. Faites glisser un UITableView de la bibliothèque d'éléments sur le `` nouveau '' UIViewController et réglez-le simplement en haut et en bas sur les dispositions de la zone de sécurité du guide et la gauche et la droite sur les marges de sécurité avec une constante 0 (vous pouvez conserver la valeur par défaut 20 - ne fait aucune différence ).

  4. Maintenant, connectez ces boutons à l'UIVC d'origine afin que chaque pression sur chacun instancie l'un ou les deux autres contrôleurs et les affiche dans un popover.

Remarquez qu'il n'y a pas de mise en forme, pas de style, pas de modification des paramètres IB par défaut sur l'un des UIViewControllers.

Voici le code VC 'central':

import UIKit



class LibraryTableViewController: UITableViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()

        self.tableView.delegate = self
        self.tableView.dataSource = self
    }



    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }



    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        // #warning Incomplete implementation, return the number of rows
        return 10
    }



    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as? MyTableViewCell else
        {
            fatalError("expected to dequeue MenuItemTableCell - check storyboard")
        }

        return cell
    }
}

Voici la mise en page dans IB - notez que j'ai changé les couleurs d'arrière-plan de toutes les vues différemment afin que vous puissiez voir quelles vues posent des problèmes.

entrez la description de l'image ici

Et voici le code de chacun des VC latéraux:

import UIKit



class LibraryViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{
    @IBOutlet weak var table: UITableView!



    override func viewDidLoad()
    {

    }



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        12
    }



    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as? MyTableViewCell else
        {
            fatalError("expected to dequeue MenuItemTableCell - check storyboard")
        }

        return cell
    }
}

et l'autre:

import UIKit



class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
{
    @IBOutlet weak var tbutton: UIButton!
    @IBOutlet weak var button: UIButton!



    @IBAction func buttonTouched(_ sender: UIButton)
    {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let libraryVC = storyboard.instantiateViewController(withIdentifier: "library")

        libraryVC.modalPresentationStyle = .popover

        if let popover = libraryVC.popoverPresentationController
        {
            popover.sourceView = self.button
            popover.sourceRect = self.button.bounds

            popover.delegate = self
        }

        libraryVC.preferredContentSize = CGSize(width: 400, height: 2048)

        libraryVC.view.layer.borderColor  = UIColor.white.cgColor
        libraryVC.view.layer.borderWidth  = 5.0
        libraryVC.view.layer.cornerRadius = 16.0

        self.present(libraryVC, animated: true)

    }



    @IBAction func tbuttonTouched(_ sender: UIButton)
    {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let libraryVC = storyboard.instantiateViewController(withIdentifier: "tlibrary")

        libraryVC.modalPresentationStyle = .popover

        if let popover = libraryVC.popoverPresentationController
        {
            popover.sourceView = self.tbutton
            popover.sourceRect = self.tbutton.bounds

            popover.delegate = self
        }

        libraryVC.preferredContentSize = CGSize(width: 400, height: 2048)

        libraryVC.view.layer.borderColor  = UIColor.white.cgColor
        libraryVC.view.layer.borderWidth  = 5.0
        libraryVC.view.layer.cornerRadius = 16.0

        self.present(libraryVC, animated: true)
    }



    func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
    {
        return .none
    }

Voici la configuration IB:

entrez la description de l'image ici

entrez la description de l'image ici Et voici les résultats:

entrez la description de l'image ici entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici


6 commentaires

Vous ne devez pas tenter de définir les contraintes de la vue de table dans un UITableViewController . Il sera déjà configuré pour faire les bonnes choses.


Assurez-vous de n'ajouter que des éléments à la cellule du tableau dans son contentView .


@rmaddy Ok, mais cela contredit les 'suggestions' dans les commentaires du post de pile auquel j'ai lié. Si je ne fais rien, j'obtiens les images d'en haut mais pas d'avertissement de contrainte conflictuelle.


iOS 13 modifie délibérément la façon dont le contenu est affiché dans un popover afin que le contenu s'affiche par défaut dans la flèche. Utilisez la zone de sécurité pour garder des objets à l'intérieur de la partie non fléchée du popover. Pour une vue tableau, il n'y a rien à faire d'autre que de s'assurer que vos sous-vues de cellule sont placées dans le contentView de la cellule. Et votre problème réel n'est pas clair. Les images ne montrent pas du tout quel est votre problème. Et vous n'avez pas montré de code pertinent pour votre vue de table.


Je n'ai pas de code `` pertinent '' dans UITableView car je n'ai rien fait dans la vue tableau, sauf afficher les lignes relatives aux données, comme dans toutes les autres tables. Rien de spécifique ou d'unique à ce sujet en ce qui concerne les «zones sûres» ou les «retraits», etc. Vous pouvez peut-être démontrer un code ou une implémentation «correct» et que je peux vérifier?


Continuons cette discussion en chat .


3 Réponses :


0
votes

Il semble que vous n'utilisez pas les nouveaux guides de disposition des zones de sécurité. L'ancienne méthode est obsolète. Si vous utilisez le storyboard, veuillez activer ce paramètre dans l'onglet Fichier:

entrez la description de l'image ici

Dans le code, vous pouvez utiliser quelque chose comme ceci:

let guide = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
 greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
 guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
])

Pour plus d'informations, lisez ceci: https://useyourloaf.com/blog/safe-area-layout-guide/


3 commentaires

Veuillez voir ma modification. J'utilise ces guides. Tout comme le blog l'a dit, que j'ai lu quand c'était dans l'autre question principale sur ce problème. Je ne comprends vraiment pas où je me suis trompé.


@iOSProgrammingIsFun Utilisez-vous du code pour changer la mise en page? Je ne vois aucun problème non plus, donc nous avons besoin d'un peu plus de contexte. On dirait que vous utilisez des TableViewCells assez personnalisées sur les captures d'écran.


Salut. Comme je l'ai déjà dit dans ma question initiale, non, je ne le fais pas. Bien sûr, je change les couleurs et la largeur des bordures, etc. J'ai aussi des en-têtes de section et eux aussi souffrent des mêmes problèmes. mais même - comme mes images le montrent - l'UITableView a le problème .. donc ce n'est pas quelque chose de lié à la cellule. J'ai même supprimé mon UITVC d'IB et j'ai recommencé.



1
votes

J'ai trouvé la réponse. Je dois implémenter mon propre UIPopoverBackgroundView. Exemple: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch09p476popovers/ch22p751popovers/MyPopoverBackgroundView.swift Cela fonctionne pour moi. mon popover


0 commentaires

0
votes

D'accord, j'ai donc utilisé un ticket d'assistance avec Apple à ce sujet - après un an ici sans réponse.

L'ancienne méthode (définir la bordure sur le popover) ne fonctionnera plus jamais à cause de la mise en page automatique sous le capot qui se passe avec UITableViewController et c'est UITableView.

La seule solution consiste à supprimer complètement UITableViewController et à le remplacer par un UIViewController, avec une seule vue, et à l'intérieur de cette vue, placer un UITableView.

Heureusement, les changements de code sont minimes (il suffit de changer l'héritage de UITableViewController à UIViewController, puis d'ajouter un UITableViewDelegate dans)

Assurez-vous ensuite que l'UIViewController contenant la table se définit comme délégué et source de UITableView.

La partie la plus longue du correctif consiste à recréer la mise en page dans Interface Builder, mais cette fois, assurez-vous que UITableView n'obtient pas le haut, le début, le bas, la fin de SUPERVIEW, mais plutôt la ZONE SÉCURISÉE.

Ensuite, tout ce que vous avez à faire est de mettre ceci, et cela fonctionne:

override func viewDidLoad()
{
    super.viewDidLoad()
  
    self.tableView.delegate   = self
    self.tableView.dataSource = self
    
    self.tableView.layer.borderWidth  = 5
    self.tableView.layer.borderColor  = UIColor.white.cgColor
    self.tableView.layer.cornerRadius = 16
}


0 commentaires