web-dev-qa-db-ja.com

iOS-プログラムによるサブビューの追加/削除

OK、UIImageViewをサブビューとして追加し、スプラッシュスクリーンが機能する方法の数秒後に削除します。私はそれを行うために3つの異なるアプローチを見つけましたが、Objective-CとAppleによると、どちらが最良のアプローチであるか理解できません。

以下は3つの異なるアプローチです。

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)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)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のプロパティを変数のみで使用せず、2番目のアプローチではプロパティを使用し、3番目のアプローチではUIImageを作成してサブビューとして追加し、そのタグに基づいて削除します。 。

これは正しいアプローチです。3つのオプションはすべて正しいように聞こえます。しかし、私が従うべき特定の方法はありますか。これらのオプションのいずれかは、メモリとパフォーマンスの点で優れていますか?

前もって感謝します、

アンドレアス

13
andreasv

イメージを再び使用しない場合は、そのイメージへのポインターを保持する必要はありません。さらに、IBOutletを使用する場合は、IBにもビューを追加する必要があります。この特定の例では、オプション3が最も効果的であると言います。特に、この選択を使用すると、標準の "view based application"テンプレートで開始でき、画像ビューに関するビットを追加してそのままにしておくことができます残りは一人。ただし、選択肢3の最後の観察は1つです。ウィンドウへの2つのメッセージ。

 [self.window addSubview:myViewController.view];

 [self.window makeKeyAndVisible];

メソッドの範囲外にあるようです。これは単なるコピーアンドペーストエラーの可能性がありますが、「didFinishLaunchingWithOptions:」内に配置する必要があることに注意してください。

6
OutlawAndy

ビューのレイヤーにアタッチされたアニメーションを使用できます。以下のコードはビューをフェードアウトしますが、それを削除する方法は他にもたくさんあります。 (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"]; 
8
TCR Dave