2009-11-16 1 views
1

Я программно добавляю UIImageView и UILabel на несколько экранов в программе, над которой я работаю. Таким образом, я написал UIViewController, который содержит код для загрузки UIImageView и UILabel в viewDidLoad вместе с таймером для обновления содержимого. Я использую этот контроллер представления как суперкласс для любых видов, которым нужны UIImageView и UILabel.UIImageView drifting on viewDidLoad

По большей части он работает нормально, но при переходе с определенных экранов пара, кажется, начинается с кадра (0,0,0,0) и медленно огибает рамку, которую я определил. Я понятия не имею, в чем проблема или даже где искать. Любые указатели здесь были бы замечательными.

Вот код, который я использую в качестве своего суперкласса.

FoundationViewController.h

#import 

@interface FoundationViewController : UIViewController { 
    IBOutlet UIImageView *activeInventoryImage; 
    IBOutlet UILabel *activeInventoryLabel; 
    NSTimer *inventoryStatusTimer; 
} 

@property (nonatomic, retain) IBOutlet UIImageView *activeInventoryImage; 
@property (nonatomic, retain) IBOutlet UILabel *activeInventoryLabel; 

- (void) advanceToView:(id)nextView; 
- (void) inventoryStatus; 
- (BOOL) inventoryActive:(NSDate*)inventoryExpire withImage:(NSString*)imageName; 
@end 

FoundationViewController.m

#import "FoundationViewController.h" 
#import "GameData.h" 
#import "Globals.h" 


@implementation FoundationViewController 

@synthesize activeInventoryImage; 
@synthesize activeInventoryLabel; 

- (void) viewDidLoad{ 

    // initialize the active inventory icon and label 
    activeInventoryImage = [[UIImageView alloc] init]; 
    activeInventoryLabel = [[UILabel alloc] init]; 

    // clear 
    activeInventoryImage.image = [UIImage imageNamed:@""]; 
    activeInventoryLabel.text = @""; 

    // set the center points 
    activeInventoryImage.frame = CGRectMake(258, 7, 20, 20); 
    activeInventoryLabel.frame = CGRectMake(280, 6, 30, 20); 

    // set label parameters 
    activeInventoryLabel.backgroundColor = [UIColor clearColor]; 
    activeInventoryLabel.font = [UIFont fontWithName:@"Helvetica" size:11.0f]; 
    activeInventoryLabel.textColor = [UIColor colorWithRed:0.2 green:0.4 blue:0.6 alpha:1]; 

    // add to view 
    [self.view addSubview:activeInventoryImage]; 
    [self.view addSubview:activeInventoryLabel]; 

    // start the timer if there is any active inventory 
    if(
     [self inventoryActive:[GameData sharedGameData].player.inventory.aExpire withImage:@"a.png"] || 
     [self inventoryActive:[GameData sharedGameData].player.inventory.bExpire withImage:@"b.png"] || 
     [self inventoryActive:[GameData sharedGameData].player.inventory.cExpire withImage:@"c.png"] 
     ) 
     inventoryStatusTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(inventoryStatus) userInfo:nil repeats:YES]; 

    [super viewDidLoad]; 
} 

- (BOOL) inventoryActive:(NSDate*)inventoryExpire withImage:(NSString*)imageName{ 
    NSTimeInterval expireSeconds; 
    NSDateFormatter *formatter; 
    BOOL runTimer = FALSE; 

    // expire 
    expireSeconds = [inventoryExpire timeIntervalSinceNow]; 
    if(expireSeconds > 0){ 
     formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateFormat:@"mm:ss"]; 
     NSDate *expireTime = [NSDate dateWithTimeIntervalSince1970:expireSeconds]; 
     activeInventoryImage.image = [UIImage imageNamed:imageName]; 
     activeInventoryLabel.text = [formatter stringFromDate:expireTime]; 
     [formatter release]; 
     runTimer = TRUE; 
    } 

    return runTimer; 
} 

- (void) inventoryStatus{ 

    // if there is no active inventory kill the timer 
    if(
     ![self inventoryActive:[GameData sharedGameData].player.inventory.aExpire withImage:@"a.png"] && 
     ![self inventoryActive:[GameData sharedGameData].player.inventory.bExpire withImage:@"b.png"] && 
     ![self inventoryActive:[GameData sharedGameData].player.inventory.cExpire withImage:@"c.png"] 
     ){ 
     activeInventoryImage.image = [UIImage imageNamed:@""]; 
     activeInventoryLabel.text = @""; 
     if(inventoryStatusTimer != nil) 
      [inventoryStatusTimer invalidate]; 
    } 

} 

- (void) advanceToView:(id)nextView{ 
    if([nextView isKindOfClass:[UIView class]]){ 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:2.7]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self.view cache:YES]; 
     [self.view addSubview:nextView]; 
     [UIView commitAnimations]; 
    } 
    else 
     NSLog(@" Error Loading View: %@",nextView); 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [activeInventoryImage removeFromSuperview]; 
    [activeInventoryImage release]; 
    [activeInventoryLabel release]; 
    [super dealloc]; 
} 


@end 

ответ

0

После некоторых экспериментов, которые я обнаружил с помощью initWithFrame, исправлена ​​проблема дрейфа.

activeInventoryImage = [[UIImageView alloc] initWithFrame:CGRectMake(258, 7, 20, 20)]; 
activeInventoryLabel = [[UILabel alloc] initWithFrame:CGRectMake(280, 6, 30, 20)]; 

Я до сих пор не знаю, в чем главная причина проблемы. Если бы кто-нибудь мог рассказать мне, что здесь происходит, я бы с удовольствием узнал в будущем.

1

Поставьте точку останова в advanceToView, как это, кажется, ваш единственный код анимации. Каждый раз, когда он вызывается, посмотрите на стек вызовов в отладчике. Отсюда вы можете видеть, что вызывает этот код, когда они не должны быть.

+0

Я опустил точку перерыва заранее и посмотрел, что он вызывается по назначению (только один раз при изменении экрана, инициированном нажатиями кнопок). Я также прокомментировал весь код анимации в рамках процедуры и оставил только [self.vew addSubView: nextView]; Я по-прежнему вижу поведение последовательно на небольшом подмножестве моего viewControllers. Я заметил, что анимация отсутствует, когда я перехожу через отладчик. Это, однако, когда я бегу без точек останова. Я все еще в тупике. Любые показатели здесь? –