J'ai créé un nouveau projet basé sur la vue Split dans mon Xcode 4.2
Puis dans DetailViewController.m
fichier j'ai ajouté cette méthode
- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
//This method is only available in iOS5
return NO;
}
Maintenant, en faisant cela, je peux afficher une partie gauche et droite de mon contrôleur SplitView à la fois.
Maintenant, j'ai ajouté un UIBarButtonItem
dans ma barre de navigation DetailViewController
et je veux en utilisant lesquelles je peux masquer et montrer ma vision de mon maître en mode Portrairt et Paysage.
- (IBAction)hideUnhide:(id)sender
{
//How can hide & unhide
}
Comment puis-je faire ceci?
instead spv.delegate=nil; spv.delegate=self;
vous devez faire ensuite:
[spv willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
Dans iOS 5.1, vous devez le faire de cette façon:
À l'intérieur DetailViewController.m
- (IBAction)hideUnhide:(id)sender {
UISplitViewController* spv = ...;
self.hideMaster= !self.hideMaster;
[spv.view setNeedsLayout];
spv.delegate = nil;
spv.delegate = self;
}
- (BOOL)splitViewController:(UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
return self.hideMaster;
}
J'ai combiné les réponses ci-dessus et les œuvres suivantes bien dans IOS 6:
// In split delegate
-(void)hideMaster:(BOOL)hideState
{
_masterIsHidden = hideState;
[self.splitViewController.view setNeedsLayout];
self.splitViewController.delegate = nil;
self.splitViewController.delegate = self;
[self.splitViewController willRotateToInterfaceOrientation:[UIApplication sharedApplication].statusBarOrientation duration:0];
}
-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
return self.masterIsHidden;
}
-(IBAction)clickToShowMaster:(id)sender
{
UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"prev.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToHidemaster:)];
self.navigationItem.leftBarButtonItem = systemItem1;
[self.tabBarController.tabBar setHidden:NO];
[self hideMaster:NO];
}
-(void)hideMaster:(BOOL)hideState
{
ishideMaster=hideState;
[self.splitViewController.view setNeedsLayout];
self.splitViewController.delegate = nil;
self.splitViewController.delegate = self;
[self.splitViewController willRotateToInterfaceOrientation:[UIApplication sharedApplication].statusBarOrientation duration:0];
}
-(void)hideMaster:(BOOL)hideState
{
ishideMaster=hideState;
[self.splitViewController.view setNeedsLayout];
self.splitViewController.delegate = nil;
self.splitViewController.delegate = self;
[self.splitViewController willRotateToInterfaceOrientation:[UIApplication sharedApplication].statusBarOrientation duration:0];
}
#pragma mark - Split view
-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
if(UIInterfaceOrientationIsPortrait(orientation))
{
UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"down.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showPopup)];
self.navigationItem.leftBarButtonItem = systemItem1;
[self setUIforPortrait];
return YES;
}
if (UIInterfaceOrientationIsLandscape(orientation))
{
if(ishideMaster==TRUE)
{
UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"next.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToShowMaster:)];
self.navigationItem.leftBarButtonItem = systemItem1;
[self setUIForFullLandscape];
}
else
{
UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"prev.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToHidemaster:)];
self.navigationItem.leftBarButtonItem = systemItem1;
[self setUIForHalfLandscape];
}
return ishideMaster;
}
}
//add the navigation button on left top, to pop-up master view.
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
[barButtonItem setImage:[UIImage imageNamed:@"down.png"]];
UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"down.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showPopup)];
self.navigationItem.leftBarButtonItem = systemItem1;
self.masterPopoverController = popoverController;
self.masterPopoverController.delegate=self;
}
- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Called when the view is shown again in the split view, invalidating the button and popover controller.
//;
if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
{
if(ishideMaster==FALSE)
{
UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"prev.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToHidemaster:)];
self.navigationItem.leftBarButtonItem = systemItem1;
}
else
{
UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"next.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToShowMaster:)];
self.navigationItem.leftBarButtonItem = systemItem1;
}
}
else if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation))
{
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
}
//self.masterPopoverController = nil;
}
En ce qui concerne le commentaire de WZBOZON sur le fait de ne pas avoir besoin de réaffecter le délégué, j'ai trouvé que les deux lignes
self.splitViewController.delegate = nil;
self.splitViewController.delegate = self;
... n'étaient pas nécessaires sur le simulateur mais étaient nécessaires sur mon iPad iOS5 1. Sans eux, le comportement de masquage/spectacle ne s'est pas produit (en cliquant sur le bouton n'a pas réduit la vue Master).
Vous pouvez afficher/masquer la visualisation principale en déclenchant l'action de la propriété displayModeButtonItem
de UISplitViewController
:
Swift
if let displayModeButtonItem = splitViewController?.displayModeButtonItem() {
displayModeButtonItem.target?.performSelector(displayModeButtonItem.action)
}
Objectif c
UIBarButtonItem *displayModeButtonItem = [self.splitViewController displayModeButtonItem];
[displayModeButtonItem.target performSelector: displayModeButtonItem.action];
Cela me semble plus approprié que de moi-même avec le délégué, l'orientation et la mise en page en même temps.
Eh bien, la partie facilité de votre question est d'utiliser un Bool, dites une propriété Hidemaster, puis
- (IBAction)hideUnhide:(id)sender
{
self.hideMaster= !self.hideMaster;
}
puis...
- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
//This method is only available in iOS5
return self.hideMaster;
}
Cela fonctionne bien, mais le devoirViewController n'est appelé que lors d'une redessinée du splitvc, telle que pendant une rotation, le Maître ne se cache donc que.
Swift 3.
J'ai utilisé
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let object = self.exercises[indexPath.row]
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = object
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem
controller.navigationItem.leftItemsSupplementBackButton = true
UIView.animate(withDuration: 0.2, delay: 0.0, options: [.curveEaseOut], animations: {
self.splitViewController?.preferredDisplayMode = .primaryHidden
}, completion: nil)
}
}
}