web-dev-qa-db-fra.com

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

Lorsque j'affiche une vue dans UIPopoverPresentationController et la présente comme popover

popoverCon?.modalPresentationStyle = UIModalPresentationStyle.popover

le contenu s'est déplacé vers le haut et une partie est affichée dans la flèche.

enter image description here

De plus, j'avais une frontière autour du popover

popoverCon?.view.layer.borderColor = .orange
popoverCon?.view.layer.borderWidth = 1.0;
popoverCon?.view.layer.cornerRadius = 10.0;
popoverCon?.view.layer.masksToBounds = false;

il ne montre pas vers la partie où se trouve la flèche, mais il affiche un peu de la ligne de bordure à l'extrémité de la flèche.

enter image description here

Cela fonctionnait bien jusqu'à iOS 12, mais dans iOS 13, ce problème arrive.

Des suggestions sur la façon dont je peux résoudre ce problème?

19
Hassy

Le haut de mon contenu tableView a été coupé par la flèche. Voici comment je l'ai corrigé dans mon cas (code inséré dans ma tableViewController Swift):

override func viewSafeAreaInsetsDidChange() {
    if #available(iOS 11.0, *) {
        super.viewSafeAreaInsetsDidChange()
        self.tableView.contentInset = UIEdgeInsets(top: self.tableView.safeAreaInsets.top, left: 0, bottom: 0, right: 0)
    }
}
4
powertoold

C'est définitivement une fonctionnalité, ils veulent que vous utilisiez une zone sûre depuis iOS 11, en fait, mais il semble maintenant qu'ils veulent vous forcer à l'utiliser

A eu le même problème que vous, cela a fonctionné pour moi https://useyourloaf.com/blog/safe-area-layout-guide/

3
SaintMSent

Ma solution en Obj-C, pour ceux qui ont besoin d'une solution obj-c.

Je n'avais auparavant que popovercontroller, ce qui créait l'erreur comme indiqué dans la question. Je l'ai renommé childController pour plus de clarté et créé un popoverController contenant pour faire fonctionner la solution proposée par @SaintMSent dans ma situation d'une seule vue à l'origine. Également utilisé https://stackoverflow.com/a/47076040/2148757 solution et https://useyourloaf.com/blog/self-sizing-child-views/ à redimensionner de manière appropriée car tous mes childControllers définissent fréquemment la taille de contenu préférée.

//Create container popover controller and add child to it
UIViewController* popoverController = [[MyParentPopoverController alloc] init];
[popoverController.view addSubview:childController.view];
[popoverController addChildViewController:childController];
[popoverController setPreferredContentSize:childController.preferredContentSize];
//set popover settings on container
popoverController.modalPresentationStyle = UIModalPresentationPopover;
popoverController.popoverPresentationController.sourceRect = sourceRect;
popoverController.popoverPresentationController.sourceView = buttonView;
popoverController.popoverPresentationController.permittedArrowDirections = direction;
//Fix ios13 'bug' that Apple claims is a feature
UILayoutGuide* guide = popoverController.view.safeAreaLayoutGuide;
childController.view.translatesAutoresizingMaskIntoConstraints = NO;
[childController.view.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
[childController.view.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
[childController.view.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
[childController.view.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;
[popoverController.view layoutIfNeeded];
//Show the popover

...

@interface MyParentPopoverController : UIViewController

@end

@implementation MyParentPopoverController

-(void)preferredContentSizeDidChangeForChildContentContainer:(id <UIContentContainer>)container {
    [super preferredContentSizeDidChangeForChildContentContainer:container];
    [self setPreferredContentSize:container.preferredContentSize];
}

@end

Remarque: je n'ai pas vérifié la compatibilité ios11 car ma base d'utilisateurs est limitée à ne pas l'utiliser.

3
Sashah

Vous devez utiliser des contraintes. Et faites également attention à topAnchor. Il doit être safeAreaLayoutGuide.topAnchor. Dans mon cas, cela fonctionne correctement. Par exemple:

[NSLayoutConstraint activateConstraints:@[
        [toolbar.leftAnchor constraintEqualToAnchor:self.view.leftAnchor],
        [toolbar.rightAnchor constraintEqualToAnchor:self.view.rightAnchor],
        [toolbar.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor],
        [toolbar.heightAnchor constraintEqualToConstant:50]
    ]];
1
Nikita

Je n'ai pas encore de "réponse", mais j'ai identifié ce qui se passe et pourquoi c'est si difficile à résoudre.

ios13 UIPopoverViewController montrant UITableViewController - Problèmes de zone de sécurité/Parties manquantes du tablea

Fondamentalement, tout UITableView qui a des en-têtes ou des pieds de page va être cassé dans iOS 13, sauf s'il existe un moyen de modifier le _UITableViewHeaderFooterViewBackground

Cela est notoirement problématique et ne fonctionne pas bien avec la mise en page automatique - cela est connu depuis des années, mais Apple ne l'a jamais corrigé ou rendu plus facile à traiter et plus connu du public.

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=video&cd=1&cad=rja&uact=8&ved=0ahUKEwibouuozfvkAhVCXRUIHVGsBegQtwIIKjAA&url=h2F%% 3Fv% 3DajsCY8SjJ1Y & usg = AOvVaw3_U_jy9EWH2dJrM8p-XhDQ

https://spin.atomicobject.com/2016/10/12/auto-layout-uitableview/

Je ne peux pas pousser mon application sur l'App Store jusqu'à ce que j'obtienne ce tri. J'espère que quelqu'un pourra identifier comment manipuler cette vue afin qu'elle arrête de repousser les limites de la table avec AutoLayout, ce qui provoque cette intrusion dans la zone de sécurité .

1

Certainement un bug. Lorsque vous avez une situation où vous utilisez UIPopoverArrowDirectionAny, vous verrez que le problème existe uniquement lorsque la flèche se trouve en haut ou à gauche du popover et non pas lorsque la flèche apparaît à droite ou en bas du popover. Si vous effectuez des ajustements dans votre code pour compenser, cela fonctionnera si vous utilisez UIPopoverArrowDirectionUp ou UIPopoverArrowDirectionLeft mais ne s'affichera pas correctement en utilisant cet ajustement lorsque vous utilisez UIPopoverArrowDirectionAny et la fenêtre contextuelle apparaît au-dessus ou à droite du rectangle cible.

1
SoftmasterG

Recherche sur Internet, j'ai obtenu de l'aide à partir du lien suivant

Twitter

j'ai donc dû ajouter une zone de sécurité et gérer mes vues en conséquence

CGFloat topPadding = 0.0;
    if (@available(iOS 11.0, *)) {
         topPadding = self.view.safeAreaLayoutGuide.layoutFrame.Origin.y;
    }

Rapide:

var topPadding: CGFloat = 0.0
    if #available(iOS 11.0, *) {
        topPadding = self.view.safeAreaLayoutGuide.layoutFrame.Origin.y
    }

mais je n'ai pas encore trouvé de solution à mon problème de frontière.

Edit: Temporairement, j'ai résolu le problème de la bordure en créant une vue invisible sur le popover et en lui donnant le même cadre que la zone de sécurité et en dessinant sa bordure.

0
Hassy