2012-04-30 5 views
0

En créant un UIView personnalisé similaire à la vue UIPopover, je sous-classe simplement la classe UIView et compile les commandes et les événements à l'intérieur .. pour afficher cette vue J'assigne le superView à My sub classe source de données comme celui-ciRenvoyer un UIView personnalisé comme dans UIPopoverController

if ([dataSource respondsToSelector:@selector(containerView)]) 
     superView = [dataSource containerView]; 

et de montrer que j'ai une fonction faisant cela comme ça

- (void) showPopOverFromRect : (CGRect) rect 
{ 
    CGSize popSize = self.frame.size; 

    float yPoint; 

    if(ntPopOverDirection == NTPopOverArrowDirectionUP) 
     yPoint = rect.origin.y + 10; 
    else 
     yPoint = rect.origin.y - 10; 

    self.frame = CGRectMake(rect.origin.x - popSize.width, yPoint , popSize.width, popSize.height); 

    [superView addSubview:self]; 
} 

Ma question .. comment puis-je rejeter ce point de vue (retirer) si le robinet d'utilisateur AnyWhere sur le superView tout comme le UIPopOverController?

Répondre

-1

Vous pouvez placer un UIButton en dessous de votre nouvelle UIView qui est clair. Lorsque ce nouveau bouton est pressé, il rejette votre vue et se supprime de superview.

Quelque chose comme:

- (void) showPopOverFromRect : (CGRect) rect 
{ 
    CGSize popSize = self.frame.size; 

    float yPoint; 

    if(ntPopOverDirection == NTPopOverArrowDirectionUP) 
     yPoint = rect.origin.y + 10; 
    else 
     yPoint = rect.origin.y - 10; 

    self.frame = CGRectMake(rect.origin.x - popSize.width, yPoint , popSize.width, popSize.height); 

    UIButton *dismissButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    dismissButton.backgroundColor = [UIColor clearColor]; 
    dismissButton.frame = [[UIScreen mainScreen] bounds]; 
    [dismissButton addTarget:self.delegate action:@selector(dismissPopover) forControlEvents:UIControlEventTouchUpInside]; 
    [superview addSubview:dismissButton]; 

    [superView addSubview:self]; 
} 

Il faudrait mettre en place en vue de le régler est superview en tant que délégué qui reçoit le message de rejeter le popover, cependant.

+0

oh comme j'ai raté ça! avec quelques modifications cela fonctionne .. merci. –

+0

Que faire si l'utilisateur tape à gauche ou à droite ou au-dessus du popover? Ils ne taperont pas sur le bouton "effacer". – bbarnhart

+0

@bbarnhart mais dans UIPopController si vous tapez n'importe où sauf le popover et à côté de sa flèche il sera rejeté! Alors, quel est le problème avec ça? –

2

Je suggère que vous créiez votre UIView personnalisé pour remplir l'aperçu complet ou l'écran entier avec un fond clair ou un dégradé radial. Ensuite, à l'intérieur de cela, vous mettriez un autre UIView qui a l'apparence du popover.

Ceci élimine le problème d'essayer de capturer des robinets et d'envoyer des notifications à partir d'autres vues. Ce sera entièrement autonome.

Vous pouvez facilement ajouter un outil de reconnaissance de gestes dans votre vue personnalisée pour fermer la vue lorsque l'utilisateur touche la zone de dégagement.

+0

+1 pour votre suggestion .. merci. –

Questions connexes