iOS – 以编程方式添加/删除子视图

好吧,我想添加一个UIImageView作为子视图,然后在几秒钟后启animation面的方式删除它。 我发现了三种不同的方法,但根据Objective-C和Apple的说法,我不明白哪一种方法是最好的。

以下是三种不同的方法:

1)在我的MyAppDelegate.h

@interface MyAppDelegate : NSObject <UIApplicationDelegate> { MyViewController *myViewController; UIImageView *myImageView; } @property (nonatomic, retain) IBOutlet MyViewController *myViewController; @property (nonatomic, retain) IBOutlet UIWindow *window; @end 

和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)第二种方法:

 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 

和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)第三种方法:

 In my MyAppDelegate.h @interface MyAppDelegate : NSObject <UIApplicationDelegate> { MyViewController *myViewController; } @property (nonatomic, retain) IBOutlet MyViewController *myViewController; @property (nonatomic, retain) IBOutlet UIWindow *window; @end 

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

所以总结..第一种方法不使用一个属性的UIImage只有一个variables,第二个使用属性,第三个只是创buildUIImage,并将其添加为子视图,然后根据其标记删除它。 。

这是正确的方法,我相信所有三个选项听起来是正确的..但是有什么我应该遵循的方式。 这些选项在内存和性能方面是否更好?

提前致谢,

安德烈亚斯

如果您不打算再次使用该图像,则不需要保留指针。 此外,如果您使用IBOutlet ,则还需要在IB中添加视图。 在这个特定的例子中,我会说选项3是最有意思的,特别是考虑到这个select,你可以从一个标准的“ 基于视图的应用程序 ”模板开始,只是添加一些关于图像视图的东西,剩下的就放在其余的地方。 最后select3的观察; 2个消息到窗口;

  [self.window addSubview:myViewController.view]; [self.window makeKeyAndVisible]; 

似乎超出了任何方法的范围。 这可能只是一个复制和粘贴错误,但请注意,他们应该位于“ didFinishLaunchingWithOptions :”

您可以使用附加到视图图层的animation。 下面的代码淡化了视图 – 但还有很多其他方法可以将其删除。 (你需要附加QuartzCore框架)

 myImageView.layer.opacity = 0.0; // this is the state the view will be in after the animation (eg invisible) CABasicAnimation *theFade; theFade = [CABasicAnimation animationwithKeyPath:@"opacity"]; theFade.duration = 10.0; theFade.fromValue = [NSNumber numberWithFloat:1.0]; // ie visible theFade.toValue = [NSNumber numberWithFloat:0.0]; // ie invisible [myImageView.layer addAnimation:theFade forKey:@"animateOpacity"];