5

標準の UITableView があります。shadowColorセルのtextLabelをに設定したいのですが[UIColor whiteColor]、セルがタッチされたときだけです。そのために、次のコードを使用しています。setSelected/setHighlighted をオーバーライドするカスタム UITableViewCell サブクラスです。

@implementation ExampleTableViewCell


- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    [self setShadowColorSelected:selected];

}

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];
    [self setShadowColorSelected:highlighted];
}

- (void)setShadowColorSelected:(BOOL)selected {
    if (selected) {
        self.textLabel.shadowColor = [UIColor blackColor];
    }else {
        self.textLabel.shadowColor = [UIColor whiteColor];
    }
}

@end

このアプローチに関する私の問題は、選択を解除すると、ラベルのテキストと影の両方が白くなる非常に短い期間がセルにあることです。選択解除の正確な瞬間に撮影されたこのスクリーンショットを参照してください。

影の例

基本的には、次の 2 つの投稿と同じアプローチです。

カスタムセルの選択した色からのUILabelの影

選択時にUITableViewCellのテキストシャドウを削除する

後者の質問で受け入れられた回答のアプローチを使用しています。

非常に単純なコード プロジェクトを作成し、github にアップロードしました。それは私の問題を示しています。単一のセルを表示するのは単なる UITableViewController です。

それとは別に、派手なことは何もありません。UITableView デリゲート メソッド:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[ExampleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text = @"test";

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; //setting this to NO doesn't work either!
}

何か案は?

4

8 に答える 8

5

私が問題を理解していれば、セルの選択がアニメーション化されてなくなるまで、影の色を表示する必要があります。あなたが試した方法で何が間違っているのかわかりませんが、より簡単な解決策はうまくいきます。

不要になったらオブザーバーを削除する必要があることに注意してください。

ExampleTableViewCell.h

@interface ExampleTableViewCell : UITableViewCell {

}

- (void) setSelectionShadowOfColor:(UIColor *) selColor;
@end

ExampleTableViewCell.m

@implementation ExampleTableViewCell

- (void) setSelectionShadowOfColor:(UIColor *) selColor {
    self.textLabel
    [self addObserver:self
           forKeyPath:@"textLabel.highlighted" // not isHighlighted as that is a getter name of the highlighted property
              options:NSKeyValueObservingOptionNew
              context:NULL];
}


- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {

    BOOL isHighlighted = [[change objectForKey:NSKeyValueChangeNewKey] boolValue];

    if (isHighlighted) {
        self.textLabel.shadowColor = [UIColor blackColor];
    } else {
        self.textLabel.shadowColor = [UIColor whiteColor];
    }
}

@end

ExampleTableViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    ExampleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // note the type ExampleTableViewCell is used here to avoid the interface lookup mess
    if (!cell) {
        cell = [[ExampleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        [cell setSelectionShadowOfColor:[UIColor blackColor]];
    }
    cell.textLabel.text = @"test";

    return cell;
}
于 2012-10-31T11:37:15.953 に答える
2

以下を UITableViewDelegate に追加します。

NSIndexPath *selectedIndex;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[ExampleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text = @"test";
    if(indexpath == selectedIndex)
    {
        cell.textlabel.shadowColor = [UIColor blackColor];
    }
    else
    {
        cell.textlabel.shadowColor = [UIColor whiteColor];
    }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView beginUpdates];
    selectedIndex = indexpath;
    [self.tableView endUpdates];
}
于 2012-10-31T14:00:10.963 に答える
0

私も同じ問題に直面していました。

デフォルトのラベルを使用する代わりに、UIButton を使用すると、問題が解決されます。

カスタムボタンをセルに配置します。

私の要件は解決されました。それはあなたを助けるかもしれません。

于 2012-11-05T11:29:22.240 に答える
0

これは私ができた最高のものです:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:NO];

    [self setShadowColorSelected:selected];
}

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:YES];

    [self setShadowColorSelected:highlighted];
}

- (void)setShadowColorSelected:(BOOL)selected {
    [self.textLabel setBackgroundColor:[UIColor clearColor]];

    if (selected)
    {
        [self.textLabel setTextColor:[UIColor whiteColor]];
        [self.textLabel setShadowColor:[UIColor blackColor]];

        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView transitionWithView:self.textLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
            if (selected)
            {
                [self.textLabel setTextColor:[UIColor whiteColor]];
                [self.textLabel setShadowColor:[UIColor blackColor]];
            }
            else
            {
                [self.textLabel setTextColor:[UIColor blackColor]];
                [self.textLabel setShadowColor:[UIColor whiteColor]];
            }
        } completion:nil];
    }
    else
    {
         [self.textLabel setTextColor:[UIColor blackColor]];
         [self.textLabel setShadowColor:[UIColor whiteColor]];
    }
}
于 2012-10-29T22:35:29.770 に答える
0

同じ問題がありました。私が調べたすべてのソリューションには、サブキャッシングが必要でした/追加のコードが多すぎます。

私が最終的に行ったことはUILabel、プライマリの下にUILabel影として機能する秒を作成することです.

プライマリ ラベルとシャドウ ラベルにシャドウを設定しないでください。シャドウ ラベルについては、[通常の色] をシャドウの色にしたい色に設定し、ハイライトされた色を [クリア カラー] に設定します。

明らかに、プライマリ ラベルを更新するたびにシャドウ ラベルを更新する必要があります。多くの場合、大きな代償はありません。

それが役立つことを願っています!

于 2012-10-31T12:14:02.640 に答える
0

私の理解によると、必要な色で次のコードを使用してテーブルビューの色を変更することで、この問題を解決できます

[tableView setBackgroundColor:[UIColor "GrayColor"]];
于 2012-10-30T07:27:36.747 に答える
0

これは、あなたが望むものを達成するための簡単な方法です:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    self.textLabel.shadowColor = [UIColor blackColor];
    [super touchesBegan:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    self.textLabel.shadowColor = [UIColor whiteColor];
    [super touchesEnded:touches withEvent:event];
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {

    self.textLabel.shadowColor = [UIColor whiteColor];
    [super touchesCancelled:touches withEvent:event];
}
于 2012-10-30T15:38:38.333 に答える
0

UITableView が選択/選択解除をアニメーション化するために使用するのと同じ期間で、テキスト/シャドウの色の変化をアニメーション化する必要があると思います。私の理解では、tableViewが選択ハイライトの表示(非表示)のアニメーション化を開始する正確な瞬間にテキスト/シャドウの色を変更するため、色が瞬間的に変化し、選択ハイライトがアニメーション化するのに時間がかかりますある州から別の州へ

次のようなことを試してください:

__block UIColor *newShadowColor = selected ? [UIColor blackColor] : [UIColor whiteColor];
[UIView animateWithDuration:0.2
                 animations:^{
                        /* change your label/shadow color here. */
                        self.textLabel.shadowColor = newShadowColor;
                 }
                 completion:^(BOOL finished){
                       /* this is where the cell is no longer selected
                          or highlighted. You may do some additional style changes to your
                          label here */ }];
于 2012-10-31T10:45:29.630 に答える