使用NSTimer和动画的UIImageView和UILabel的奇怪行为

问题描述:

这是一个非常奇怪的情况,我从来没有像这样的问题,我真的很感谢我在这篇文章中获得的任何帮助。我做了一个简单的游戏。我会给下面的.h和.m。使用NSTimer和动画的UIImageView和UILabel的奇怪行为

Game30s.h:

// 
// Game30s.h 
// Speedy 
// 
// Created by Ajay Venkat on 15/10/2014. 
// Copyright (c) 2014 AJTech. All rights reserved. 
// 

#import <UIKit/UIKit.h> 

@interface Game30s : UIViewController { 
    IBOutlet UILabel *scorelabel; 
    IBOutlet UIButton *bar1; 
    IBOutlet UIButton *bar2; 
    BOOL isCracked; 
    BOOL isCracked2; 
    NSTimer *go; 
    NSTimer *collision; 
    IBOutlet UIImageView *wall; 
    IBOutlet UIButton *start; 
    IBOutlet UIButton *contin; 
    NSTimer *time; 
    NSTimer *timestart; 
    int timem; 
    IBOutlet UILabel *timemanage; 
    int score; 
} 

-(void)tensecs; 
-(void)timetwo; 
-(void)goRight; 
-(void)col; 
-(IBAction)Statt; 
-(IBAction)Tap1; 
-(IBAction)Tap2; 

@property (nonatomic) BOOL gameCenterEnabled; 
@property (nonatomic, strong) NSString *leaderboardIdentifier; 

@end 

Game30s.m:

// 
// Game30s.m 
// Speedy 
// 
// Created by Ajay Venkat on 15/10/2014. 
// Copyright (c) 2014 AJTech. All rights reserved. 
// 

#import "Game30s.h" 
@import GameKit; 

@interface Game30s() 
@end 

@implementation Game30s { 
    int cracknum; 
    float speed; 
    int score2; 
    int totscore; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    timestart = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timetwo) userInfo:nil repeats:YES]; 
    contin.hidden = YES; 
    start.hidden = NO; 
    bar1.hidden = YES; 
    bar2.hidden = YES; 
    [self authenticateLocalPlayer]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

-(IBAction)Tap1 { 
    int w = ([[UIScreen mainScreen] bounds].size.width); 
    int h = ([[UIScreen mainScreen] bounds].size.height); 
    w = w/2; 
    int r1x = (arc4random() %240) + w ; 
    int r1y = (arc4random() %h); 
    bar1.center = CGPointMake(r1x, r1y); 
    speed = speed + 0.5; 
    score = score + 1; 
} 

-(IBAction)Tap2 { 
    int w = ([[UIScreen mainScreen] bounds].size.width); 
    int h = ([[UIScreen mainScreen] bounds].size.height); 
    w = w/2; 
    int r2x = (arc4random() %240) + w ; 
    int r2y = (arc4random() %h); 
    speed = speed + 0.7; 
    bar2.center = CGPointMake(r2x, r2y); 
    score = score + 1; 
} 

-(void)goRight { 
    bar1.center = CGPointMake(bar1.center.x - speed, bar1.center.y); 
    bar2.center = CGPointMake(bar2.center.x - speed, bar2.center.y); 
} 

-(void)tensecs { 
    if (timem > 0) { 
     timem = timem - 1; 
     NSString* myString = [@(timem) stringValue]; 
     timemanage.text = myString; 
    } else if (timem == 0) { 
     [timestart invalidate]; 
     NSString* myString = [@(score) stringValue]; 
     scorelabel.text = myString; 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     [defaults setInteger:score forKey:@"thirtysecond"]; 
     bar1.hidden = YES; 
     bar2.hidden = YES; 
     start.hidden = NO; 
     start.enabled = YES; 
     contin.hidden = NO; 
     contin.enabled = YES; 
     [go invalidate]; 
     [time invalidate]; 
    } 
} 

-(void)col { 
    if (CGRectIntersectsRect(bar1.frame, wall.frame)) { 
     int r2x = (arc4random() %300) + 300 ; 
     int r2y = (arc4random() %375); 
     bar2.center = CGPointMake(r2x, r2y); 
     int r1x = (arc4random() %300) + 300 ; 
     int r1y = (arc4random() %375); 
     bar1.center = CGPointMake(r1x, r1y); 
    } 

    if (CGRectIntersectsRect(bar2.frame, wall.frame)) { 
     int r2x = (arc4random() %300) + 300 ; 
     int r2y = (arc4random() %375); 
     bar2.center = CGPointMake(r2x, r2y); 
     int r1x = (arc4random() %300) + 300 ; 
     int r1y = (arc4random() %375); 
     bar1.center = CGPointMake(r1x, r1y); 
    } 
} 

-(IBAction)Statt { 
    timem = 30; 
    score = 0; 
    contin.hidden = YES; 
    contin.enabled = NO; 
    time = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tensecs) userInfo:nil repeats:YES]; 
    bar1.hidden = NO; 
    bar2.hidden = NO; 
    int r2x = (arc4random() %300) + 300 ; 
    int r2y = (arc4random() %375); 
    bar2.center = CGPointMake(r2x, r2y); 
    int r1x = (arc4random() %300) + 300 ; 
    int r1y = (arc4random() %375); 
    bar1.center = CGPointMake(r1x, r1y); 
    cracknum = 0; 
    go = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(goRight) userInfo:nil repeats:YES]; 
    collision = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(col) userInfo:nil repeats:YES]; 
    speed = 3; 
    start.hidden = YES; 
    start.enabled = NO; 
} 

-(void)authenticateLocalPlayer{ 
    // Instantiate a GKLocalPlayer object to use for authenticating a player. 
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
    localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { 
     if (viewController != nil) { 
      // If it's needed display the login view controller. 
      [self presentViewController:viewController animated:YES completion:nil]; 
     } else { 
      if ([GKLocalPlayer localPlayer].authenticated) { 
       // If the player is already authenticated then indicate that the Game Center features can be used. 
       _gameCenterEnabled = YES; 
       // Get the default leaderboard identifier. 
       [[GKLocalPlayer localPlayer] loadDefaultLeaderboardIdentifierWithCompletionHandler:^(NSString *leaderboardIdentifier, NSError *error) { 
        if (error != nil) { 
         NSLog(@"%@", [error localizedDescription]); 
        } else{ 
         _leaderboardIdentifier = @"thirtysecondtappers"; 
        } 
       }]; 
      } else { 
       _gameCenterEnabled = NO; 
      } 
     } 
    }; 
} 

@end 

所以这是代码。在方法-(void)tensecs我说:

NSString* myString = [@(timem) stringValue]; 
timemanage.text = myString; 

而且我把一切正常联系起来!然后,在模拟器或任何设备上发生的情况是,时间标签从30减少到0的正确倒数。但每次数字下降时(例如29到28),UIImageView将重置为其屏幕上的原始位置。

请参阅我在此处显示屏幕截图。

The Image moves 1cm and comes back.

Then again

我试着删除那些代码

NSString* myString = [@(timem) stringValue]; 
timemanage.text = myString; 

,然后它没有这样做了。我不知道为什么会发生这种情况!

摘要:

的UIImageView的是回到其原始位置时,计时器标签上改变了许多!此外,我还在实际设计师的图像中添加了约束条件。这是为什么?

这是因为自动布局。如果您尚未关闭自动布局,并通过设置框架来移动视图,那么当视图需要重新绘制时(例如当您的分数标签更改时),您移动的视图将恢复到由其约束定义的位置。要解决此问题,您需要通过调整约束来重新定位视图,或者关闭自动布局。

+0

是的!!!!!!你们真是太棒了!还有一个问题。 AutoLayout的转向是否会导致任何问题? – Xcoder 2014-10-18 05:43:28

+0

@Xcoder,这取决于你如何设置你的观点,以及你想要做什么。您仍然可以在IB中使用旧的弹簧和支柱,或者如果您不想使用自动布局,则可以使用代码定位事物的方式。 – rdelmar 2014-10-18 05:45:55

+0

还有一个问题,我有imageView,它都工作正常,刚才我改变了图像,图像不会显示出来。 :(因此我将它恢复到原来的图像,并且它完美地显示出来,所以我删除了图像查看并放入了我想要的图像,但它仍然不起作用!不知道为什么吗?:) – Xcoder 2014-10-18 05:50:32