Question

Je suis en train de faire quelque chose qui ne devrait pas être si compliqué que ça, mais je ne peux pas le comprendre. J'ai UIViewController l'affichage d'un UITableView. Je veux présenter un menu contextuel lorsque la presse utilisateur sur une ligne. Je veux que ce soit une vue semi-transparent avec des étiquettes et des boutons. Je pourrais utiliser un AlertView, mais je veux le plein contrôle sur le format des étiquettes et des boutons et aimeront utiliser Interface Builder.

Alors j'ai créé ma petite vue 250x290, définissez l'alpha et .75 créer un contrôleur de vue avec les sorties pour gérer les différents événements utilisateur.

Maintenant, je veux présenter. Si j'utilise presentModalViewController deux (non souhaitées) les choses se passent 1) la vue couvre l'ensemble de l'écran (mais la barre d'état). 2) Il est semi-transparent, mais ce que je vois « derrière » ce ne est pas la vue parent, mais les applications vue racine.

Ive essayé d'ajouter comme une sous-vue, mais rien ne se passe, si je ne suis pas faire quelque chose de bien:

RestaurantContextVC* modalViewController = [[[RestaurantContextVC alloc] initWithNibName:@"RestaurantContextView" bundle:nil] autorelease];
[self.view addSubview:modalViewController.view];

Est-il possible de faire ce que je veux? Merci à l'avance.

Gonso

Était-ce utile?

La solution

Je codage chose semblable. Mon approche inclut .....

  1. Ne pas utiliser dismissModalViewControllerAnimated et presentModalViewController:. Animée

  2. Concevoir une vue complète sur mesure en taille IB. Dans son corps de message viewDidLoad, fixer la couleur d'arrière-plan à clearColor, de sorte que l'espace sur le point de vue ne sont pas couverts par les contrôleurs sont transparents.

  3. Je mets un UIImageView sous les contrôleurs de la vue flottante. Le UIImageView contient une image photoshoped, qui a des coins arrondis et le fond est fixé à transparent. Ce point de vue de l'image sert de récipient.

  4. I utilise CoreAnimation pour présenter / rejeter le point de vue flottant dans le style modal de la vue: (le FloatingViewController.m)

    -  (void)viewDidLoad
    {
        [super viewDidLoad];
        [self.view setBackgroundColor:[UIColor clearColor]];
    
        [UIView beginAnimations:nil context:nil];
        [self.view setFrame:CGRectMake(0, 480, 320, 480)];
    
        [UIView setAnimationDuration:0.75f];
        [self.view setFrame:CGRectMake(0, 0, 320, 480)];
        [UIView commitAnimations];
    }
    

Autres conseils

wangii

Cest à peu près la solution que je trouve. Je charge la vue avec loadNibNamed puis ajouter simplement sur le dessus avec addSubview, comme ceci:

//Show a view on top of current view with a wait indicator. This prevents all user interactions.
-(void) showWaitView{
    NSArray* nibViews =  [[NSBundle mainBundle] loadNibNamed:@"WaitView" owner:self options:nil];
#ifdef __IPHONE_2_1
    waitView = [ nibViews objectAtIndex: 0];
#else
    waitView = [ nibViews objectAtIndex: 1];
#endif          
    CGFloat x = self.view.center.x - (waitView.frame.size.width / 2);
    CGFloat y = self.view.center.y - (waitView.frame.size.height / 2);
    [waitView setFrame:CGRectMake(x,y,waitView.bounds.size.width,waitView.bounds.size.height)];
    [self.view addSubview:waitView];    
}

Pourriez-vous donner des détails sur les points 3 et 4?

Ce que je l'ai fait pour donner le point de vue l'aspect rect rond est placé à l'intérieur d'un bouton rond rect.

Ce code vous permettra effectivement d'avoir une petite vue flottante, mais si la vue est plus petit que son parent, l'utilisateur peut interagir avec la partie visible du parent.

En fin de compte je crée mon point de vue avec la même taille, mais gardé le code juste au cas où.

Gonso

Je fortement envisager d'utiliser un contrôleur de navigation pour glisser dans votre sous-vue au lieu de superposant. Ceci est le modèle attendu et tout petit avantage que vous pouvez penser que vous obtiendrez en le faisant votre propre chemin sera grandement compensé par le principe de (moins) surprise.

Si vous avez vraiment vraiment de le faire de cette façon, je crois que le truc est d'ajouter la première vue de la table comme une sous-vue d'un transparent « tenant » vue que le contrôleur de vue maintient. Alors donnez votre nouvelle sous vue comme une autre sous-vue de cela.

Encore une fois, si vous voulez vraiment faire cela, au lieu d'ajouter un transparent « holding » point de vue, puisque ce que je ferais pop-up est essentiellement modal, une sous-vue directement de la fenêtre.

Vous pouvez mettre dans un bouclier noir transparent derrière elle pour éviter de toucher sur l'arrière-plan et de se concentrer entrée dans la fenêtre contextuelle.

Mais sérieusement, envisager soit sauter un contrôleur sur la pile ou en utilisant ce point de vue alerte. À moins que vous avez embauché un concepteur de $$, il ne va probablement pas regarder approprié sur l'iPhone.

Ce que je faisais était de créer un UIViewController au-dessus de mon contrôleur de UINavigation dans mon délégué app et fait une propriété d'un objet singleton pour des raisons pratiques:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

//--- create root navigation controller
self.window.rootViewController = self.navigationController;

//--- create view controller for popups:
popupViewController = [[BaseViewController alloc] init];
popupViewController.view.backgroundColor = [UIColor clearColor];
popupViewController.view.hidden = true; //for rendering optimisation
[self.window addSubview:popupViewController.view];
[AppState sharedInstance].popupViewController = self.popupViewController;

//--- make all visible:
[self.window makeKeyAndVisible];

return YES;

}

A tout moment dans mon application, je peux alors appeler par exemple.

MyViewController * myVC = [[UIViewController alloc] init];
//... set up viewcontroller and its view...
// add the view of the created view controller to the popup view:
[AppState sharedInstance].popupViewController.view.hidden = false;
[[AppState sharedInstance].popupViewController.view addSubview:myVC.view];

Le BaseViewController utilisé sur le dessus de UIViewController hérite juste et met en place une vue plein écran:

//----- in BaseViewController implementation
- (void)loadView {
   //------- create root view:
   CGRect frame = [[AppState sharedInstance] getScreenFrame]; 
   rootView = [[VCView alloc] initWithFrame:frame];
   rootView.backgroundColor = [UIColor whiteColor];
   self.view = rootView;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top