2010-12-02 14 views
36

私はUITableViewCellの内部にイメージを持つUIButtonを持っています。セルがハイライト表示されているとき、ボタンがボタンの境界内をクリックしているかどうかにかかわらず、ボタンはハイライト状態(すなわち、画像のより暗い色合い)にも入っている。UITableViewCellのUIButton

私はこの機能を望んでいません - ボタンがクリックされたときにボタンが強調表示され、セル全体がクリックされていない場合のみ表示されます。

ハイライトされた状態の画像を通常の画像と同じに設定しようとしました。これにより問題は解決されますが、実際に強調表示されたときにボタンの色が変わるのが止まります。

希望の効果を達成する方法はありますか?

答えて

57

これは狂気私を運転していました。私は別のアプローチを使用しましたsetHighlighted:animated:setSelected:animated:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    [super setHighlighted:highlighted animated:animated]; 
    self.yourButton.highlighted = NO; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    [super setSelected:selected animated:animated]; 
    self.yourButton.selected = NO; 
    // If you don't set highlighted to NO in this method, 
    // for some reason it'll be highlighed while the 
    // table cell selection animates out 
    self.yourButton.highlighted = NO; 
} 
+4

今日この問題に遭遇し、このアプローチを使用しました。私はこれらのメソッドの始めにshowsTouchWhenHighlightedをNOに設定し、最後にYESに戻ってこれを解決しました。 – aranasaurus

+0

@Zemm Excellent。私はこれを数回見ましたが、それを修正することはできませんでした – codecaffeine

+4

私のためには動作しません=( – Irina

0

は、実際にこれを試していないが、しかし、あなたは多分あなたは何を望むかにその強調表示状態の画像を更新することをUIControlEventTouchDownためのボタンにターゲット/アクションを追加することができ、UIControlEventTouchUpInside/UIControlEventTouchUpOutside/UIControlEventTouchCancelそのリセットのために、別のターゲット/アクション強調表示された画像は正常状態の画像と一致するか?

0

可能な回避策は、セル選択スタイルをnoneに設定することです。その場合、セルを選択すると強調表示されません。

これは可能な回避策です。あなたの心の中に他のものがあるかもしれません。

+1

これは何が起こる必要がありましたか。サブコントロールのハイライトと選択状態をNOに設定しても、selectionStyle状態がNone以外の場合は、何もしないように見えます。 – Gujamin

2

一つのアプローチは、テーブルビューのセルが選択されているときにボタンを「選択解除」または「ハイライトを消し」に次のようになります。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [yourButton setHighlighted:NO]; 
    // do something cool 
} 
+0

これは私の最初の考えでしたが、これはセルのハイライト(タッチダウンイベント)ではなく、セルの選択にのみ有効です – Yetanotherjosh

1

上書きする必要があることを考え出し、それは少し簡単です、私はそれがあなたのために働く願っています。ただ、ボタンの2つの上記のデリゲートメソッド内でfalseに状態を強調した設定:

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIButton *btnAction = (UIButton *) [[tableView cellForRowAtIndexPath:indexPath] viewWithTag:3]; 
    btnAction.highlighted = NO; 
} 


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIButton *btnAction = (UIButton *) [[tableView cellForRowAtIndexPath:indexPath] viewWithTag:3]; 
    btnAction.highlighted = NO; 
} 
0

それを動作させるために、私はUITableViewCellの上、以下のサブクラス化を使用する必要がありました。 'button'オブジェクトは、カスタムセル内のボタンです。

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    [self.button setShowsTouchWhenHighlighted:NO]; 
    [super setHighlighted:highlighted animated:animated]; 

    self.button.highlighted = NO; 
    [self.button setShowsTouchWhenHighlighted:YES]; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    [self.button setShowsTouchWhenHighlighted:NO]; 
    [super setSelected:selected animated:animated]; 
    self.button.highlighted = NO; 

    // Configure the view for the selected state 
    [self.button setShowsTouchWhenHighlighted:YES]; 
} 

さまざまな行を反転させると、ボタンのハイライトが表示されることがあります。

2

コーデファインの提案は私にとってはうまくいきませんでした(iOS 8.3)が、正しい軌道に乗せました。私はこれを変更しました(それはSwiftでもあります):

override func setHighlighted(highlighted: Bool, animated: Bool) { 
    var colorBefore = self.myButton.backgroundColor 
    super.setHighlighted(highlighted, animated: animated) 
    self.myButton.highlighted = false 
    self.myButton.backgroundColor = colorBefore 
} 
関連する問題