2011-01-07 21 views
4

私が構築しているアプリには、きわめて正確にレイアウトされた画像の上にカスタムUIButtonが配置されています。 Buttonish、画像とラベル、そして何を持っているのですか?しかし、あなたの上にはっきりとしたカスタムスタイルのUIButtonがあり、タップを扱うことができます。カスタムUIButtonをハイライト表示

クライアントは昨日、「タップしたときに強調表示したい」と言っています。それはすぐに新しいuinavigationcontrollerのビューをプッシュすることを心配しないでください...それは点滅しなかったので、彼は混乱しています。オイ。

ここで私はそれに取り組んできました。私はそれが好きではありませんが、それは私がやったことです:

私はUIButton(FlashingUIButtonという名前)をサブクラス化しました。

何らかの理由で、コントロールモードでバックグラウンド画像を強調表示するだけでは、設定できませんでした。状態が「強調表示」されることはありませんでした。それがなぜであるかわからない。

だから代わりに私が書いた:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self setBackgroundImage:[UIImage imageNamed:@"grey_screen"] forState:UIControlStateNormal]; 
    [self performSelector:@selector(resetImage) withObject:nil afterDelay:0.2]; 
    [super touchesBegan:touches withEvent:event]; 
} 

-(void)resetImage 
{ 
    [self setBackgroundImage:nil forState:UIControlStateNormal]; 
} 

これを喜んでそれがタップいたときにボタンの上に私のgrey_screen.png(30%不透明なブラックボックス)を産むと、2回目以降の幸せな空要素を基底として0.2に置き換えます。

これは問題ありませんが、これはすべての多くのニブを通過し、すべてのボタンをUIButtonsからFlashingUIButtonsに変更する必要があることを意味します。これは世界の終わりではありませんが、私はUIButtonのカテゴリーとしてこの問題に取り組むことを本当に望んでおり、全ての鳥に一つの石を打ちました。

これよりも優れたアプローチの提案はありますか?

答えて

4

あなたはジェスチャー認識でタッチイベントをインターセプトして、プログラムですべてのあなたのuibuttonsに認識機能を追加することができます。例えば:

// 
// HighlighterGestureRecognizer.h 
// Copyright 2011 PathwaySP. All rights reserved. 
// 

#import <Foundation/Foundation.h> 


@interface HighlightGestureRecognizer : UIGestureRecognizer { 
    id *beganButton; 
} 

@property(nonatomic, assign) id *beganButton; 

@end 

と実装:

// 
// HighlightGestureRecognizer.m 
// Copyright 2011 PathwaySP. All rights reserved. 
// 

#import "HighlightGestureRecognizer.h" 


@implementation HighlightGestureRecognizer 

@synthesize beganButton; 

-(id) init{ 
    if (self = [super init]) 
    { 
     self.cancelsTouchesInView = NO; 
    } 
    return self; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    self.beganButton = [[[event allTouches] anyObject] view]; 
    if ([beganButton isKindOfClass: [UIButton class]]) { 
     [beganButton setBackgroundImage:[UIImage imageNamed:@"grey_screen"] forState:UIControlStateNormal]; 
     [self performSelector:@selector(resetImage) withObject:nil afterDelay:0.2]; 

    } 
} 

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

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

} 

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

- (void)reset 
{ 
} 

- (void)ignoreTouch:(UITouch *)touch forEvent:(UIEvent *)event 
{ 
} 

- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)preventingGestureRecognizer 
{ 
    return NO; 
} 

- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer 
{ 
    return NO; 
} 

- (void)resetImage 
{ 
    [beganButton setBackgroundImage: nil forState:UIControlStateNormal]; 
} 

@end 

うーん。私はこのコードをテストしなかったので、うまくいかなければ、私を訴えてはいけません。ただコメントしてください。私はちょうど参考のためにそれを本当に速く書きました。それがうまくいかなくても、ロジックはまだ健全なはずです。

編集:

がそうのようになる、あなたはボタンにジェスチャー認識を追加したい方法を追加するのを忘れ:だから、基本的に

HighlighterGestureRecognizer * tapHighlighter = [[HighlighterGestureRecognizer alloc] init]; 

[myButton addGestureRecognizer:tapHighlighter]; 
[tapHighlighter release]; 

あなたはそれを初期化し、それを宣言していると、それを追加します。その後、addGestureRecognizerがそれを保持するので、あなたはそれを解放したいでしょう。

+0

。それをしなければうまくいくかどうか分からない。別の方法としては、あなたはそれが、少なくとも常にUIViewのだろう知っているので、代わりにIDのUIViewのとしてそれを宣言するだろう。いずれにせよ、あなたはそれで遊ぶことができます。 – Omar

2

ボタンにadjustsImageWhenHighlighted = YESが設定されていますか?デフォルトはYESですが、おそらくxibで変更しました。これは、属性インスペクタで、「強調表示イメージを調整します」チェックボックスです:

IB Highlight Button

0

私はUIButton(Swift 2)をサブクラス化した後も同じ問題がありました。 "drawRect"関数は、ユーザがUButtonに触れたときに呼び出されません(ストーリーボードでチェックマーク "強調表示調整画像"がチェックされていても)。これは、カスタムUIButtonであるという事実に起因する可能性があります。

とにかく、「touchesBegan」と「touchesEnded」イベントをオーバーライドすることで、取り扱いが簡単です。以上が(無効のような)ボタンのすべての状態を処理するために行うことができます。しかしここにコードがあります。

スウィフト2:

import Foundation 
import UIKit 

@IBDesignable 

class ppButton: UIButton { 
    override func drawRect(rect: CGRect) { 
     if self.state != UIControlState.Highlighted { 
      //SKit is another class containing a function to draw the custom button 
      SKit.drawPpButton(0, width: rect.width-2, height: rect.height-2) 
     } else { 
      //SKit is another class containing a function to draw the custom button 
      SKit.drawPpButton(0, width: rect.width-20, height: rect.height-20) 
     } 
    } 
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     super.touchesBegan(touches, withEvent: event) 
     self.setNeedsDisplay() 
    } 
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     super.touchesEnded(touches, withEvent: event) 
     self.setNeedsDisplay() 
    } 
} 
あなたはそれを実装して、私はIDとしてそれを宣言しただけであるため、setBackgroundImageのような方法、だ使用する前にbeganButton前(UIButton *)を配置する必要がある場合があります
関連する問題