UIMenuController et IOS12+
Que l'on soit avec une UICollectionView ou un UITableView, on a souvent besoin d'un menu contextuel. Apple offre plusieurs possibilités pour faire ce menu, certaines sont dépendante du fait d'être dans une collection ou dans une vue, d'autres change selon que l'on soit sur iPad ou sur iPhone. Normalement, la solution la plus stable/standard est le UIMenuController.
On a un UIMenuController global (puisqu'il n'y a pas de raison d'avoir plusieurs menus contextuels en même temps), que l'on appelle avec :
menu = [UIMenuController sharedMenuController];
Reste à donner les éléments du menu, les coordonnées de l'objet dont on veut ouvrir le menu et la vue dans laquelle placer le menu. Pour les éléments du menu, les items, on utiliser un tableau de UIMenuItem.
UIMenuItem *item_absences = [[UIMenuItem alloc]
initWithTitle:@"Absences"
action:@selector(absences:)];
UIMenuItem *item_edit = [[UIMenuItem alloc]
initWithTitle:@"Modifier le compte"
action:@selector(modifierCompte:)];
menu.menuItems = @[ item_edit, item_absences ];
Par contre la suite change, car une nouvelle fonction est apparue avec IOS13, et la méthode précédente est devenue "deprecated".
Avec une collection, on a :
CGRect frame = [collectionView
cellForItemAtIndexPath:currentIndexPath].frame;
if (@available(iOS 13.0, *)) {
[menu showMenuFromView:collectionView rect:frame];
} else {
[menu setTargetRect:frame inView:collectionView];
[menu setMenuVisible:YES animated:YES];
}
Avec une table, on a :
CGRect frame = [table
cellForRowAtIndexPath:currentIndexPath].frame;
if (@available(iOS 13.0, *)) {
[menu showMenuFromView:table rect:frame];
} else {
[menu setTargetRect:frame inView:table];
[menu setMenuVisible:YES animated:YES];
}
Il est vraie que la fonction showMenuFromView est plus "logique" qu'une fonction setMenuVisible qui ressemble à un setter.
Commentaires