2013-10-20 7 views
6

У меня есть UILabel, hardWayLabel, внутри UIView, hardWayView. Мне нужно это представление (и, следовательно, ярлык), чтобы оживить новую позицию в левой части экрана. Однако, пока метка идет в правильное положение, вид можно видеть, продолжая двигаться далеко от левой стороны экрана. Я использую следующий код для анимации (который я использую еще много раз в моем приложении успешно):Почему мой UIView анимируется в неправильном положении?

 CGRect frame = hardWayView.frame; 
     frame.origin.x = painPoint.x; 
     frame.origin.y = painPoint.y; 
     hardWayView.frame = frame; 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:.25]; 

Я использовал NSLog, чтобы убедиться, что painPoint.x и painPoint.y то, что они должны быть 9which является подтверждается тем фактом, что UILabel попадает в правильное положение. Я предполагаю, что реальный вопрос заключается в том, почему UIView будет продолжать двигаться мимо границ экрана (и только в этом случае, когда UIView анимируется из центра экрана влево)?

У меня есть автозапуск включен, хотя я не думаю, что это преступник. Эта проблема возникает, когда я запускаю приложение на iPhone Simulator с iOS 7, и я не могу заставить симулятор работать с iOS 6, поэтому я не могу изолировать проблему до iOS 7 (хотя может быть?) Я начал разработку в старая версия Xcode и приложение не используют раскадровки).

Вот экранная запись проблемы. Как вы можете видеть, перемещение двух изображений слева направо работает нормально. Хотя при перемещении взглядов влево один из видов (черный фон), кажется, выходит из экрана в верхнем левом углу, в то время как метка (в оранжевом тексте) переходит в правильное место). Explanatory video

Обновление: вот еще код. Он почти идентичен другим частям моего приложения, которые работают безупречно, что немного бластер мозга.

NSString *stringOfRands = tDict[@"originalRand"]; 
if ([stringOfRands rangeOfString:@"+"].location != NSNotFound) 
{ 
    NSArray *arrayOfRands = [stringOfRands componentsSeparatedByString:@" + "]; 

    for (int z=1; z<[arrayOfRands count]; z++) 
    { 
      NSString *updateValue = arrayOfRands[z]; 
      NSInteger newHiddenPosition = [self findBlank:leftSpaces]; 

      NSDictionary *updateStuff = @{@"updateValue": updateValue, @"workingMasterDict":tDict, @"newPos":@(newHiddenPosition), @"newCGPto":@"left", @"@parent":colorV}; 

      [self revealHidden:updateStuff]; 

     } 
} 

Я считаю, что проблема действительно происходит во время revealHidden метода, где называется анимация.

[leftSpaces replaceObjectAtIndex:[hardWayPos intValue] withObject:[NSString stringWithFormat:@"full"]]; 
CGPoint painPoint = [[leftPoints objectAtIndex:[hardWayPos intValue]] CGPointValue];  
[UIView animateWithDuration:0.25 animations:^{ 
     CGRect frame = hardWayView.frame; 
     frame.origin.x = painPoint.x; 
     frame.origin.y = painPoint.y; 
     hardWayView.frame = frame; 
    } completion:^(BOOL finished) { 
     // 
    }]; 

hardWayView.hidden=0; 
hardWayView.backgroundColor = [UIColor blueColor]; 
hardWayLabel.textColor = [UIColor orangeColor]; 

Я попытался сделать frame.origin.x и .y действительные числа (в отличие от переменных) и та же картина вытекает: UILabel одушевляет в нужное место и UIView одушевляет от от верхнего левого угла экрана

+0

Отключите автоспуск и проверьте его. Вероятно, это преступник. – Joel

+0

@Joel alas no. То же самое происходит при отключении автовыключения. – zch

+0

Сначала вы изменяете рамку, а затем запускаете анимацию. – Exploring

ответ

10

Whooaa! После отладки muuuch я наконец нашел проблему !! :) Позвольте мне сказать вам ... у вас там есть интересный код. В любом случае, вы будете удивлены, узнав, насколько глупый вопрос; вы готовы?

Вот проблема:

Вокруг линии 540 у вас есть дополнительный символ «@», поэтому при попытке получить значение не может найти его:

//ERROR HERE 
NSArray *arrayOfRands = [stringOfRands componentsSeparatedByString:@" + "]; 

for (int z=1; z<[arrayOfRands count]; z++) 
{ 
    NSString *updateValue = arrayOfRands[z]; 
    NSInteger newHiddenPosition = [self findBlank:leftSpaces]; 

    // This is the line with the error!! 
    // You have @"@parent" but it should be @"parent"  
    NSDictionary *updateStuff = @{@"updateValue": updateValue, @"workingMasterDict":tDict, @"newPos":@(newHiddenPosition), @"newCGPto":@"left", @"@parent":colorV}; 

    [self revealHidden:updateStuff]; 

} 

Это было очень интересно отлаживать ваш код!

Cheers :)

+0

Ты потрясающий. В самом деле, это была проблема, и спасибо за ваше время в отслеживании такой глупой опечатки. Я ненавижу предположение извиниться за то, что попросил кого-то пройти мой код, но уродство этого файла, от которого вы отлаживаете, является исключением. Я сказал себе, что просто хочу написать приложение, а затем очистить его/узнать о Objective-C позже ... поэтому нет нужды говорить, что этот код много убирает в будущем. Ура! – zch

+0

Awesome Luis .. нравится для вашего посвящения, чтобы помочь zch. :) – dRAGONAIR

+0

@dRAGONAIR спасибо. Вот почему мы все здесь ... помогаем друг другу – LuisCien

6

По внешнему виду вы устанавливаете hardWayView.frame = frame; перед началом анимации, чтобы UIView изменил местоположение, а затем оживил. Точки переключения между

hardWayView.frame = frame; 
[UIView beginAnimations:nil context:nil]; 

следует исправить.

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

[UIView animateWithDuration:0.4 animations:^{ 
CGRect frame = hardWayView.frame; 
frame.origin.x = painPoint.x; 
frame.origin.y = painPoint.y; 
hardWayView.frame = frame; 
} completion:^(BOOL finished) { 
    // 
}]; 
+0

Благодарим за предложение - и я обязательно заменит все вхождения моего кода анимации на метод блокировки. Однако это изменение не показало эффекта. Проблема остается в том, что UIView все еще перемещается за кадром, независимо от того, для чего установлены 'frame.origin.x'' и' '.y''. – zch

1

Не было бы лучше иметь код внутри блока завершения? (Или перед блоком animateWithDuration).

[UIView animateWithDuration:0.25 animations:^{ 
       CGRect frame = hardWayView.frame; 
       frame.origin.x = painPoint.x; 
       frame.origin.y = painPoint.y; 
       hardWayView.frame = frame; 
      } completion:^(BOOL finished) { 

      hardWayView.hidden=0; 
      hardWayView.backgroundColor = [UIColor blueColor]; 
      hardWayLabel.textColor = [UIColor orangeColor]; 

      NSDictionary *hardWay = @{@"view": hardWayView, @"label": hardWayLabel, @"intValue":[NSString stringWithFormat: @"%@", hardWayLabel.text], @"hiddenBool":@0, @"position":@([hardWayPos intValue]), @"originalRand": [NSString stringWithFormat: @"%@", hardWayLabel.text]}; 
      [masterDict replaceObjectAtIndex:[masterDict indexOfObject:miniMaser] withObject:hardWay]; 

      }]; 

Кроме того, если бы это был я, я бы использовал отдельное имя для каждого прямоугольника, чтобы помочь отлаживать. например не всегда вызывайте свой прямоугольный «кадр». Назовите его centerFrame, leftFrame, rightFrame.

Когда вы выходите из рамки hardWayView в конце анимации, он сообщает, что вы ожидаете?

Когда вы выходите из рамки hardWayView в начале анимации, он сообщает, что вы ожидаете?

Мое предположение - это рамка hardWayView, это не то, что вы думаете.

Работает ли он так, как вы ожидаете, если вы установите рамку непосредственно без анимации?

Смежные вопросы