13 Stimmen

IOS - Hinzufügen/Entfernen einer Subview programmgesteuert

Ok, ich möchte ein UIImageView als Subview hinzufügen und es dann nach ein paar Sekunden entfernen, so wie ein Splash-Screen funktioniert. Ich habe drei verschiedene Ansätze dazu gefunden, aber ich verstehe nicht, welcher der beste Ansatz gemäß Objective-C und Apple ist.

Im Folgenden sind die drei verschiedenen Ansätze:

1) In meinem MyAppDelegate.h

@interface MyAppDelegate : NSObject  {

    MyViewController *myViewController;
    UIImageView *myImageView;
}

@property (nonatomic, retain) IBOutlet MyViewController *myViewController;
@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

und in MyAppDelegate.m

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    myImageView =[[UIImageView alloc] initWithFrame:CGRectMake(0.0,0.0,self.window.frame.size.width,self.window.frame.size.height)];

        myImageView.image=[UIImage imageNamed:@"Yoga.png"];

    [self.window addSubview:myImageView ];
    [self.window bringSubviewToFront:myImageView];

    [self performSelector:@selector(removeImage) withObject:nil afterDelay:2.5];

    return YES;
}

-(void) removeImage
{
    [myImageView removeFromSuperview];

    [myImageView release];

    [self.window addSubview:myViewController.view];
    [self.window makeKeyAndVisible();
}

2) im zweiten Ansatz:

In meinem MyAppDelegate.h

@interface MyAppDelegate : NSObject  {

    MyViewController *myViewController;
    UIImageView *myImageView;
}

@property (nonatomic, retain) IBOutlet UIImageView *myImageView;

@property (nonatomic, retain) IBOutlet MyViewController *myViewController;
@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

und in MyAppDelegate.m

@synthesize myImageView;

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    myImageView =[[UIImageView alloc] initWithFrame:CGRectMake(0.0,0.0,self.window.frame.size.width,self.window.frame.size.height)];

        myImageView.image=[UIImage imageNamed:@"Yoga.png"];

    [self.window addSubview:myImageView ];
    [self.window bringSubviewToFront:myImageView];

    [self performSelector:@selector(removeImage) withObject:nil afterDelay:2.5];

    return YES;
}

-(void) removeImage
{
    [myImageView removeFromSuperview];

    [myImageView release];

    [self.window addSubview:myViewController.view];
    [self.window makeKeyAndVisible();
}

- (void)dealloc
{
    [myViewController release];
    [myImageView release];
 }

3) im dritten Ansatz:

In meinem MyAppDelegate.h

@interface MyAppDelegate : NSObject  {

    MyViewController *myViewController;

}

@property (nonatomic, retain) IBOutlet MyViewController *myViewController;
@property (nonatomic, retain) IBOutlet UIWindow *window;

und in MyAppDelegate.m

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIImageView *myImageView =[[UIImageView alloc] initWithFrame:CGRectMake(0.0,0.0,self.window.frame.size.width,self.window.frame.size.height)];

    myImageView.image=[UIImage imageNamed:@"Yoga.png"];
    myImageView.tag=22;    

    [self.window addSubview:myImageView ];

    [myImageView release];

    [self.window bringSubviewToFront:myImageView];

    [self performSelector:@selector(removeImage) withObject:nil afterDelay:2.5];

    return YES;
}

-(void) removeImage
{

    for (UIView *subview in [self.view subviews]) {

    if (subview.tag == 22){

        [subview removeFromSuperview];

    }

}
    [self.window addSubview:myViewController.view];
    [self.window makeKeyAndVisible();
}

- (void)dealloc
{
    [myViewController release];

 }

Also, um zusammenzufassen.. Der erste Ansatz verwendet keine Eigenschaft für das UIImage, sondern nur eine Variable, der zweite Ansatz verwendet eine Eigenschaft und der dritte erstellt einfach das UIImage und fügt es als Subview hinzu und entfernt es dann anhand seines Tags..

Welcher ist der richtige Ansatz zu folgen.. Ich glaube, dass alle drei Optionen richtig klingen.. Aber gibt es einen bestimmten Weg, dem ich folgen sollte. Ist eine der Optionen besser in Bezug auf Speicher und Leistung?

Danke im Voraus,

Andreas

8voto

TCR Dave Punkte 81

Sie könnten eine Animation verwenden, die an die Ebene der Ansicht angehängt ist. Der untenstehende Code lässt die Ansicht verblassen - aber es gibt viele andere Möglichkeiten, sie zu entfernen. (Sie müssen das QuartzCore-Framework anhängen)

myImageView.layer.opacity = 0.0;
// Das ist der Zustand, in dem sich die Ansicht nach der Animation befinden wird (z.B. unsichtbar)

CABasicAnimation *theFade;

theFade = [CABasicAnimation animationwithKeyPath:@"opacity"];
theFade.duration = 10.0;
theFade.fromValue = [NSNumber numberWithFloat:1.0]; // d.h. sichtbar
theFade.toValue = [NSNumber numberWithFloat:0.0]; // d.h. unsichtbar
[myImageView.layer addAnimation:theFade forKey="animateOpacity"];

6voto

OutlawAndy Punkte 316

Wenn Sie das Bild nicht erneut verwenden werden, ist es nicht notwendig, einen Zeiger darauf zu behalten. Außerdem, wenn Sie IBOutlet verwenden, müssen Sie die Ansicht auch in IB hinzufügen. In diesem spezifischen Beispiel würde ich sagen, dass Option 3 am sinnvollsten ist, insbesondere wenn man bedenkt, dass Sie mit dieser Wahl mit einer standardmäßigen "viewbasierten Anwendung" Vorlage beginnen können und einfach die Teile über das Bild einfügen und den Rest unverändert lassen. Eine letzte Beobachtung zur Option 3; die 2 Nachrichten an das Fenster;

 [self.window addSubview:myViewController.view];

 [self.window makeKeyAndVisible];

Scheinen außerhalb des Bereichs einer Methode zu liegen. Dies ist wahrscheinlich nur ein Kopierfehler, aber beachten Sie, dass sie innerhalb von "didFinishLaunchingWithOptions:" liegen sollten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X