2012-03-22 12 views
0

私はdrawInRect/drawAtPointを使って文字列/画像を描くことができます。 しかし、私はこのビューにUIProgressViewを追加したいのですか?UIViewサブクラスにuiprogressviewを描画する方法は?

私はのdrawRectメソッドをオーバーライドしています

ので、私はのdrawRect内部UIProgressViewを作成する必要がありますか?ここで

が別のクラスのための私のUITableViewCellのサブクラスであるクラエルールのために(ちょうど私がtableViewCellのサブクラス化をしたかを示すために)、私はこれが正しいかどうかを確認していないが、これは下記UPDATED


私はいつもそれをやります。ここ

- (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; 

}

私はそれを使用する方法である - (無効)cellForRowAtIndexPath

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; 

私はサブビューごとにタグを使用する必要があるのですか?私はそうしなければ何の違いも見ません。 テーブルビューのスクロールラグの原因となっているものはありますか?なぜなら私は前にテーブルビューに同じことを使用しているからです。テーブルのデータソースはコアデータであり、NSFetchedResultsControllerは挿入/削除/更新用ですが、データソースとしてNSMutableArrayにデータを格納することを確信しています。したがって、テーブルビューをスクロールするとコアデータアクセスはありません)。あなたが何か提案があれば、私は聞いて欲しいと思います。そして、私はUIViewのサブクラス化をしてdrawRectをオーバーライドする以上のことが大好きです。

おかげ

答えて

1

。 UITableViewCellのdrawRectをオーバーライドしてパフォーマンスを上げる理由は、デバイスがスクロールの最初のフレームを合成するだけで済むからです。残りの時間は、単一の不透明なテクスチャです。

なぜパフォーマンスが得られるのか分かりますが、UIProgressViewをdrawRectに描画することはできません。なぜなら、UIProgressViewを更新してパフォーマンスが低下するためです。 drawRectメソッドは静的コンテンツのみに使用され、アニメーションを持つセルには使用されません。

最高のことは、サブビューを追加することですが、cellForRowAtIndexPathにサブビューとしてUIProgressViewを追加しないでください。これにより、(セルの再利用のために)重複するUIProgressViewsが重複して表示されます。

UITableViewCellサブクラスでUIProgressViewプロパティを作成し、それをinitWithStyleメソッドのセルに追加してから、layoutSubviewsで再配置します(UITableViewCellをすでにサブクラス化しているので)。

+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サブクラスの中に2つのサブビューがあります。 1.UIProgressView、2. UIView(他のすべてのNSStringベースのコンテンツを含みます)。それでもなお小さな問題があります。私はバックグラウンド操作を行うときに、最後のセルに新しい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

関連する問題