2012-03-19 29 views
3

我有一個通用的二進制應用程序,目前已在iTunes中發佈,並且可以在iOS 4 x至5.1的iPhone 3,4,4S,iPad 2上正常運行,但會顯示運行iOS 5.1的新iPad(3)上的黑色UIImage。從NSData加載的UIImage僅在新iPad上顯示黑色3

有沒有其他人遇到過這個?任何修復建議?

問題是從NSData加載的UIImage顯示爲黑色。

我最初認爲NSData可能是零或不可讀的,所以我添加了UIAlert & NSLog來輸出NSData長度和UIImage大小屬性(假設成功讀取數據到UIImage會產生合理的大小值)。一切看起來OK在UIAlert ...從iPad 3顯示UIAlertView中

// MyView.m 

- (NSData*)getImageData 

{  

    Screening *screen = [[Model sharedInstance] screenInProgress]; 

    return screen.anteriorImage; // returns the NSData from the managed 'Screening' object 

} 


- (void)viewWillAppear:(BOOL)animated 

{ 
    NSData *imagedata = [self getImageData]; 

    UIImage *image = [UIImage imageWithData:imagedata]; 

    [clientImageView setImage:image];  /// UIImageView in nib 




    /// apply user grid 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 


    if ([defaults integerForKey:@"com.ikonetics.posture.gridoverlay"] >= 0) {  

      UIImageView *grid = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"grid.png"]]; 

      [grid setBackgroundColor:[UIColor clearColor]]; 

      [grid setAlpha:0.6f]; 

      [grid setFrame:clientImageView.frame]; 

      [screenshotWrapper addSubview:grid];  // screenshotWrapper is a UIView in xib arranged as a parent to other views 

      [grid release]; 

    } 


    NSString *note = [NSString 

          stringWithFormat:@"NSData length: %d \nUIImage size: %@ \nUIImage scale: %1.f \nClientImage info: %@" 

          , [imagedata length] 

          , NSStringFromCGSize(image.size) 

          , image.scale 

          , [clientImageView description] 

          ]; 



    NSLog(@"debug note: %@ ", note); 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"DEBUG INFO" 

                   message:note 

                   delegate:nil 

                cancelButtonTitle:@"OK" 

                otherButtonTitles:nil]; 

    [alert show]; 

    [alert release]; 



} 



// Screening.h 

@interface Screening : NSManagedObject 


@property (nonatomic, retain) NSData * anteriorImage;  // this data is stored elsewhere using UIImageJPEGRepresentation(image, 0.8); 
... 
@end 

截圖,你可以看到NSData的具有長度和UIImage的具有規模和UIImageView的(ClientImage)具有合理的框架,如預期的那樣,網格疊加UIImage顯示正確。

  • NSData的返回具有長度和不nil(187433下文)
  • 所述的UIImage能夠解析數據和構建圖像,證據由尺寸和縮放屬性(784,980)

iPad 3 screenshot

最後,這已被禁用,以及在/// apply user grid選項測試,所以覆蓋png甚至沒有實例化,因爲代碼塊不運行。黑色的UIImage問題依然存在。

任何其他人有UIImageView顯示黑色UIImage而不是實際圖像的問題?有關如何修復代碼的任何想法或想法,以便在iPad 3上正常工作?

謝謝!

編輯 - 更多調試信息:

我寫的NSData(圖象 - )出來的電子郵件,所以我可以查看它關閉設備。我想知道,如果圖像本身可能是空白/黑色,並且知道數據在從設備上保存時不會顯示爲正確的圖像(它不是空白)。

因此,NSData加載到UIImage & UIImageView顯示黑色......但是當附加到電子郵件它正確顯示圖像。

此外,我想確保視圖的層次結構按預期顯示;檢查我的圖像是不是在另一個視圖下。從ViewController的view開始,我登錄了recursiveDescription,並瞭解到iPad 3上的視圖層次結構與iPad 2相匹配,這正是我期望的。

新的調試代碼:

NSString *note = [NSString 
        stringWithFormat:@"NSData length: %d \nUIImage size: %@ \nUIImage scale: %1.f \nRecursive info: %@" 
        , [imagedata length] 
        , NSStringFromCGSize(image.size) 
        , image.scale 
        , [[self view] recursiveDescription] 
        ]; 

MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; 
mailViewController.mailComposeDelegate = self; 
[mailViewController setSubject:@"Debug email"]; 
[mailViewController setMessageBody:note isHTML:NO]; 
[mailViewController addAttachmentData:imagedata mimeType:@"image/jpg" fileName:@"imagedata.jpg"]; 

[self presentModalViewController:mailViewController animated:YES]; 
[mailViewController release]; 

最後,這裏是從兩個2個& 3器件遞歸日誌信息:

iPad 2的日誌:

NSData length: 123254 
UIImage size: {800, 960} 
UIImage scale: 1 
Recursive info: <UIView: 0x10a91620; frame = (0 0; 768 960); autoresize = W+H; layer = <CALayer: 0x10a91650>> 
    | <UIScrollView: 0x10a90a10; frame = (0 0; 768 960); clipsToBounds = YES; autoresize = RM+TM; layer = <CALayer: 0x10a90bb0>; contentOffset: {0, 0}> 
    | | <UIView: 0x10a90be0; frame = (0 0; 1536 1920); autoresize = LM+RM+TM+BM; layer = <CALayer: 0x10a90c10>> 
    | | | <UIView: 0x10a90c40; frame = (384 480; 768 960); autoresize = LM+RM+TM+BM; layer = <CALayer: 0x10a90c70>> 
    | | | | <UIImageView: 0x10a908f0; frame = (0 0; 768 960); opaque = NO; autoresize = LM+RM+TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x10a90930>> 
    | | | | <LineView_iPad: 0x10a90ce0; frame = (0 0; 768 960); autoresize = LM+RM+TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x10a90d20>> 
    | | | | <PointView_iPad: 0x10a90dd0; frame = (0 0; 768 960); autoresize = LM+RM+TM+BM; layer = <CALayer: 0x10a90e20>> 
    | | | | <UIImageView: 0x10a96480; frame = (0 0; 768 960); alpha = 0.6; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x10a966e0>> 
    | <UIView: 0x10a91680; frame = (-10 750; 220 220); autoresize = RM+TM; layer = <CALayer: 0x10a916b0>> 
    | | <UIImageView: 0x10a916e0; frame = (0 0; 220 220); autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x10a91720>> 
    | | <UIImageView: 0x10a91480; frame = (10 10; 200 200); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x10a914c0>> 
    | | <UIImageView: 0x10a91840; frame = (102 102; 16 16); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x10a91880>> 

的iPad 3日誌:

NSData length: 166252 
UIImage size: {784, 980} 
UIImage scale: 1 
Recursive info: <UIView: 0xc669470; frame = (0 0; 768 980); autoresize = W+H; layer = <CALayer: 0xc667550>> 
| <UIScrollView: 0x33d410; frame = (0 20; 768 960); clipsToBounds = YES; autoresize = RM+TM; layer = <CALayer: 0x325840>; contentOffset: {0, 0}> 
| | <UIView: 0x308630; frame = (0 0; 1536 1920); autoresize = LM+RM+TM+BM; layer = <CALayer: 0xc666f40>> 
| | | <UIView: 0x318970; frame = (384 480; 768 960); autoresize = LM+RM+TM+BM; layer = <CALayer: 0xc682a70>> 
| | | | <UIImageView: 0xc66cd60; frame = (0 0; 768 960); opaque = NO; autoresize = LM+RM+TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xc672c00>> 
| | | | <LineView_iPad: 0x301680; frame = (0 0; 768 960); autoresize = LM+RM+TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x329fa0>> 
| | | | <PointView_iPad: 0xc6841b0; frame = (0 0; 768 960); autoresize = LM+RM+TM+BM; layer = <CALayer: 0xc672b10>> 
| | | | <UIImageView: 0xc588b70; frame = (0 0; 768 960); alpha = 0.6; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xc589500>> 
| <UIView: 0x324330; frame = (-10 770; 220 220); autoresize = RM+TM; layer = <CALayer: 0xc687970>> 
| | <UIImageView: 0xc665b80; frame = (0 0; 220 220); autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x321490>> 
| | <UIImageView: 0x314e50; frame = (10 10; 200 200); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xc684f30>> 
| | <UIImageView: 0x63d220; frame = (102 102; 16 16); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xc580d90>> 

儘管這篇文章如此令人難以忍受,但我確實希望有人能夠想到任何可能導致此問題的內容......

回答

2

這似乎是iOS的一個錯誤。這是解決方法:

  • 在Interface Builder中改變的UIImageView背景紋理任何顏色

就是這樣。

我在調試過程中偶然發現了這個問題,同時任意地翻轉開關,試圖讓一些有趣的事情發生。我的代碼/應用程序沒有使用UIImageView的背景顏色,它的屬性沒有被調整過...以前?

在我上面的代碼中,UIImageView'clientImageView'的背景設置爲「View Flipside Background Color」。將該紋理設置爲背景時,加載的UIImage將拒絕顯示。將背景紋理更改爲除Flipside之外的任何內容,並且按預期顯示UIImage。

  • 我們進行的唯一更改是在Interface Builder中的UIImageView的背景顏色屬性。
  • 唯一出現錯誤的地方是運行iOS 5.1的iPad 3硬件。
  • 它無法每一次和可再現
  • 通過5.1

報告給蘋果作爲錯誤ID#在電話4,4S,iPad 2的還測試在iOS 4.x的11080928