2010-11-18 2 views
2

저는 Apple이 테이블에있는 하위 뷰를 사용하는 방법을 사용하고 있습니다. 아래 내용은 대부분 설명서에 나오는 것입니다. 나는 약 12 ​​이미지에 대한 rss 피드를 통해서만 끌어 들이고 있지만, 느린 스크롤이 발생합니다. 이미지를 제거하면 부드럽게 움직입니다. 이미지가 크지 않기 때문에 문제가 될 수 없습니다. 보다 복잡한 솔루션 (백그라운드 처리 등)을 조사하기 전에이 작업을 더 잘 수행 할 수있는 방법이 있습니까?약간의 이미지로 저속 스크롤

도움을 주셔서 감사합니다.

그것은 당신이 셀을 구성하고 때마다 보이는
#define MAINLABEL_TAG 1 
#define SECONDLABEL_TAG 2 
#define PHOTO_TAG  3 

-(UITableViewCell *)tableView : (UITableView *)tableView cellForRowAtIndexPath : (NSIndexPath *)indexPath { 
    UILabel * mainLabel, * secondLabel; 
    UIImageView * photo; 
    static NSString * CellIdentifier = @ "Cell"; 
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(100.0, 0.0, 210.0, 0.0)] autorelease]; 
     mainLabel.tag = MAINLABEL_TAG; 
     mainLabel.font = [UIFont systemFontOfSize:14.0]; 
     mainLabel.textAlignment = UITextAlignmentRight; 
     mainLabel.textColor = [UIColor blackColor]; 
     mainLabel.opaque = YES; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : mainLabel]; 

     secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(90.0, 30.0, 220.0, 0.0)] autorelease]; 
     secondLabel.tag = SECONDLABEL_TAG; 
     secondLabel.font = [UIFont systemFontOfSize:12.0]; 
     secondLabel.textAlignment = UITextAlignmentRight; 
     secondLabel.textColor = [UIColor darkGrayColor]; 
     secondLabel.opaque = YES; 
     secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : secondLabel]; 

     photo = [[[UIImageView alloc] initWithFrame:CGRectMake(30.0, 3.0, 50.0, 40.0)] autorelease]; 
     photo.tag = PHOTO_TAG; 
     photo.opaque = YES; 
     photo.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview : photo]; 
    } else { 
     mainLabel = (UILabel *)[cell.contentView viewWithTag : MAINLABEL_TAG]; 
     secondLabel = (UILabel *)[cell.contentView viewWithTag : SECONDLABEL_TAG]; 
     photo = (UIImageView *)[cell.contentView viewWithTag : PHOTO_TAG]; 
    } 
    // Configure the cell. 
    mainLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "title"]; 
    secondLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "teacher"]; 
    NSString * path = [[items objectAtIndex:indexPath.row] objectForKey:@ "audimage"]; 
    NSString * mypath = [path stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    NSURL * url = [NSURL URLWithString:mypath]; 
    NSData * data = [NSData dataWithContentsOfURL:url]; 
    UIImage * img = [[UIImage alloc] initWithData:data]; 
    photo.image = img; 
    return cell; 
    [cell release]; 
} 
+0

'[휴대 출시]'호출되지 않을 것이다, Hmm..thanks..I 함께 진행 캐싱이없는 that..so의 생각 – vikingosegundo

답변

1

, 당신은 웹에서 전체 이미지를 다시 다운로드 (즉 인 경우, 또는 하드 디스크에서 읽는 어디 URL 포인트) :

NSData *data = [NSData dataWithContentsOfURL:url]; 
UIImage *img = [[UIImage alloc] initWithData:data]; 

정말 느립니다! UITableView이 작동하는 방식은 셀을 재사용하는 것입니다. 셀이 화면을 벗어날 때마다 다시 표시 될 다음 셀로 사용되도록 cellForRowAtIndexPath 메서드로 되돌려 보낼 수 있습니다.

즉, 마다마다 새 셀이 표시 될 때까지 이미지를 다운로드하고 만듭니다.

대신, 두 가지 옵션이 있습니다

  1. 다운로드 및 (만 12이 있다면, 그것은 아마 너무 많은 메모리를 가지고 가지 않을 것이다) 먼저 모든 이미지를 저장합니다.

  2. 필요에 따라 이미지를 다운로드하고 메모리 경고가 표시되면 캐시 된 이미지 일부를 덤프하십시오. 구현하기가 조금 더 어렵 기 때문에 먼저 첫 번째 솔루션을 사용해 보겠습니다.

+0

에 도달 할 것이다 복귀 후 방법에 아무것도로 이미지가 뷰에서 스크롤 될 때 메모리에 머무르는 이미지? – Allen

+0

@Allen, 아니요 -보기에서 스크롤되는 셀에 새 이미지가 할당되어 이전 이미지가 손실되기 때문에 –

+0

오 ... 그래서 이제는 이미지를 잃어 버렸는지 확인하고, 다시 가서 이미지를 얻습니다. 사진, 이미지가 0이면 이미지를 다시 얻습니다. 죄송합니다. 이해가 안되면 그냥 간단한 것을 찾으려고합니다. – Allen

관련 문제