iOS - добавление / удаление подпредставления программно - PullRequest
13 голосов
/ 10 сентября 2011

Хорошо, я хочу добавить UIImageView в качестве подпредставления, а затем удалить его через пару секунд, как работает заставка. Я нашел три разных подхода для этого, но я не могу понять, какой из них является лучшим подходом в соответствии с 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 только переменную, второй использует свойство, а третий просто создает UIImage и добавляет его как подпредставление, а затем удаляет его на основе его тег ..

Какой правильный подход следовать ... Я считаю, что все три варианта звучат правильно. Но есть ли определенный способ, которым я должен следовать. Какой-либо из этих вариантов лучше с точки зрения памяти и производительности?

Заранее спасибо,

Andreas

Ответы [ 2 ]

8 голосов
/ 30 октября 2012

Вы можете использовать анимацию, прикрепленную к слою вида.Приведенный ниже код скрывает представление - но есть много других способов удалить его.(необходимо прикрепить каркас 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"]; 
6 голосов
/ 10 сентября 2011

Если вы не собираетесь использовать изображение снова, нет необходимости держать указатель на него. Кроме того, если вы используете IBOutlet, вам также необходимо добавить представление в IB. В этом конкретном примере я бы сказал, что вариант 3 наиболее эффективен, особенно учитывая, что с этим выбором вы можете начать со стандартного шаблона " view based application " и просто добавить биты о представлении изображения и оставить отдохни один. Последнее замечание о выборе 3, хотя; 2 сообщения в окно;

 [self.window addSubview:myViewController.view];

 [self.window makeKeyAndVisible];

Кажется, выходит за рамки любого метода. Вероятно, это просто ошибка копирования и вставки, но обратите внимание, что они должны находиться внутри "didFinishLaunchingWithOptions:"

...