UIWebView addSubview: UIImageView не отображается при срабатывании сенсорных событий


Новый день, новый вопрос!

Я работал над приложением, которое требует, чтобы я показывал круг, где палец(ы) пользователя (ы) находится (находятся), когда они касаются экрана.

Я следовал учебнику , который я нашел на подклассах UIWindow, и Мой комментарий объясняет, как передать эти штрихи, если вы используете раскадровки и дугу.

Я использую следующий код (который основан на этом учебнике), чтобы сделать сенсорный индикатор для дисплей:

#pragma mark - Touch Events
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    NSArray *subviews = [self.webView subviews];
    for (UIView *view in subviews) 
    {
        // Check if view is scrollview
        if ([view isKindOfClass:[UserTouchImageView class]])
        {
            [view removeFromSuperview];
        }
    }

    // Enumerate over all the touches and draw a red dot on the screen where the touches were
    [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
        // Get a single touch and it's location
        UITouch *touch = obj;
        CGPoint touchPoint = [touch locationInView:self.webView]; 

        // Add touch indicator
        UserTouchImageView *touchView = [[UserTouchImageView alloc] initWithFrame:CGRectMake(touchPoint.x -15, touchPoint.y -15, 30, 30)];
        [self.webView addSubview:touchView];
    }];
    NSLog(@"Touches began");
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
    NSArray *subviews = [self.webView subviews];
    for (UIView *view in subviews) 
    {
        // Check if view is scrollview
        if ([view isKindOfClass:[UserTouchImageView class]])
        {
            [view removeFromSuperview];
        }
    }

    // Enumerate over all the touches and draw a red dot on the screen where the touches were
    [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
        // Get a single touch and it's location
        UITouch *touch = obj;
        CGPoint touchPoint = [touch locationInView:self.webView]; 

        // Draw a red circle where the touch occurred
        UserTouchImageView *touchView = [[UserTouchImageView alloc] initWithFrame:CGRectMake(touchPoint.x -15, touchPoint.y -15, 30, 30)];
        [self.webView addSubview:touchView];
    }];
    NSLog(@"Touches moved");
}
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
    NSArray *subviews = [self.webView subviews];
    for (UIView *view in subviews) 
    {
        // Check if view is scrollview
        if ([view isKindOfClass:[UserTouchImageView class]])
        {
            [UIView animateWithDuration:0.5f 
                             animations:^{
                                 view.alpha = 0.0;
                             }
                             completion:^(BOOL finished) {
                                 [view removeFromSuperview];
                             }];
        }
    }
    NSLog(@"Touches ended");
}
- (void) touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event {
    NSArray *subviews = [self.webView subviews];
    for (UIView *view in subviews) 
    {
        // Check if view is scrollview
        if ([view isKindOfClass:[UserTouchImageView class]])
        {
            [view removeFromSuperview];
        }
    }
    NSLog(@"Touches cancelled");
}

UserTouchImageView является подклассом UIImageView, с изменением на значение по умолчанию:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.image = [UIImage imageNamed:@"greyCircle.png"];
        self.alpha = 0.5f;
    }
    return self;
}
Я протестировал этот код без UIWebview (заменив self.webView на self.view), и он отлично работает, рисуя круг, в котором я нажимаю и перетаскиваю, а затем исчезает, когда я отпускаю кнопку.

Мне также удалось создать экземпляр UserTouchImageView и добавить его в webView из метода viewDidLoad viewController.

Как только я поставлю UIWebview в коде выше, та же строка ([self.webView addSubview:touchView];) не работает. Я все еще получаю сообщения NSLog на консоль, но подвиды не добавляются явно.

Может ли кто-нибудь помочь мне понять, почему это не появляется? Есть ли еще какой-нибудь код, о котором я должен знать, или причина, по которой я не могу этого сделать?

Большое спасибо!

EDIT

Я загрузил свой источник до сих пор здесь (MediaFire)

EDIT 2

Я добавил два методы, как показано ниже:

-(void)listWebViewSubViews
{
    NSLog(@"BEGIN LISTING SUBVIEWS");
    for (UIView *view in [self.webView subviews]) {
        NSLog(@"Subview: %@", view.description);
    }
    NSLog(@"END LISTING SUBVIEWS");
}
-(void)view:(UIView *)view addTouchIndicatorWithCentreAtPoint:(CGPoint)point
{
    NSLog(@"View: %@, x: %f, y: %f", view.description, point.x, point.y);

    // Add touch indicator
    UserTouchImageView *touchView = [[UserTouchImageView alloc] initWithFrame:CGRectMake(point.x -15, point.y -15, 30, 30)];

    [view addSubview:touchView];


}

Они вызываются из двух кнопок вне UIWebView и из метода touchesbegan:

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    NSArray *subviews = [self.webView subviews];
    for (UIView *view in subviews) 
    {
        if ([view isKindOfClass:[UserTouchImageView class]])
        {
            [view removeFromSuperview];
        }
    }

    [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
        UITouch *touch = obj;
        CGPoint touchPoint = [touch locationInView:self.webView]; 

        [self view:self.webView addTouchIndicatorWithCentreAtPoint:touchPoint];

        [self listWebViewSubViews];
    }];
    NSLog(@"Touches began");
}

Логирование, по-видимому, указывает на то, что веб-представление, на которое ссылается self.webView внутри метод touches began является полностью отдельным экземпляром, чем тот, на который ссылаются две кнопки. Я могу добавить несколько подвидов с помощью кнопки, а затем перечислить их, и все они появляются в журнале, но когда я нажимаю, чтобы коснуться симулятора, ни один из этих дополнительных подвидов не попадает в список.

Кто-нибудь знает о какой-либо специальной функции в UIWebView, чтобы иметь дубликат экземпляра на события касания?

3 2

3 ответа:

A UIWebView - это не одно представление, а набор представлений. При добавлении подвида в UIWebView новое подвидо добавляется в иерархию подвидов. Ваше новое подвидо, вероятно, добавляется за другими непрозрачными представлениями. Он там,но спрятан. Я бы рекомендовал добавить это представление индикатора к другому представлению в иерархии.

Значение по умолчанию userInteractionEnabled для UIImageView равно NO. Возможно, Вам потребуется установить его в YES.

Проблема решена:

К сожалению, это было вызвано чем-то совершенно другим, так что спасибо всем за помощь, которую вы оказали.

Проблема возникла из-за моей попытки исправить код для запуска с раскадровками. Я попытался получить доступ к контроллеру вида из раскадровки и добавить его в качестве представления для получения сенсорных событий в качестве приоритета (см. учебник, на который я ссылался, и мой комментарий, на который я также ответил). Где как я должен был использовать сам.окно.rootViewController.

Мой обновленный комментарий здесь