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