2012-03-22 2 views
0

drawInRect/drawAtPoint를 사용하여 문자열/이미지를 그릴 수 있습니다. 하지만이 뷰에 UIProgressView를 추가하고 싶다면 어떨까요?UIView 하위 클래스에 uiprogressview을 그리는 방법은 무엇입니까?

나는의 drawRect 메서드를 재정하고

,

그래서 난의 drawRect 내부 UIProgressView를 만들 수 있나요?

다음

, 나는이 정확한지 확인 에 대한 크럼 루르을 (단지 내가 tableViewCell 서브 클래 싱을 어떻게했는지 보여주는) 다른 클래스에 대한 내있는 UITableViewCell 하위 클래스 아니라고하지만,이는 다음과 같습니다


은 아래 업데이트] 내가 보통 어떻게하는지.

static NSString *CellIdentifier = @"RootViewTableCell"; 

RootViewTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{ 
    cell = [[[RootViewTableCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier] autorelease]; 
} 

//cell.backgroundView.backgroundColor = TABLE_BACKGROUND_COLOR; 
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 

User *user = [rows objectAtIndex:indexPath.row]; 
cell.nameLabel.text = user.name; 
cell.statusLabel.text = user.status; 

if (user.photo != nil) 
{ 
    //myUser.photo = user.photo; 
    cell.imageView.image = user.photo; 
} 
else{ 
    cell.imageView.image = [UIImage imageNamed:@"person_default"]; 
} 
return cell; 

내가 서브 뷰의 각각에 대해 태그를 사용해야합니까 (무효) cellForRowAtIndexPath - 여기

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 

    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(5.0f,5.0f,40.0f,40.0f)]; 
//imageView.tag = kImage; 
    imageView.layer.cornerRadius = 5.0; 
    imageView.layer.masksToBounds = YES; 

[self.contentView addSubview:imageView]; 



nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(55.0f, 5.0f, 220.0f, 18.0f)]; 
//nameLabel.tag = kName; 
nameLabel.font = [UIFont boldSystemFontOfSize:16]; 
nameLabel.textColor = [[UIColor alloc] initWithRed:18.0/255.0 green:18.0/255.0 blue:18.0/255.0 alpha:1.0f]; 
    //nameLabel.textColor = [UIColor blackColor]; 
nameLabel.backgroundColor = [UIColor clearColor]; 
[self.contentView addSubview:nameLabel]; 
//[nameLabel release]; 


    statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(55.0f, 27.0f, 220.0f, 20.0f)]; 
//lastMessageLabel.tag = kName; 
    statusLabel.font = [UIFont systemFontOfSize:13]; 
statusLabel.textColor = [UIColor colorWithRed:82.0/255.0 
              green:82.0/255.0 
              blue:82.0/255.0 
              alpha:0.8];; 
statusLabel.backgroundColor = [UIColor clearColor]; 
[self.contentView addSubview:statusLabel]; 
//[lastMessageLabel release]; 
} 

return self; 

}

내가 그것을 사용하는 방법입니까? 내가하지 않으면 나는 어떤 차이도 보이지 않는다. 테이블 뷰 스크롤 지연의 원인이 무엇입니까? 왜냐하면 전에 내 tableview에 대해 동일한 것을 사용하기 때문입니다. 테이블 데이터 소스 코어 데이터 및 NSFetchedResultsController 모든 삽입/삭제/업데이트,하지만 내가 NSMutableArray 데이터 소스로, 그래서 내가 tableview 스크롤 할 때 거기에 핵심 데이터 액세스 (하지만 여전히 laggy 데이터를 저장할 확신합니다.). 제발, 당신이 어떤 제안을 듣고 싶습니다, 그리고 UIView 서브 클래 싱하는 이상이 방법을 사랑한다면 drawRect를 재정의하십시오.

감사

답변

1

. UITableViewCell의 drawRect를 재정 의하여 성능을 향상시키는 이유는 장치가 스크롤의 첫 번째 프레임 만 합성해야하기 때문입니다. 나머지 시간은 단일 불투명 한 텍스처입니다.

이제 UIProgressView를 업데이트하는 이유 때문에 성능이 저하되는 이유를 알았으므로 drawRect에 UIProgressView를 그릴 수 없다는 것을 알 수 있습니다. 이로 인해 성능이 저하됩니다. drawRect 메서드는 정적 내용에만 사용되며 애니메이션이있는 셀에는 사용할 수 없습니다.

가장 좋은 방법은 하위보기를 추가하는 것이지만 cellForRowAtIndexPath에 하위보기로 UIProgressView를 추가하지 않는 것입니다. 이로 인해 (셀 재사용으로 인해) 서로 중복되는 많은 중복 UIProgressView가 발생합니다.

UITableViewCell 하위 클래스에서 UIProgressView 속성을 만들고 initWithStyle 메서드의 셀에 추가 한 다음 layoutSubviews에서 재정렬하십시오.

+0

나는 당신의 솔루션을 시도했지만 작동하지 않거나 완전히 이해하지 못했습니다. 내 UITableViewCell 하위 클래스에서 UIProgressView 속성을 만든 다음 progressView를 초기화하고 셀에 추가합니다. [self.contentView addSubview : progressView], 기본적으로 progressView hidden = YES를 설정 한 다음 일부 조건에 따라 cellForRowAtIndexPath를 설정합니다. , cell.progressView.hidden = NO로 설정하고 진행 값을 전달하십시오. cell.progressView.progress = progressValue하지만 앱을 다시로드하면 progressView가 표시되지 않습니다. 좀 더 자세하게 설명해 주시겠습니까? 감사합니다 – triston

+0

진행률보기를 초기화하고 적절한 프레임을 설정했는지 확인 했습니까? –

+0

당신이 옳다. 그건 나쁘다, 프레임 틀린 (복사 & 붙여 넣기 문제) 있어요. 지금 나는 그것을 올바르게 얻었다. UITableViewCell에서 uiprogressview를 하위 뷰로 추가했습니다. 그래서 지금은 UITableViewCell 하위 클래스 안에 두 subview 있어요. 1.UIProgressView, 2. UIView (다른 모든 NSString 기반 컨텐츠 포함). 여전히 작은 문제가 있습니다. 내가 백그라운드 작업을 할 때, 이미 10 개의 셀이 있다고 말하면, 새로운 progressView가 마지막 셀에 추가되고, 테이블 뷰를 아래로 스크롤하면 첫 번째 셀에서 다른 정확히 동일한 progressView가 실행되는 것을 볼 수 있습니다. 어떤 생각? – triston

1

drawRect 방법은 도면에서 도면 커스텀 수행하도록 재정의된다. 사용자 지정 드로잉을 수행하지 않으면이 메서드를 재정의하면 성능이 저하 될 수 있습니다.

이미지를 표시하려면 UIImageView을 사용하십시오. UIProgressView을 표시하려면, 다음과 같이 하위 뷰로 추가 : 당신은있는 UITableViewCell에 UIProgressView을 끌어 안

- (void) didMoveToSuperview { 
    if(progressView != nil) { 
     progressView = [[UIProgressView alloc] initWithFrame:self.bounds]; 
     [self addSubview:progressView]; 
    } 
} 
+0

테이블 셀에 하위 뷰를 추가하는 데 사용되지만 20-30 개 이상의 행이있을 때 스크롤이 느려지므로 왜 drawRect를 오버라이드하고 이제는 매우 부드럽게 스크롤합니다. 하지만 난 UIProgressView 추가에 갇혀있다. – triston

+1

'UITableView'의'reuseIdentifier'를 올바르게 사용 했습니까? 나는 셀에서 서브 뷰를 사용하는 것이 어떤 식 으로든 잘못되지 않으면 스크롤이 느려지 게된다는 생각을하지 않습니다. 일부 코드를 보여줄 수 있습니까? – Krumelur

+0

미안하지만 여전히 코드를 공유하고 싶습니다. 이미 이전 코드를 제거하고 UIView를 서브 클래스로 전환했습니다. – triston

관련 문제