2

さまざまなオプションを試し、SO に関する多数の回答を読んだ後、誰かがこの問題に対する洞察または解決策を提供できることを期待して、この質問を投稿しています。

iOS5.1、XCode 4.4.1、ストーリーボード、ARC

「グループ化された」テーブルビューがあり、各セルには一連のラベル、画像、ボタンが含まれています。ラベルの 1 つである説明ラベルは、テキストが大きくても小さくてもかまいません。つまり、テキストが大きい場合は、それに応じてラベルのサイズを大きくし、それに応じて下にボタンを配置する必要があります。私はこれをすべて行うことができますが、問題は、最初のセルを過ぎてスクロールするとボタンが 2 回表示され、スクロールしながら繰り返し続けることです。

コードは次のとおりです。テキストに基づいてラベルの高さを計算し、ラベルのサイズを変更し、それに応じて説明ラベルの下に 3 つのボタンを配置するだけです。

以下のコードは 1 つのボタン用ですが、これで私が何をしているかがわかります。カスタムセルクラスの「willDisplayCell」で同様のことを試みましたが、テーブルビューを下にスクロールすると3つのボタンが繰り返されます。スクリーンショットを参照してください。最初の 3 つのボタンは表示されません。

最初の 3 つのボタンの位置がsizeIncrementを無視した場合と同じであることに気付きました。つまり、「359.0f + sizeIncrement +20」から「sizeIncrement」を引いたもので、「sizeIncrement」= 計算後の説明ラベルの高さです。

私も気づいた

float y = 359.0f + 20;

これの代わりに

float y = 359.0f + sizeIncrement +20;

ボタンの問題の繰り返しはなくなりました。

PS: これが最善のコードではないことはわかっていますが、問題を解決するために多くのことを試みてきたので、現時点ではベスト プラクティスなどに悩まされることはありません。

スクリーンショットに表示された 2 つのセル。最初の 3 つのボタンは表示されません

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

 static NSString *CellIdentifier = @"tipsid";

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

 id tip = [_tips objectAtIndex: [indexPath section]];

 NSDictionary *tipForIndex = [_tips objectAtIndex: [indexPath section]];
 float sizeIncrement = [Utility getLabelHeightForText:[tipForIndex objectForKey:@"tipDescripion"]
                                            withWidth:285.0f
                                             withFont:[UIFont systemFontOfSize:14.0f]];

 // Here I Resize the Label, code below to create a button and position accordingly.

 float y = 359.0f + sizeIncrement +20;

 UIButton *likeButton = [[UIButton alloc] initWithFrame:CGRectMake(10, y, 80, 26)];
 likeButton.tag = [indexPath section];     

 // add targets and actions
 [likeButton addTarget:self action:@selector(likebuttonClicked:) forControlEvents:UIControlEventTouchUpInside];
 [likeButton setBackgroundImage:[UIImage imageNamed:@"likebutton.png"] forState:UIControlStateNormal];

 [likeButton setImage:[UIImage imageNamed:@"likedButton.png"] forState:UIControlStateSelected];

 // add to a view
 [cell.contentView addSubview:likeButton];

.....同様に、他の 2 つのボタンを作成します。

4

1 に答える 1

1

ボタンの作成をif (cell == nil)オペレーターに移動する必要があります。

if (cell == nil)
{
   cell = [[TipsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

   // like button
   float y = 359.0f + sizeIncrement +20;

   UIButton *likeButton = [[UIButton alloc] initWithFrame:CGRectMake(10, y, 80, 26)];
   likeButton.tag = LIKE_BUTTON_TAG_UNIQUE_IN_CONTENT_VIEW; // <<<<<<<<<<----------------     

   // add targets and actions
   [likeButton addTarget:self action:@selector(likebuttonClicked:) forControlEvents:UIControlEventTouchUpInside];
   [likeButton setBackgroundImage:[UIImage imageNamed:@"likebutton.png"] forState:UIControlStateNormal];

   [likeButton setImage:[UIImage imageNamed:@"likedButton.png"] forState:UIControlStateSelected];

   // add to a view
   [cell.contentView addSubview:likeButton];

   // other buttons
}

// and here you can adjust button positions
UIButton *likeButton = [self.contentView viewWithIndex:LIKE_BUTTON_TAG_UNIQUE_IN_CONTENT_VIEW];
于 2012-09-03T19:41:45.150 に答える