2010-11-25 2 views
4

UISmrollView 이미지를로드하는 다음 UIScrollView 추가합니다. 이미지는 로컬 이미지이며 높이가 약 5000 픽셀입니다.큰 이미지 블록 스레드 UIScrollview UIImageView 추가

문제는 내가 UIImageView를 UIScrollView에 추가하면 스레드가 차단된다는 것입니다. 이 작업을 수행 할 때 이미지가 표시 될 때까지 UIScrollView를 스크롤 할 수 없으므로 분명합니다.

다음은 예제입니다.

UIScrollView *myscrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 768, 1004)]; 
myscrollview.contentSize = CGSizeMake(7680, 1004); 
myscrollview.pagingEnabled = TRUE; 

[self.view addSubview:myscrollview]; 

NSString* str = [[NSBundle mainBundle] pathForResource:@"APPS.jpg" ofType:nil inDirectory:@""]; 
NSData *imageData = [NSData dataWithContentsOfFile:str]; 
UIImageView *singleImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:imageData]]; 

    //the line below is the blocking line 
[scrollView addSubview:singleImageView]; 

스크롤러를 차단하는 마지막 줄입니다. 나가 버릴 때 이미지가 물론 보이지 않는다는 사실을 제외하고 모든 것이 완벽하게 작동합니다.

멀티 스레딩을 사용하는 것이 UIView 작업에서 작동하지 않는다는 것을 상기 한 것처럼 보입니다. 그래서 궁금한 점이 많습니다.

친절한 도움에 감사드립니다.

답변

0

왜 거대한 이미지를 한 번에 메모리에로드하려고합니까? 많은 작은 이미지로 나누고 그것을 동적으로로드/비우십시오.

+0

의견을 보내 주셔서 감사합니다. 잡지 응용 프로그램의 일부이므로이 작업을 수행하고 있습니다. 이미지는 실제로 스냅하지 않고 수직 스크롤을 필요로하는 기사입니다. –

+0

감사합니다. 나는 여전히 Uiscrollview가 UI를 막지 않고 콘텐츠를 렌더링 할 수 있어야한다고 믿는다 ... –

+0

사용자가 스크롤 할 때 약간의 이미지를 미리로드해야하므로 사용자가 모두 매우 멋지게 보입니다. UIScrollViewDelegate 프로토콜과 scrollViewDidScroll과 같은 메시지를보십시오. 그것으로 당신은 사용자 활동을 제어 할 수 있으며 항상로드/언로드해야하는 것을 알게됩니다. –

1

큰 이미지를 제공하는 경우 CATiledLayer를 확인해야합니다.

이미지가 이미지가 아니고 이미지를 다운 샘플링하거나 타일로 나눌 수없는 경우 배경 스레드에 이미지를 그릴 수 있습니다. . 주 스레드가 아닌 주 스레드의 화면 그래픽 컨텍스트에 그릴 수는 있지만 화면이 아닌 그래픽 컨텍스트로 그릴 수는 있습니다.

  • 당신이로드하고 이미지를 그리기 완료 : 당신의 drawRect에서 화면에 그리는 것과 마찬가지로 당신의 배경 스레드에서 당신은

    • 그것에 당신의 이미지를 그릴 CGBitmapContextCreate와 드로잉 컨텍스트를 만들 수 있습니다 performSelectorOnMainThread 사용하여 주 스레드에서 방법 :보기의의 drawRect를 호출 withObject : waitUntilDone :

    를보기의의 drawRect에 : 방법, 완전히 메모리 상황에 이미지를 그려 일단, 화면에 복사 CGBitmapContextCreateImage를 사용하여 및 CGContextDrawImage.

    이것은 사소한 일이 아니며 적시에 백그라운드 스레드를 시작하고 이미지에 대한 액세스를 동기화해야합니다. CATiledLayer 접근 방식은 이미지를 사용하여 작업하십시오.

  • +0

    감사합니다 아담! 나는 CATiledLayer 접근법을 시도 할 것이다. 나는 이것에 관해서 다시 돌아올 것이다 :-) –

    0

    UIImage를 사용하지 않고 UIImageView를 할당하고 UIScrollView에 하위보기로 추가해보십시오.

    UIImage를 별도의 스레드에로드하고 이미지가 메모리에로드 될 때 UIImageView의 이미지 속성을 설정하기 위해 다른 스레드에서 실행되는 메서드를 가져옵니다.또한 당신은 아마 그냥 메모리에 눈을 유지 할 수있는 개체를있는 UIImage와 편의 생성자를 사용하여 조심 (또는 아마 30메가바이트 +

    UIScrollView *myscrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 768, 1004)]; 
    myscrollview.contentSize = CGSizeMake(7680, 1004); 
    myscrollview.pagingEnabled = TRUE; 
    
    [self.view addSubview:myscrollview]; 
    
    NSString* str = [[NSBundle mainBundle] pathForResource:@"APPS.jpg" ofType:nil inDirectory:@""]; 
    UIImageView *singleImageView = [[UIImageView alloc] init]; 
    
    [scrollView addSubview:singleImageView]; 
    
    //Then fire off a method on another thread to load the UIImage and set the image 
    //property of the UIImageView. 
    

    될 것입니다있는 UIImage에로드 된이 크기의 이미지로 일부 메모리 문제가 발생할 수 있습니다 최대 끝나기)

    또한이 코드를 현재 어디에 실행하고 있습니까?

    관련 문제