ios - UIImageView 在动画到 alpha 0 时如何被触摸?

标签 ios uigesturerecognizer alpha uiviewanimation touchesbegan

有人帮忙!

这是我要实现的:

  • 当 UIImageView 变为 alpha 0(隐藏)时
  • 可以触摸
  • 使其 alpha 变为 1(未隐藏)。

但 UIImageView 在动画时未被触及(= 成为 alpha 0)。

我在 stackoverflow 上尝试了一百种技巧,但没有奏效。

他们是......

  1. UIViewAnimationOptionAllowUserInteraction
  2. setUserInteractionEnabled:YES;
  3. touchesBegan
  4. 手势识别器选项
  5. 等..

只有函数“hitTest”有效,但在动画期间无效。

请回复。谢谢。 以下是我的代码。

#import "ViewController.h"
#define AD @"text.png"
#import <QuartzCore/QuartzCore.h>

@interface ViewController ()

@end

@implementation ViewController


@synthesize scrollData=_scrollData;
@synthesize adImage=_adImage;



   - (void)viewDidLoad
    {
        //_adImage is UIImageView
        _adImage=[[adImage alloc] initWithImage:[UIImage imageNamed:AD]];
_scrollData.scrollView.delegate = self;

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];

        [_adImage addGestureRecognizer:singleTap];
        [_adImage setMultipleTouchEnabled:YES];
        [_adImage setUserInteractionEnabled:YES];

        [self.view addSubview:_adImage];
        _adImage.alpha=0;
        [_adImage setUp_pt:CGPointMake(160,250)];
        _adImage.center=_adImage.up_pt;

        [super viewDidLoad];
        [self hideImage:_adImage delay:0];
        [self becomeFirstResponder];
    }


    - (void)hideImageComplete:(UIView*)v
    {
        [self hideImage:v delay:0];
    }

    - (void)hideImage:(UIImageView*)v delay:(int)nDelay
    {
        [_adImage becomeFirstResponder];

        [UIView animateWithDuration:1
                              delay:nDelay
                            options:
         (UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionAllowUserInteraction)
                         animations: ^
         {
                 _adImage.alpha=0.0f;
         }
                         completion:^(BOOL completed){
                             [self hideImageComplete:v];
                         }];
    }

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
    NSLog(@"Gesture event on view");
    _adImage.alpha=1;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    return YES;
}




- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"hit!!");
    [super touchesBegan:touches withEvent:event];
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];
    CGPoint touchLocation = [touch locationInView:self.view];
    _adImage.alpha=1;

}


@end



@implementation adImage
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
    if ([[[self layer] presentationLayer] hitTest:touchPoint]) {
        [self.layer removeAllAnimations];
    }
}
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    if ([[self.layer presentationLayer] hitTest:point]) {
        NSLog(@"hit!!");
        self.alpha=1;
        return self;
    }
    return [super hitTest:point withEvent:event];
}

@synthesize up_pt;


@end

这是我的 ViewController.h 代码。

#import <UIKit/UIKit.h>


@interface adImage : UIImageView {
}


//@property (strong, nonatomic) UIImageView *imageView;

@property (assign)CGPoint up_pt;


@end



@interface ViewController : UIViewController <UIScrollViewDelegate>{
}

- (void)hideImageComplete:(UIView*)v;
- (void)hideImage:(UIView*)v delay:(int)nDelay;

@property (strong, nonatomic) adImage *adImage;
@property(nonatomic, strong) IBOutlet UIWebView *scrollData;


@end

最佳答案

我有答案,但首先:

  • 始终以大写字母开头的类命名,即 AdImageView(它也是一个 ImageView ,而不是纯 View 子类)

  • 我拿了你的代码但注释掉了你可能需要也可能不需要的所有触摸方法

  • 这里的根本问题是,如果 alpha 为 0,UIGestureRecognizer 将无法工作,因此您会看到到 alpha=0 的动画分成两部分,几乎是 0,然后是 0。如果用户点击取消,然后最后的完成 block 将 View 返回到 0

代码:

- (void)hideImage:(UIImageView*)v delay:(int)nDelay
{
    //[_adImage becomeFirstResponder];

    [UIView animateWithDuration:(3.0f - 0.1f)
                          delay:nDelay
                        options: (UIViewAnimationOptionCurveEaseIn | 
                                  UIViewAnimationOptionAllowUserInteraction)
                     animations: ^
     {
             _adImage.alpha=0.1f;
     }
                     completion:^(BOOL completed)
                     {
                        NSLog(@"completed=%d", completed);
                        if(completed) {
                            [UIView animateWithDuration:0.1f animations:^{
                                _adImage.alpha=0.0f;
                            }];
                        } else {
                            _adImage.alpha=1;
                        }
                     }];
}

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
    NSLog(@"Gesture event on view");
    [_adImage.layer removeAllAnimations];
}

关于ios - UIImageView 在动画到 alpha 0 时如何被触摸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13098242/

相关文章:

ios - 调用prepareForSegue时不发送参数,导致崩溃

image-processing - ImageMagick - Alpha channel 提取,6.7 与 6.9 上的不同结果(较暗)

unity3d - (Unity) 将轮廓添加到 Alpha Cutout Shader

android - 确定 Google Play 环境(生产、测试​​版、阿尔法)

ios - 春萌要连动动画?

android - 在 iOS 和 Android 之间同步应用程序数据

ios - 根据图像固定imageview框架

objective-c - 何时将平移手势的结果保存到 NSUserDefaults

ios - 点击动画延迟手势

ios - UILongPressGestureRecognizer 仅在 Touch Up 时触发(快速)