简体   繁体   English

为什么XCode存档的行为与iPhone上的XCode构建/运行不同

[英]Why is XCode archive acting different than XCode build/run on iPhone

I have an app for the iPhone developed on XCode 4. It works correctly in the following environments: 我有一个在XCode 4上开发的iPhone应用程序。它在以下环境中正常工作:

  1. iPhone Simulator (iOS version 5) iPhone模拟器(iOS版本5)
  2. iOS 5 device (executed from Archive) iOS 5设备(从Archive执行)
  3. iOS 5 device (executed from XCode build) iOS 5设备(从XCode构建执行)
  4. iOS 4 device (execute from XCode build) iOS 4设备(从XCode构建执行)
  5. iOS 3 device (executed from XCode build) iOS 3设备(从XCode构建执行)

However, when I put the archive that works in iOS 5 on a iOS 3 or 4 device it acts funny. 但是,当我将iOS 5中运行的存档放在iOS 3或4设备上时,它很有趣。 The exact same code works fine when run from XCode on the same device though. 从同一设备上的XCode运行时,完全相同的代码工作正常。

When I say it acts funny, it is animating a sliding UIView in the wrong axis. 当我说它表现得很有趣时,它会在错误的轴上动画滑动的UIView。 I do perform a rotation transformation on the UIView before I animate it though. 在我为它制作动画之前,我确实在UIView上执行了旋转变换。 But again, it works fine when run directly from XCode, even on iOS 3 and 4 devices. 但同样,它直接从XCode运行时工作正常,即使在iOS 3和4设备上也是如此。 It is only acting up in the archive and only for iOS 3 and 4. The archive works fine in iOS 5. 它仅在存档中起作用,仅适用于iOS 3和4.该存档在iOS 5中运行良好。

The rotation is done by a static call in a helper class: 旋转是通过辅助类中的静态调用完成的:

+ (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 animation is done by: 动画由:

// 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];

Everything else runs fine. 其他一切都很好。 Any thoughts? 有什么想法吗?

Try to turn off compiler optimizations. 尝试关闭编译器优化。

Something is going wrong with UI on old iOS 3.x and 4.x ARMv6 devices when compiling a release build. 在编译发布版本时,旧iOS 3.x和4.x ARMv6设备上的UI出现问题。 I have no idea why, but turning off compiler optimizations will help. 我不明白为什么,但关闭编译器优化将有所帮助。

Turning off Thumb may also help you with this issue, you can go to your build settings and mouse over the "Other C Flags" option. 关闭Thumb也可以帮助您解决此问题,您可以转到构建设置并将鼠标悬停在“其他C标志”选项上。 Click on the little plus button that appears to the right of this option and add a condition for the ARMv6 architecture. 单击此选项右侧显示的小加号按钮,为ARMv6体系结构添加条件。 Do this again to create one for the ARMv7 architecture. 再次执行此操作以为ARMv7体系结构创建一个。 Under the ARMv6 architecture, add the extra compiler flag of -mno-thumb . 在ARMv6体系结构下,添加-mno-thumb的额外编译器标志。

Thumb已关闭ARMv6

Code looks fine. 代码看起来很好。 The only problem I'm seeing here is at: rect.origin = CGPointMake(VIEW_IMAGE_X_POS, myView.contentSize.height - 108); 我在这里看到的唯一问题是:rect.origin = CGPointMake(VIEW_IMAGE_X_POS,myView.contentSize.height - 108);

Try to hard-code the myView.contentSize.height value. 尝试对myView.contentSize.height值进行硬编码。 It is possible that the view/window might not be returning the contentSize according to the updated current device orientation. 视图/窗口可能不会根据更新的当前设备方向返回contentSize。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM