Frage

Ich versuche, etwas zu tun, die nicht so kompliziert sein sollen, aber ich kann es nicht herausgefunden. Ich habe eine UIViewController eine UITableView angezeigt wird. Ich möchte ein Kontextmenü, wenn der Benutzer drücken Sie auf eine Reihe präsentieren. Ich möchte dies eine halbtransparente Ansicht mit Etiketten und Tasten sein. Ich konnte eine Alertview verwenden, aber ich will die volle Kontrolle über das Format der Etiketten und Tasten und wird wie Interface Builder verwenden.

Also habe ich meine kleine Ansicht 250x290 erstellt, stellen Sie die Alpha auf .75 und einen View-Controller mit den Auslässen zu schaffen, um die verschiedenen Benutzerereignisse zu behandeln.

Jetzt möchte ich es präsentieren. Wenn ich PresentModalViewController zwei (unerwünschte) Dinge passieren 1) die Ansicht deckt alle auf dem Bildschirm (aber die Statusleiste). 2) Es ist halb-transparent, aber was ich sehe „hinter“ es sich nicht die übergeordnete Ansicht aber die Anwendungen Stammansicht.

Ich habe versucht es als Subview hinzufügen, aber nichts passiert, so Im tun etwas nicht stimmt:

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

Ist es möglich, zu tun, was ich will? Vielen Dank im Voraus.

Gonso

War es hilfreich?

Lösung

Ich bin Codierung ähnliche Sache. Mein Ansatz umfasst .....

  1. Nicht mit dismissModalViewControllerAnimated und PresentModalViewController. Animiert

  2. Entwerfen Sie einen maßgeschneiderten vollen Größe Blick in IB. In seinem viewDidLoad Nachrichtentext, die Hintergrundfarbe zu Clear, so dass Raum für die Sicht nicht durch Steuerungen abgedeckt ist transparent.

  3. Ich habe eine UIImageView unter den Controllern der schwebenden Ansicht. Die UIImageView enthält ein photos Bild, die Ecken abgerundet und der Hintergrund hat, wird auf transparent. Dieses Bild Ansicht dient als Behälter.

  4. I verwendet Coreanimation / entlassen in der modalen Ansicht Stil die schwebende Ansicht zu präsentieren: (die 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];
    }
    

Andere Tipps

wangii

Das ist so ziemlich die Lösung fand ich. Ich lade die Ansicht mit loadNibNamed und dann fügen Sie ihn einfach auf der Oberseite mit addSubView, wie folgt aus:

//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];    
}

Könnten Sie Punkte erarbeiten 3 und 4?

Was ich tat, der Ansicht des Rund rect Aspekt zu geben, es innerhalb einer runden rect-Taste gelegt wird.

Dieser Code wird tatsächlich ermöglicht es Ihnen, eine kleine schwimmenden Blick zu haben, aber wenn sie der Ansicht ist kleiner, dass seine Eltern, der Benutzer mit dem sichtbaren Teil des Mutterinteragieren können.

Am Ende erstelle ich meine Ansicht mit der gleichen Größe, behielt aber den Code nur für den Fall.

Gonso

Ich würde nachdrücklich empfohlen, einen Navigation-Controller verwenden in Ihrem subview zu gleiten, anstatt sie zu überlagern. Das ist das erwartete Modell und jeder kleine Vorteil, den Sie denken, Sie können, indem Sie es Ihren eigenen Weg wird stark durch das Prinzip der (mindestens) Überraschung versetzt bekommen werden.

Wenn Sie wirklich, wirklich es auf diese Art und Weise zu tun haben, ich glaube, der Trick ist, die erste Tabellenansicht als ein Subview einer transparenten „Halt“ Ansicht hinzufügen, dass der View-Controller hält. Dann fügen Sie Ihre neue Unteransicht als eine andere subview davon.

Auch wenn Sie das wirklich tun wollen, stattdessen eine transparentes Hinzufügen „Halten“ Ansicht, da dieses Pop-up im Wesentlichen modal ist, würde ich es ein Subview macht direkt aus dem Fenster.

Sie können in einem transparenten schwarzen Schild setzen wollen dahinter Berührungen auf dem Hintergrund zu verhindern und konzentriert Eingang im Popup.

Aber im Ernst, sollte entweder einen Controller auf dem Stapel knallt oder dass Alarm-Ansicht. Sofern Sie einen $$ Designer angestellt haben, ist es wahrscheinlich nicht auf dem iPhone angemessen aussehen würde.

Was ich tat, war einen UIViewController auf meinem UINavigation Controller in meinen app-Delegaten und machte es eine Eigenschaft eines Singleton-Objekt für die Bequemlichkeit:

- (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;

}

An jedem Punkt in meiner app, kann ich dann rufen Sie z.

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];

Die BaseViewController auf der Oberseite verwendet nur von UIViewController erbt und setzt einen Vollbild-Ansicht auf:

//----- 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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top