Почему архив XCode работает не так, как сборка / запуск XCode на iPhone - PullRequest
4 голосов
/ 11 января 2012

У меня есть приложение для iPhone, разработанное на XCode 4. Оно корректно работает в следующих средах:

  1. iPhone Simulator (iOS версия 5)
  2. устройство iOS 5 (выполнено)из архива)
  3. устройство iOS 5 (выполнено из сборки XCode)
  4. устройство iOS 4 (выполнено из сборки XCode)
  5. устройство iOS 3 (выполнено из сборки XCode)

Однако, когда я помещаю архив, работающий в iOS 5, на устройство iOS 3 или 4, это выглядит забавно.Точно такой же код прекрасно работает при запуске из XCode на том же устройстве.

Когда я говорю, что это забавно, это анимация скользящего UIView по неправильной оси.Я действительно выполняю преобразование вращения в UIView, прежде чем оживить его.Но опять же, он отлично работает при запуске напрямую из XCode, даже на устройствах iOS 3 и 4.Он работает только в архиве и только для iOS 3 и 4. Архив отлично работает в iOS 5.

Вращение выполняется статическим вызовом в классе помощника:

+ (UIImage*)rotateImage:(UIImage *)image {
CGRect             bnds = CGRectZero;
UIImage*           copy = nil;
CGContextRef       ctxt = nil;
CGImageRef         imag = image.CGImage;
CGRect             rect = CGRectZero;
CGAffineTransform  tran = CGAffineTransformIdentity;

rect.size.width  = CGImageGetWidth(imag);
rect.size.height = CGImageGetHeight(imag);

bnds = rect;

bnds = swapWidthAndHeight(bnds);
tran = CGAffineTransformMakeTranslation(rect.size.height, 0.0);
tran = CGAffineTransformRotate(tran, M_PI / 2.0);

UIGraphicsBeginImageContext(bnds.size);
ctxt = UIGraphicsGetCurrentContext();

CGContextScaleCTM(ctxt, -1.0, 1.0);
CGContextTranslateCTM(ctxt, -rect.size.height, 0.0);

CGContextConcatCTM(ctxt, tran);
CGContextDrawImage(UIGraphicsGetCurrentContext(), rect, imag);

copy = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return copy;
}

Анимация выполняется:

// The first image should fall from top.
CGRect rect = boardView.frame;
rect.origin = CGPointMake(VIEW_IMAGE_X_POS, 0);
boardView.frame = rect;
[myView addSubview:boardView];

// The starting image comes down.  Then passes control to the next animation routine for the clones.
[UIView beginAnimations:@"addStartingImage" context:boardView];
[UIView setAnimationDuration:1.2];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(startingImageDidStop:finished:context:)];

// Add the new image
rect = boardView.frame;
rect.origin = CGPointMake(VIEW_IMAGE_X_POS, myView.contentSize.height - 108);
boardView.frame = rect;

// End the animation
[UIView commitAnimations];

Все остальное работает нормально.Есть мысли?

Ответы [ 2 ]

3 голосов
/ 18 января 2012

Попробуйте отключить оптимизацию компилятора.

Что-то не так с пользовательским интерфейсом на старых устройствах iOS 3.x и 4.x ARMv6 при компиляции релизной сборки.Я понятия не имею, почему, но отключение оптимизации компилятора поможет.

Отключение Thumb также может помочь вам в этой проблеме, вы можете перейти к настройкам сборки и навести курсор мыши на опцию «Other C Flags».Нажмите на маленькую кнопку с плюсом, которая появляется справа от этой опции, и добавьте условие для архитектуры ARMv6.Сделайте это снова, чтобы создать один для архитектуры ARMv7.Под архитектурой ARMv6 добавьте дополнительный флаг компилятора -mno-thumb.

Thumb turned off for ARMv6

0 голосов
/ 11 января 2012

Код выглядит нормально. Единственная проблема, которую я вижу здесь: rect.origin = CGPointMake (VIEW_IMAGE_X_POS, myView.contentSize.height - 108);

Попробуйте жестко закодировать значение myView.contentSize.height . Возможно, что представление / окно может не возвращать contentSize в соответствии с обновленной текущей ориентацией устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...