在这种情况下,我知道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");
}
}
}
但是,点击屏幕时,虽然在控制台中捕获了begin
和ended
,但它不会像上面的代码那样更改。
如果在case
和default
之间交换这些代码,请
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
可能会显示在控制台中,但点击时屏幕会变暗和变暗,永远不会恢复正常,颜色会很清晰。
我的代码出了什么问题?如何实现?
谢谢!
答案 0 :(得分:1)
[self performSelector:withObject:afterDelay:]将是通常的方式来完成这样的事情。
您设置的方法会分别解除暗视图,然后将其作为选择器引用
[self performSelector:@selector(methodWhichDismissesDarkView:) withObject:nil afterDelay:0.2]
在使视图变暗后立即调用此方法,0.2秒后它将会触发。
要真正做到这一点,请确保您可以优雅地处理延迟期间发生的中断:
[NSObject cancelPreviousPerformRequestsWithTarget:self];
当应用不再需要处理时,将取消待处理操作。
答案 1 :(得分: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")
未触发。
为什么我的原版不起作用?
这是更新的正确方法还是解决方法?