2011-09-10 29 views
12

Ok Tôi muốn thêm UIImageView làm chế độ xem phụ rồi xóa nó sau một vài giây theo cách hoạt động của màn hình giật gân. Tôi tìm thấy ba cách tiếp cận khác nhau để làm điều đó nhưng tôi không thể hiểu được cách nào là cách tiếp cận tốt nhất theo Mục tiêu-C và Apple.iOS - thêm/xóa một chế độ xem phụ theo chương trình

Dưới đây là ba cách tiếp cận khác nhau:

1) Trong MyAppDelegate.h tôi

@interface MyAppDelegate : NSObject <UIApplicationDelegate> { 

    MyViewController *myViewController; 
    UIImageView *myImageView; 
} 


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

@end 

và trong 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) trong cách tiếp cận thứ hai:

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 

và trong 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) trong cách tiếp cận thứ ba:

In my MyAppDelegate.h 


@interface MyAppDelegate : NSObject <UIApplicationDelegate> { 

    MyViewController *myViewController; 

} 

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

@end 

và trong 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]; 

} 

Vì vậy, để tổng hợp .. Cách tiếp cận đầu tiên không sử dụng một tài sản cho UIImage chỉ một biến, cái thứ hai sử dụng thuộc tính và cái thứ ba chỉ tạo UIImage và thêm nó dưới dạng phần phụ và sau đó xóa nó dựa trên thẻ của nó ..

Cách tiếp cận phù hợp là gì .. Tôi tin rằng cả ba tùy chọn đều đúng .. Nhưng có cách nào tôi nên làm theo không. Có bất kỳ tùy chọn nào trong số này tốt hơn về bộ nhớ và hiệu suất không?

Cảm ơn trước,

Andreas

+1

Câu hỏi kỹ thuật sang một bên có màn hình giật gân giả tạo người dùng sử dụng thiết bị di động kém và không phải là gợi ý của iPhone HIG. – Nick

+3

câu hỏi không phải là về màn hình giật gân. Đó là về việc chọn đúng cách để thực hiện điều gì đó ..Ví dụ này có thể là một câu hỏi cho một cái gì đó hoàn toàn không liên quan với màn hình giật gân! Đó là về đúng cách để thêm một subview và sau đó loại bỏ nó .. – andreasv

+0

Cách tiếp cận đầu tiên có vẻ đúng nhưng bạn không cần phải khởi tạo UIImageView của bạn vì nó là một Outlet, chỉ cần cháy phương pháp sau thời gian chậm trễ bạn muốn và loại bỏ nó từ superView có thể là viewController của bạn –

Trả lời

6

Nếu bạn sẽ không sử dụng hình ảnh một lần nữa, không có cần phải giữ một con trỏ đến nó. Hơn nữa, nếu bạn sử dụng IBOutlet, bạn cũng cần thêm chế độ xem trong IB. Trong ví dụ cụ thể này, tôi sẽ nói tùy chọn 3 tạo ra nhiều nhất, đặc biệt khi xem xét với lựa chọn này, bạn có thể bắt đầu với tiêu chuẩn "xem ứng dụng dựa trên mẫu" và chỉ thêm các bit về chế độ xem hình ảnh và để phần còn lại một mình. Một quan sát cuối cùng của sự lựa chọn 3 mặc dù; 2 tin nhắn vào cửa sổ;

[self.window addSubview:myViewController.view]; 

[self.window makeKeyAndVisible]; 

Xuất hiện ngoài phạm vi của bất kỳ phương pháp nào. Đây có thể chỉ là lỗi sao chép và dán, nhưng hãy lưu ý rằng chúng phải nằm trong "didFinishLaunchingWithOptions:"

8

Bạn có thể sử dụng hoạt ảnh được đính kèm với lớp của chế độ xem. Mã bên dưới làm mờ chế độ xem - nhưng có rất nhiều cách khác để xóa nó. (bạn cần phải đính kèm khung công tác 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"]; 
Các vấn đề liên quan