Почему мой метод обработчика распознавания жестов не запускается? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь распознать мой код, когда нажимаю кнопку воспроизведения / паузы или касание трекпада пульта Apple TV во время воспроизведения рекламы, но я вижу странное поведение.

По какой-то причине мне нужно перетащить вниз с верхней части трекпада вниз, чтобы перенести информационную панель на мой Apple TV, и ТОЛЬКО тогда я смогу заставить кнопку воспроизведения / паузы фактически воспроизводить / приостанавливать объявление, которое сейчас воспроизводится. Похоже, что это какая-то проблема с первым респондентом.

Даже в приведенном выше случае метод, который я настроил для запуска при распознавании касания, фактически никогда не выполняется. Кажется, что операционная система обрабатывает события паузы / воспроизведения самостоятельно (чего я не хочу)

#import "BMIMAAdsViewController.h"
#import "UIImage+BMAdditions.h"

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdocumentation"
#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>
#pragma clang diagnostic pop


/** The ad play image view size **/
static CGFloat kAdPlayImageViewSize = 100.0;

/** The ad play image view image name **/
static NSString *const kAdPlayImageViewImageName = @"BMVidiPlayerResources.bundle/BMResources/Images/ad_play";

static NSTimeInterval kAdPlayImageViewAnimationDuration = 0.2;

/** The ad play image view animation delay **/
static NSTimeInterval kAdPlayImageViewAnimationDelay = 0.0;

/** The ad play image view animation damping **/
static CGFloat kAdPlayImageViewAnimationDamping = 1.0;

/** The ad play image view animation velocity **/
static CGFloat kAdPlayImageViewAnimationVelocity = 1.0;


@interface BMIMAAdsViewController() <UIGestureRecognizerDelegate>
@property (nonatomic, strong) UIImageView *adPlayImageView;
@property (nonatomic, weak) UITapGestureRecognizer *tapRecognizer;
@end

@implementation BMIMAAdsViewController

#if TARGET_OS_IOS
- (BOOL)prefersStatusBarHidden
{
    // we always want to hide the status bar for IMA Ads as the IMA UI collides with the
    // status bar.
    return YES;
}
#endif


- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"********* VIEWDIDLOAD -> ABOUT TO ADD A TAP RECOGNIZER");
    [self addTapRecognizer];
    [self addPlayImageView];
}


#pragma mark - -- Gestures --

- (void)addTapRecognizer
{
#if TARGET_OS_IOS
    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pauseAdFromTap:)];
    tapRecognizer.numberOfTapsRequired = 1;
    tapRecognizer.numberOfTouchesRequired = 1;
    tapRecognizer.delegate = self;
    [self.view addGestureRecognizer:tapRecognizer];
#else
    NSLog(@"********* ADDING TAP RECOGNIZER");
    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pauseAdFromTapOnAppleTV:)];
    tapRecognizer.numberOfTapsRequired = 1;
    tapRecognizer.allowedPressTypes = @[[NSNumber numberWithInteger:UIPressTypeSelect], [NSNumber numberWithInteger:UIPressTypePlayPause]];
    [self.view.window addGestureRecognizer:tapRecognizer];
#endif
    self.tapRecognizer = tapRecognizer;
}


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


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (self.tapRecognizer != gestureRecognizer)
    {
        return YES;
    }
    // ignore touch from the "Learn More" title (height is approximate)
    const CGFloat learnMoreTitleHeight = 35;
    return [touch locationInView:self.view].y < learnMoreTitleHeight ? NO : YES;
}


- (void)showAdPlayImageViewAnimated
{

    [self.view bringSubviewToFront:self.adPlayImageView];

    self.adPlayImageView.hidden = NO;

    [UIView animateWithDuration:kAdPlayImageViewAnimationDuration
                          delay:kAdPlayImageViewAnimationDelay
         usingSpringWithDamping:kAdPlayImageViewAnimationDamping
          initialSpringVelocity:kAdPlayImageViewAnimationVelocity
                        options:UIViewAnimationOptionCurveEaseIn animations:^{
                            // animations
                            self.adPlayImageView.alpha = 1.0;
                        } completion:^(BOOL finished) {
                            // empty completion
                        }];
}


- (void)hideAdPlayImageView:(BOOL)animated
{
    if (!animated)
    {
        self.adPlayImageView.alpha = 0.0;
        self.adPlayImageView.hidden = YES;
        return;
    }

    [UIView animateWithDuration:kAdPlayImageViewAnimationDuration
                          delay:kAdPlayImageViewAnimationDelay
         usingSpringWithDamping:kAdPlayImageViewAnimationDamping
          initialSpringVelocity:kAdPlayImageViewAnimationVelocity
                        options:UIViewAnimationOptionCurveEaseIn animations:^{
                            // animations
                            self.adPlayImageView.alpha = 0.0;
                        } completion:^(BOOL finished) {
                            self.adPlayImageView.hidden = YES;
                        }];
}


- (void)addPlayImageView
{
    self.adPlayImageView = [[UIImageView alloc] init];
    self.adPlayImageView.backgroundColor = [UIColor clearColor];
    self.adPlayImageView.alpha = 0.0;
    self.adPlayImageView.hidden = YES;
    self.adPlayImageView.userInteractionEnabled = YES;
    self.adPlayImageView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:self.adPlayImageView];
    // set constraints on the view
    UILayoutGuide *margin = self.view.layoutMarginsGuide;
    [self.adPlayImageView.widthAnchor constraintEqualToConstant:kAdPlayImageViewSize].active = YES;
    [self.adPlayImageView.heightAnchor constraintEqualToConstant:kAdPlayImageViewSize].active = YES;
    [self.adPlayImageView.centerXAnchor constraintEqualToAnchor:margin.centerXAnchor].active = YES;
    [self.adPlayImageView.centerYAnchor constraintEqualToAnchor:margin.centerYAnchor].active = YES;
    // set image now
    UIImage *img = [UIImage bm_imageWithBundlePath:kAdPlayImageViewImageName];
    self.adPlayImageView.image = img;
    // add tap gesture
    UITapGestureRecognizer *singleTap =  [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(adResumeFromTap:)];
    [singleTap setNumberOfTapsRequired:1];
    [self.adPlayImageView addGestureRecognizer:singleTap];
}


- (void)pauseAdFromTap:(UITapGestureRecognizer *)recognizer
{
    [self showHidePlayButton:YES];
    [self.adsManager pause];
}

- (void)pauseAdFromTapOnAppleTV:(UITapGestureRecognizer *)recognizer
{
    NSLog(@"********* IN PAUSE AD FROM TAP");
    [self showHidePlayButton:YES];
    [self.adsManager pause];
}


- (void)adResumeFromTap:(UIGestureRecognizer *)recognizer
{
    NSLog(@"********* IN RESUME AD FROM TAP");
    [self showHidePlayButton:NO];
    [self.adsManager resume];
}

- (void)showHidePlayButton:(BOOL)show
{
    NSLog(@"********* IN SHOWHIDEPLAYBUTTON...");
    if (show)
    {
        NSLog(@"********* ABOUT TO SHOW AD PLAY IMAGEVIEW...");
        [self showAdPlayImageViewAnimated];
    }
    else
    {
        NSLog(@"********* ABOUT TO HIDE AD PLAY IMAGEVIEW...");
        [self hideAdPlayImageView:YES];
    }
}

@end

Итак, у меня есть 2 проблемы, которые мне нужно исправить: 1) Что мне делать нужно изменить, чтобы получить нажатие на трекпад или нажать кнопку воспроизведения / паузы, чтобы правильно вызвать соответствующий метод селектора (pauseAdFromTapOnAppleTV)? 2) Существует метод с именем showAdPlayImageViewAnimated, который показывает изображение «показ рекламы», когда пользователь пытается приостановить показ рекламы. Я пытаюсь вызвать этот метод из pauseAdFromTapOnAppleTV, но pauseAdFromTapOnAppleTV фактически никогда не выполняется

Я пытался найти что-то с помощью addTapRecognizer, но что-то не так.

Пожалуйста, посоветуйте?

...