2015-09-29 2 views
0

первый вопрос, так что успокойтесь!iOS Вращение Жест после анимации

Создание простого приложения для iOS. У меня есть вид, который содержит вращающийся диск (UIImageView) (вращается через «Жест вращения») и UIButton, который при нажатии использует UIView animateWithDuration для перемещения кнопки в одно из трех мест.

Моя проблема .. вращение циферблата в порядке, перемещение кнопки в порядке, НО .. когда я перемещаю кнопку, затем поворачиваем диск, положение кнопки «перезагружается» до исходного кадра.

Как остановить поворот, влияющий на положение кнопки/движения кнопки.

ViewController.h

#import <UIKit/UIKit.h> 
#import <AVFoundation/AVFoundation.h> 

@interface ViewController : UIViewController <UIGestureRecognizerDelegate>{ 

IBOutlet UIImageView *lock; 
IBOutlet UILabel *number; 
IBOutlet UILabel *displayNumber1; 
IBOutlet UILabel *displayNumber2; 
IBOutlet UILabel *displayNumber3; 

IBOutlet UIButton *slider; 

AVAudioPlayer *theAudio; 

} 

@property (retain, nonatomic) IBOutlet UIImageView *lock; 
@property (retain, nonatomic) IBOutlet UILabel *number; 
@property (retain, nonatomic) IBOutlet UILabel *displayNumber1; 
@property (retain, nonatomic) IBOutlet UILabel *displayNumber2; 
@property (retain, nonatomic) IBOutlet UILabel *displayNumber3; 

@property (retain, nonatomic) IBOutlet UIButton *slider; 

@property (retain, nonatomic) AVAudioPlayer *theAudio; 

-(IBAction)moveSlider:(id)sender; 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0/M_PI)) 

@synthesize lock, number, slider, displayNumber1, displayNumber2, displayNumber3, theAudio; 

CGFloat _lastRotation; 
int lastNumber; 
NSTimer *clickTimer; 

int _whichNumberSelected; 

int _currentDirection; 
CGFloat _changeDirectionMatch; 

float no1Left = 61; 
float no2Left = 151; 
float no3Left = 238; 

NSString *lastText1; 

CGRect newFrameSet; 

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 



- (void)viewDidLoad { 
    [super viewDidLoad]; 

    lock.userInteractionEnabled = YES; 


    UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotationWithGestureRecognizer:)]; 
    rotationGestureRecognizer.delegate = self; 
    [lock addGestureRecognizer:rotationGestureRecognizer]; 

    _lastRotation = 0; 

    lastNumber = 0; 


    NSString *path = [[NSBundle mainBundle] pathForResource:@"click" ofType:@"wav"]; 
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: path]; 
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:NULL]; 
    theAudio.volume = 1.0; 
    [theAudio prepareToPlay]; 

    _currentDirection = 0; 
    _changeDirectionMatch = 0; 
    _whichNumberSelected = 1; 

    lastText1 = ([NSString stringWithFormat:@"0"]); 

} 



-(IBAction)moveSlider:(id)sender { 

    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
     CGRect newFrame = slider.frame; 
     switch (_whichNumberSelected) { 
      case 1: 
       newFrame.origin.x= no2Left; 
       _whichNumberSelected = 2; 
       break; 
      case 2: 
       newFrame.origin.x= no3Left; 
       _whichNumberSelected = 3; 
       break; 
      case 3: 
       newFrame.origin.x= no2Left; 
       _whichNumberSelected = 4; 
       break; 
      case 4: 
       newFrame.origin.x= no1Left; 
       _whichNumberSelected = 1; 
       break; 

      default: 
       break; 
     } 
     slider.frame = newFrame; 
     newFrameSet = newFrame; 
    } completion:nil]; 
} 




-(void)handleRotationWithGestureRecognizer:(UIRotationGestureRecognizer *)rotationGestureRecognizer{ 



    CGFloat newRot = RADIANS_TO_DEGREES(rotationGestureRecognizer.rotation)/3.6; 
    lock.transform = CGAffineTransformRotate(lock.transform, rotationGestureRecognizer.rotation); 
    CGFloat c = _lastRotation - newRot; 
    _lastRotation = c; 

    if(c < 0){ 
     c = c + 100; 
     _lastRotation = c; 
    } 
    if(c >= 100){ 
     c = c-100; 
     _lastRotation = c; 
    } 



    if(c >= 99.5){ 
     displayNumber1.text = @"0"; 
    } else { 
     displayNumber1.text = ([NSString stringWithFormat:@"%.f", c]); 
    } 

    if([displayNumber1.text isEqualToString:lastText1]){ 
    } else { 
     [theAudio play]; 
    } 



    lastText1 = displayNumber1.text; 

    rotationGestureRecognizer.rotation = 0.0; 

} 






- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

ответ

0

Добро пожаловать на переполнение стека.

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

Проблема в том, что при изменении рамки напрямую, в какой-то момент что-то вызывает повторную компоновку формы, а ограничения привязывают ее обратно на место. Даже если вы явно не добавляете ограничения, система делает это.

Анимация вращения должна быть прекрасной, поскольку она меняет вращение на преобразование вида, а не на ее положение, и нет никаких ограничений, которые я знаю для вращения.

Что вы делаете для анимации с использованием ограничений - это привязать ограничения к кнопке в IB, а затем перетащить управление из ограничений в заголовок контроллера вашего вида, чтобы создать выходные места для ограничений. (Например, ограничения ведущего и верхнего края.)

Затем в вашей анимации измените константу (-ы) на ограничения (-ы) и назовем layoutIfNeeded.

Альтернативой является отключение автоматической компоновки для вашего контроллера вида, использование старого стиля «распорки и пружины», а затем ваша анимация кадра будет работать как всегда.

+0

Отключен автоматический макет - отлично работает сейчас! Как вы сказали, жест поворота в моем коде, казалось, вызывал какие-то «сбросные ограничения» при использовании автоматического макета. – NIHDev

+0

Отключение автоматической компоновки не является идеальным решением. Apple агрессивно продвигается к автоматической компоновке и может даже отказаться от старого стиля масок для изменения размеров (макет «распорки и пружины») в какой-то момент в будущем. Тем временем некоторые функции не будут работать, если вы не используете автоматическую компоновку. Вы, конечно же, не сможете поддерживать изменение размера экрана с несколькими экранами с несколькими экранами, предлагаемое в iOS 9, если вы, например, не используете классы автоматического макета и размера. –