2014-01-22 1 views
2

scrollable 인 모든 행에 여러 이미지를 표시하도록 tableview를 원합니다. 이것에 대해 UITableViewCustom UITableViewCell을 사용하고 있는데, 사용자 정의 tableView 셀에 여러 개의 뷰가있는 스크롤 뷰를 생성하고 있습니다. & 이미지이므로 스크롤 할 때 테이블이 부드럽게 깜박이지 않습니다. 아무도 나를 더 나은 방법으로 이것을 제안 할 수 있습니까?objective c UITableView가 사용자 정의 셀 및 뷰로 부드럽게 스크롤되지 않음

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Products table view. 
    ProductCustomCell *cell = (ProductCustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CatelogCell"] ;//] forIndexPath:indexPath]; 
    if (cell == nil) { 
     cell = [[ProductCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CatelogCell"]; 
    } 
    cell.productCellDelegate = self; 
    [cell initProperties]; 
    [cell showProductsInScroll:catelogBundle]; 
} 
+0

세포를 어떻게 구성하고 있습니까? 우리에게 XIB를 보여 주겠습니까? 일부 코드? – Cyrille

+1

셀에 표시되는 내용은 무엇입니까? 앱 번들에없는 이미지와 같이로드해야하는 콘텐츠가 있습니까? – Stavash

+2

질문에 대한 업데이트가 있으면 수정하십시오. 거대한 코드 조각을 주석으로 게시하지 마십시오. – dandan78

답변

5

부드럽게 표보기를 스크롤하려면주의해야 할 몇 가지 팁이 필요합니다.

  1. 캐시 행의 높이, 을 (테이블 뷰 자주를 요청할 수 있습니다) - 실제로이 점은 당신의 tableview 스크롤을 차단하는 중요한 점은 없습니다.

  2. 테이블에서 사용되는 이미지에 대해 가장 최근에 사용되지 않은 캐시를 만들고 (메모리 경고를 받으면 모든 비활성 항목을 무효화) - SDWebImage를 사용하여 이미지를 다운로드하고 캐시 할 수 있습니다. 그리고 때로는 테이블 뷰가 자주 사용하는 일부 이미지를 캐싱하고 현재 뷰가 최상위보기 인 경우 메모리 경고를 받더라도 이미지가 비어 있지 않을 수도 있습니다.

  3. UITableViewCell ' s drawRect: 가능한 경우 서브 뷰를 피하십시오 (표준 접근성 기능이 필요하거나 콘텐츠보기의 drawRect:) - 비용을 절약 할 수 있지만 코드 작성 시간이 오래 걸리고 코드 유지 관리가 어려울 수 있습니다. 그러나 uitableviewcell에 대한 뷰를 적게 사용하면 성능이 향상됩니다.

  4. UITableViewCell의 레이어를 불투명하게 만듭니다. 콘텐츠가있는 경우 콘텐츠보기에도 동일하게 적용됩니다. - 가능한 한 레이어 불투명도를 사용하십시오.

  5. UITableView 예제/설명서 에서 권장하는 reusableCellIdentifier 기능을 사용하십시오.이 팁을 따라야합니다. UIImage의 에 구운 사전되지 않습니다

  6. 않도록 그라데이션/복잡한 그래픽 효과 - 같은 점 물론 4

, 대부분의 시간, 당신의 tableview 스크롤, 부드러운 주요없는 경우 문제는 이미지를 동기화하여로드한다는 것입니다.

악기를 사용하여 성능을 테스트하는 것이 좋습니다.

0

난 당신이 jQuery과의 cellForRowAtIndexPath 위임 방법으로 객체를 할당 할 수 있다는 문제가 될 수있다 생각합니다. 따라서 모든 유형의 객체를 할당하는 대신 ProductCustomCell 클래스에 할당하거나 xib 파일에 객체를 만듭니다.

+0

예 실제로 지금까지 내가 뭘하는지, 스크롤 뷰 객체, UIView & UILabel을 각 행의 ProductCustomCell 클래스에 할당하고 있습니다. – Mega

+0

피하십시오. 자동으로 부드럽게 스크롤을 시작합니다 –

+0

그리고 내가 당신을 도왔다면 내 대답을 받아 들일 수 있으므로 다른 사용자들도이 게시물이 유익하다는 것을 알게 될 것입니다 : P –

1

아마도 이미 문제에 대한 해결책을 찾았 겠지만, 여전히 찾고있는 중이라면 나에게 도움이 될 것입니다. 또한 여러 tableview 셀을 통해 많은 그림을 표시하는 응용 프로그램에서 일하고 있습니다.

cellForRowAtIndexPath 메서드는 앱이 이미 표시되지 않은 화면에 새 셀을로드 할 때마다 호출되기 때문에 새로운 셀로 위 또는 아래로 스크롤 할 때마다이 메서드는 계속 호출됩니다. 다른 위치로 스크롤하기 전에 일부 셀이 화면에 먼저있는 경우

셀과 배열에 처음 초기화 된 해당 indexpath를 저장하고 cellForRowAtIndexPath 메서드가 다시 호출되면 해당 셀이 이미 초기화되었는지 확인하여 인덱스 경로가 내 배열에 저장되어 있는지 확인합니다 indexpath의

@implementation MyViewController{ 
    NSMutableArray *cells; 
    NSMutableArray *indexpaths; 
} 

... 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    // check if in array 
    if ([indexpaths containsObject:indexPath]){ 
     return cells[indexPath.row]; 
    } 

    // otherwise, create a new one 
    UITableViewCell *cell = [[UITableViewCell alloc] init]; 

    // customizing cell 
    // other stuff 
    ... 

    // finally save the cell and indepath for checking later 
    [cells addObject:cell]; 
    [indexpaths addObject:indexPath]; 

    return cell; 
} 
+1

이것은 해결책이 아닙니다. UITableView에는 셀 재사용 프로세스가 내장되어 있습니다. 메소드 dequeueReusableCellWithIdentifier 또는 dequeueReusableCellWithIdentifier : forIndexPath :를 조사하십시오. 셀이 화면에서 스크롤되는 즉시 대기열에서 제외 된 다음보기로 스크롤되는 다음 셀에서 다시 사용됩니다. 한 번에 표시 할 수있는 것보다 많은 셀이있는 경우 dequeuing을 사용하면 모든 단일 행에 대해 셀을 할당하는 것보다 작은 메모리 사용량이 발생합니다. 가지고있는 셀이 많을수록 메모리 사용 공간의 차이가 더 커집니다. – skladek

0

TinyMonk의 답변 외에도 간단한 방법을 추가하고 싶습니다. 사용자 정의 셀을 사용하여 uitableview를 작성한 경우 클립 서브 뷰 옵션이 표 셀과 사용자 정의 셀 모두에 똑같이 적용되었는지 확인하십시오. 그것은 나를 위해 일했습니다.

0

Leo Cann의 솔루션을 기반으로 Swift3 용으로 업데이트했습니다.

var manualCells = NSMutableArray() 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    // check if in array 
    if manualCells.contains(indexPath) { 
     return manualCells.object(at: indexPath.row) as! UITableViewCell 
    } 

    let cell = self.tableViewReference.dequeueReusableCell(withIdentifier: "mainIdentifier") as! YourTableViewCell 

    // fill the cell...  

    manualCells.insert(cell, at: indexPath.row) 
    return cell 
} 

참고 :이 섹션은 하나의 섹션이 들어있는 테이블 용입니다.

관련 문제