0

UIButton へのイベントをトリガーする必要がある非常に複雑なロジックがあります。

if (CGRectContainsPoint(self.startButton.frame, point))
{
    [self buttonDidClicked:self.startButton];
}

どのコントロール イベントにもリンクされておらず、不要です。問題は、関数が呼び出されたときにハイライト アニメーションがないことです。クリックするとUIButtonに短い黒いマスクが適用される通常のアニメーションについて話しています。

次に、ボタンを UIEventTouchDown コントロールイベントにリンクして、次の方法で呼び出しをトリガーしようとしました。

if (CGRectContainsPoint(self.startButton.frame, point))
{
    [self.nextButton setHighlighted:YES];
    [self.backButton sendActionsForControlEvents:UIControlEventTouchDown];
}

実際のタッチ イベントをシミュレートします。ボタンに黒いレイヤーを作成しますが、自動的には消えません。

それを行う最良の方法は何ですか?ボタンが起動されたときにフィードバックを取得したい。デフォルトのアニメーションで十分です。

4

2 に答える 2

1

次のような方法でレイヤーまたはグラデーション レイヤーを使用できます。

- (void) viewDidLoad
{
        [super viewDidLoad];

        CAGradientLayer *gradient = [CAGradientLayer layer];
        loginButton.clipsToBounds = YES;
        UIColor *topColor = [UIColor colorWithRed:255/255 green:255/255 blue:255/255 alpha:0.9];
        UIColor *middleColor = [UIColor colorWithRed:61.0/255 green:130.0/255 blue:244.0/255 alpha:1.0];
        UIColor *bottomColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor,
                           (id)middleColor.CGColor, (id)bottomColor.CGColor, nil];
        gradient.locations = [NSArray arrayWithObjects:
                              [NSNumber numberWithFloat:0.0f],
                              [NSNumber numberWithFloat:0.05f],
                              [NSNumber numberWithFloat:0.7],
                              nil];
        gradient.frame = [[loginButton layer] bounds];
        gradient.cornerRadius = 4.0;
        gradient.borderWidth = 0.5;
        [loginButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [loginButton.layer insertSublayer:gradient atIndex:0]; 
        [loginButton addTarget:self action:@selector(loginTouchDown:)
                forControlEvents:UIControlEventTouchDown];
        [loginButton addTarget:self action:@selector(loginTouchUp:)
              forControlEvents:UIControlEventTouchUpOutside];
}

- (IBAction)loginTouchDown:(id)sender
{
        CAGradientLayer *gradient = [loginButton.layer.sublayers objectAtIndex:0];
        UIColor *topColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        UIColor *middleColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        UIColor *bottomColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor, (id)middleColor.CGColor,
                           (id)bottomColor.CGColor, nil];
}

- (IBAction)loginTouchUp:(id)sender
{
        CAGradientLayer *gradient = [loginButton.layer.sublayers objectAtIndex:0];
        UIColor *topColor = [UIColor colorWithRed:255/255 green:255/255 blue:255/255 alpha:0.9];
        UIColor *middleColor = [UIColor colorWithRed:61.0/255 green:130.0/255 blue:244.0/255 alpha:1.0];
        UIColor *bottomColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor,
                           (id)middleColor.CGColor, (id)bottomColor.CGColor, nil];
}

- (IBAction)loginButton:(id)sender
{
        [self loginTouchUp:sender];
        [self doLogin];
}

ログイン ボタンはストーリー ボードで定義され、ローカル ビュー プロパティに割り当てられます。

(*.h ファイル内)

@interface LoginViewController : UIViewController <UITextFieldDelegate>

@property (nonatomic, retain) IBOutlet UIButton *loginButton;
@end

(*.m ファイル内)

@synthesize loginButton;

viewdidload では、通常の状態とプッシュされた状態のグラデーション レイヤーを定義します。次に、up/down イベントでそれらを操作します。アクションを実行するには、ボタン ハンドラとして loginButton() も必要です。このように、このボタンの動作は理想的には通常のボタンと同じです。これだそうです。

それがどのように機能するかの例は、iPhone アプリストアで見つけることができます。Torchooという無料アプリがあります。実行すると、最初に表示されるのはログイン画面です。ログインボタンがあります。これが必要かどうかを確認するには、それを押してください。このコードはそのプロジェクトのものです。

于 2013-01-11T12:40:55.987 に答える
0

行く方法は、-buttonDidClickedアクションを UIButton UIControlEventTouchUpInside イベントにバインドすることです。

[self.startButton addTarget:self action:@selector(buttonDidClicked:) forControlEvents:UIControlEventTouchUpInside];

CGRectContainsPoint()メカニズムを使用する必要がある場合は、self.startButton.highlightedオプションを呼び出し前に YES に設定し-buttonDidClicked、呼び出し後に NO に設定する必要があります。

于 2013-01-11T12:38:17.537 に答える