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

时间:2012-01-11 03:12:03

标签: iphone objective-c ios xcode

我有一个在XCode 4上开发的iPhone应用程序。它可以在以下环境中正常运行:

  1. iPhone模拟器(iOS版本5)
  2. iOS 5设备(从存档执行)
  3. iOS 5设备(从XCode版本执行)
  4. iOS 4设备(从XCode版本执行)
  5. iOS 3设备(从XCode版本执行)
  6. 然而,当我将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 个答案:

答案 0 :(得分:3)

尝试关闭编译器优化。

在编译发布版本时,旧iOS 3.x和4.x ARMv6设备上的UI出现问题。我不明白为什么,但关闭编译器优化会有所帮助。

关闭Thumb也可以帮助您解决此问题,您可以转到构建设置并将鼠标悬停在“其他C标志”选项上。单击此选项右侧显示的小加号按钮,为ARMv6体系结构添加条件。再次执行此操作以为ARMv7体系结构创建一个。在ARMv6体系结构下,添加额外的编译器标志-mno-thumb

Thumb turned off for ARMv6

答案 1 :(得分:0)

代码看起来很好。我在这里看到的唯一问题是: rect.origin = CGPointMake(VIEW_IMAGE_X_POS,myView.contentSize.height - 108);

尝试对 myView.contentSize.height 值进行硬编码。视图/窗口可能没有根据更新的当前设备方向返回contentSize。