2011-09-10 18 views
12

Ok Quiero agregar un UIImageView como una subvista y luego eliminarlo después de unos segundos en la forma en que funciona la pantalla de bienvenida. Encontré tres enfoques diferentes para hacerlo, pero no puedo entender cuál es el mejor enfoque según Objective-C y Apple.iOS: agregar/eliminar una subvista mediante programación

A continuación se presentan los tres enfoques diferentes:

1) En mi MyAppDelegate.h

@interface MyAppDelegate : NSObject <UIApplicationDelegate> { 

    MyViewController *myViewController; 
    UIImageView *myImageView; 
} 


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

@end 

y en 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) en el segundo enfoque:

In my MyAppDelegate.h 


@interface MyAppDelegate : NSObject <UIApplicationDelegate> { 

    MyViewController *myViewController; 
    UIImageView *myImageView; 
} 

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

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

@end 

y en 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) en el tercer enfoque:

In my MyAppDelegate.h 


@interface MyAppDelegate : NSObject <UIApplicationDelegate> { 

    MyViewController *myViewController; 

} 

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

@end 

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

} 

lo que en definitiva .. El primer enfoque no utiliza una propiedad para el UIImage solo una variable, el segundo usa una propiedad y el tercero solo crea el UIImage y lo agrega como una subvista y luego lo elimina según su etiqueta ...

Cuál es el enfoque correcto a seguir ... Creo que las tres opciones suenan bien ... Pero, ¿hay alguna manera en particular que deba seguir? ¿Alguna de estas opciones es mejor en términos de memoria y rendimiento?

Gracias de antemano,

Andreas

+1

pregunta Técnica lado Tener pantallas de inicio que retrasan artificialmente al usuario llegar a utilizar la aplicación es un mal diseño móvil y no es lo que sugiere el iPhone HIG. – Nick

+3

la pregunta no es sobre la pantalla de bienvenida. Se trata de elegir la forma correcta de implementar algo ...¡Este ejemplo podría ser una pregunta para algo completamente irrelevante con pantallas de bienvenida! Se trata de la forma correcta de agregar una subvista y luego eliminarla .. – andreasv

+0

El primer enfoque parece correcto pero no necesita inicializar su UIImageView ya que es un Outlet, simplemente active el método luego del tiempo de demora que desea y quítelo de la supervista que puede ser tu viewController –

Respuesta

6

Si no va a utilizar la imagen de nuevo, no hay necesidad de mantener un puntero a ella. Además, si usa IBOutlet, necesita agregar la vista en IB también. En este ejemplo específico diría que la opción 3 tiene más sentido, especialmente si se tiene en cuenta que con esta opción puede comenzar con una plantilla estándar "basada en la vista" y simplemente agregar los bits sobre la vista de la imagen y dejar el resto solo. Una última observación de la opción 3; los 2 mensajes a la ventana;

[self.window addSubview:myViewController.view]; 

[self.window makeKeyAndVisible]; 

Parece ser fuera del alcance de cualquier método. Es probable que solo se trate de un error de copiar y pegar, pero tenga en cuenta que deben ubicarse dentro de "didFinishLaunchingWithOptions:"

8

Puede usar una animación adjunta a la capa de la vista. El siguiente código desaparece la vista, pero hay muchas otras maneras de eliminarlo. (Necesita adjuntar el marco QuartzCore)

myImageView.layer.opacity = 0.0; 
// this is the state the view will be in after the animation (e.g. invisible) 

CABasicAnimation *theFade; 

theFade = [CABasicAnimation animationwithKeyPath:@"opacity"]; 
theFade.duration = 10.0; 
theFade.fromValue = [NSNumber numberWithFloat:1.0]; // i.e. visible 
theFade.toValue = [NSNumber numberWithFloat:0.0]; // i.e. invisible 
[myImageView.layer addAnimation:theFade forKey:@"animateOpacity"]; 
Cuestiones relacionadas