0

タイトルの通り、画面をタップしようとすると、画面が少し暗く半透明になり、指が画面から離れると画面が元に戻ります。これは UIButton と同様です。

この場合、私UIButtonははるかに簡単だと知っていますが、これは単なるサンプルです

次のような私のコード:

- (IBAction)tapped:(UITapGestureRecognizer *)sender
{
    UIView * tintView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    [self.view addSubview:tintView];

    switch (sender.state) {
        case UIGestureRecognizerStateRecognized: {
        [tintView setBackgroundColor:[UIColor colorWithRed:.25 green:.25 blue:.25 alpha:.5]];
        NSLog(@"begin");
    }
    default: {
        [tintView setBackgroundColor:[UIColor clearColor]];
        NSLog(@"ended");
    }
    }
}

ただし、画面をタップすると、上記のコードのように変更されませんがbeginendedコンソールにキャプチャされます。

これらのコードをcasedefaultlikeの間で交換する場合

    switch (sender.state) {
        case UIGestureRecognizerStateRecognized: {
        [tintView setBackgroundColor:[UIColor clearColor]];
        NSLog(@"begin");
    }
    default: {
        [tintView setBackgroundColor:[UIColor colorWithRed:.25 green:.25 blue:.25 alpha:.5]];
        NSLog(@"ended");
    }
    }

beginコンソールに表示される可能性がありendedますが、タップすると画面が暗くなり、通常のクリアな色に戻ることはありません.

コードの何が問題になっていますか? それを実現する方法は?

ありがとう!

4

2 に答える 2

1

[self performSelector: withObject: afterDelay:] は、このようなことを達成するための通常の方法です。

暗くなったビューを個別に閉じるメソッドをセットアップし、それをセレクターとして参照します

[self performSelector:@selector(methodWhichDismissesDarkView:) withObject:nil afterDelay:0.2]

ビューを暗くした直後にこれを呼び出すと、0.2 秒後に起動します。

ただし、実際に正しく行うには、これを使用して、遅延中に発生する中断を適切に処理できることを確認してください。

[NSObject cancelPreviousPerformRequestsWithTarget:self];

アプリが処理する必要がなくなったときに、保留中のアクションをキャンセルします。

于 2013-10-22T14:12:19.980 に答える
0

@ryancumley のヒントに従って、以下は更新されたコードです。

@property (strong, nonatomic)  UIView * tintView;
@synthesize tintView;

- (IBAction)tapped:(UITapGestureRecognizer *)sender
{
        switch (sender.state) {
        case UIGestureRecognizerStateRecognized: {
            [self.tintView setBackgroundColor:[UIColor colorWithWhite:0.000 alpha:0.150]];
            [self performSelector:@selector(setTintView:) withObject:nil afterDelay:.25];
            NSLog(@"begin");
        }
        default: {
            break;
            NSLog(@"ended");
        }
    }
}

- (void)setTintView:(UIView *)tintView
{
    [self.tintView setBackgroundColor:[UIColor colorWithRed:.25 green:.25 blue:.25 alpha:0]];
}

最終的に機能し、ボタンをタップするように見えます。しかし、NSLog(@"ended")トリガーされません。

オリジナルが機能しないのはなぜですか?

これは更新された正しいアプローチまたは回避策ですか?

于 2013-10-22T14:48:02.083 に答える