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 ответа:
A
UIWebView
- это не одно представление, а набор представлений. При добавлении подвида в UIWebView новое подвидо добавляется в иерархию подвидов. Ваше новое подвидо, вероятно, добавляется за другими непрозрачными представлениями. Он там,но спрятан. Я бы рекомендовал добавить это представление индикатора к другому представлению в иерархии.
Значение по умолчанию
userInteractionEnabled
дляUIImageView
равноNO
. Возможно, Вам потребуется установить его вYES
.
Проблема решена:
К сожалению, это было вызвано чем-то совершенно другим, так что спасибо всем за помощь, которую вы оказали.
Проблема возникла из-за моей попытки исправить код для запуска с раскадровками. Я попытался получить доступ к контроллеру вида из раскадровки и добавить его в качестве представления для получения сенсорных событий в качестве приоритета (см. учебник, на который я ссылался, и мой комментарий, на который я также ответил). Где как я должен был использовать сам.окно.rootViewController.
Мой обновленный комментарий здесь