2013-05-25 2 views
0

J'ai du mal à présenter un popover correctement à partir de l'accessoireButton d'une tableviewCell. La raison pour laquelle je n'utilise pas la vue accessoire est que la cellule est en mode édition et que je ne pouvais pas afficher à la fois le signe plus vert + l'accessoire personnalisé. Peut-être ai-je oublié quelque chose sur ce front?Popover présent à partir du bouton accessoire de cellules?

Actuellement mon popover s'affiche correctement, mais c'est seulement le cas pour cette configuration puisque je définis une distance statique depuis l'origine ... Any Idées comment résoudre ce problème?

code:

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

if (![self duplicateDayContent]) { 
    duplicateDayContent = [[self storyboard]instantiateViewControllerWithIdentifier:@"CopyDay"]; 
    [duplicateDayContent setDelegate:self]; 

    duplicateDayPopover = [[UIPopoverController alloc]initWithContentViewController:duplicateDayContent]; 
    duplicateDayPopover.popoverContentSize = CGSizeMake(320, 600); 

} 

CGRect rect = CGRectMake(cell.bounds.origin.x+800, cell.bounds.origin.y+10, 50, 30); 

[duplicateDayPopover presentPopoverFromRect:rect inView:cell permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES]; 

} 
+1

peut-être vous auriez considéré cell.accessoryView.bounds ou directement envisager cell.accessoryView.frame –

+0

thx beaucoup votre votre suggestion. J'ai essayé: CGRect rect = CGRectMake (cell.accessoryView.bounds.origin.x, cell.accessoryView.bounds.origin.y, 50, 30); Mais cela ne fonctionne pas du côté x. Peut-être parce que je ne charge pas une vue accessoire? ou ai-je oublié quelque chose? – L00ps

+0

cell.accessoryView.bounds.size.width-50 essayez d'utiliser ceci dans le premier argument de CGRectMake –

Répondre

1

ce code de ce fil m'a aidé: How to correctly present a popover from a UITableViewCell with UIPopoverArrowDirectionRight or UIPopoverArrowDirectionLeft grâce à Rachels allusion

UIView *accessoryView  = cell.accessoryView; // finds custom accesoryView  (cell.accesoryView) 
if (accessoryView == nil) { 
    UIView *cellContentView = nil; 

    for (UIView *accView in [cell subviews]) { 
     if ([accView isKindOfClass:[UIButton class]]) { 
      accessoryView = accView; // find generated accesoryView (UIButton) 
      break; 
     } else if ([accView isKindOfClass:NSClassFromString(@"UITableViewCellContentView")]) { 
      // find generated UITableViewCellContentView 
      cellContentView = accView; 
     } 
    } 
    // if the UIButton doesn't exists, find cell contet view (UITableViewCellContentView) 
    if (accessoryView == nil) { 
     accessoryView = cellContentView; 
    } 
    // if the cell contet view doesn't exists, use cell view 
    if (accessoryView == nil) { 
     accessoryView = cell; 
    } 
} 
0

En rapide, cela a fonctionné pour moi:

Créer une popover séquence de présentation, puis utilisez prepareForSegue pour configurer UIPopoverPresentationController du contrôleur de vue de destination:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == Storyboard.providerInfoSegue) { 
     if let vc = segue.destinationViewController.contentViewController as? /*DestinationViewControllerType*/ { 
      //Configure view controllers here 

      if let popOverPresentationController : UIPopoverPresentationController = vc.popoverPresentationController { 


       if let cell = tableView.cellForRowAtIndexPath(selectedAccessoryIndexPath) { 
        var accessoryView: UIButton! 
        for accView in cell.subviews { 
         if (accView.isKindOfClass(UIButton)) { 
          accessoryView = accView as! UIButton 
          break 
         } 
        } 
        popOverPresentationController.delegate = self 
        popOverPresentationController.sourceView    = cell 
        popOverPresentationController.sourceRect    = accessoryView.frame 
        popOverPresentationController.permittedArrowDirections = UIPopoverArrowDirection.Right 

       } 
      } 
     } 
    } 
} 
0

Cela fonctionne assez bien pour une cellule avec accessoryType .detailDisclosureButton:

if let ppc = vc.popoverPresentationController, let cell = tableView.cellForRow(at: indexPath) { 
    ppc.sourceView = cell 
    ppc.sourceRect = CGRect(x: cell.bounds.width - 58, y: cell.bounds.height/2 - 11, width: 22, height: 22) 
    vc.modalPresentationStyle = .popover 
} 
present(vc, animated: true, completion: nil) 

Vous généralement faire dans tableView(_ accessoryButtonTappedForRowWith indexPath:)

Vous pouvez également tester la position du cadre calculée avec un marqueur:

let marker = UIView(frame: ppc.sourceRect) 
marker.backgroundColor = UIColor.red.withAlphaComponent(0.2) 
cell.addSubview(marker) 

Test marker

Questions connexes