热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决UIScrollView上Webview点击图片后无法立即滑动的问题

本文探讨了在UIScrollView上嵌入Webview时遇到的一个常见问题:点击图片放大并返回后,Webview无法立即滑动。我们将分析问题原因,并提供有效的解决方案。

1: 问题描述:在类似网易新闻的详情页设计中,当在一个UIScrollView上嵌套Webview,并且Webview内包含图片和文本时,用户点击图片放大查看,然后点击返回按钮回到新闻详情页时,发现无法立即滑动整个页面。

2: 代码示例:

// 在此方法中处理Webview的触控事件,以响应长按操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestString = [[request URL] absoluteString];
NSArray *compOnents= [requestString componentsSeparatedByString:@":"];
if ([components count] > 1 && [[components objectAtIndex:0] isEqualToString:@"myweb"]) {
if ([[components objectAtIndex:1] isEqualToString:@"touch"]) {
[_timer invalidate];
_timer = nil;
_gesState = GESTURE_STATE_END;
if ([[components objectAtIndex:2] isEqualToString:@"start"]) {
_gesState = GESTURE_STATE_START;
float ptX = [[components objectAtIndex:3] floatValue];
float ptY = [[components objectAtIndex:4] floatValue];
NSString *js = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).tagName", ptX, ptY];
NSString *tagName = [webView stringByEvaluatingJavascriptFromString:js];
if ([tagName isEqualToString:@"IMG"]) {
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(handleLongTouch) userInfo:nil repeats:NO];
_fangdaTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(fangdaClick) userInfo:nil repeats:NO];
}
} else if ([[components objectAtIndex:2] isEqualToString:@"move"]) {
_gesState = GESTURE_STATE_MOVE;
} else if ([[components objectAtIndex:2] isEqualToString:@"end"]) {
_gesState = GESTURE_STATE_MOVE;
}
} else if ([[components objectAtIndex:2] isEqualToString:@"end"]) {
[_timer invalidate];
_timer = nil;
_gesState = GESTURE_STATE_END;
}
return NO;
}
return YES;
}

// 当Webview加载完成后调用的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
- (void)webViewDidFinishLoad:(UIWebView *)webView {
if (self.nightMode) {
[webView stringByEvaluatingJavascriptFromString:@"document.getElementsByTagName('body')[0].style.color = '#000'"];
} else {
[webView stringByEvaluatingJavascriptFromString:@"document.getElementsByTagName('body')[0].style.color = '#6d6d6d'"];
}
[webView stringByEvaluatingJavascriptFromString:@"document.getElementsByTagName('body')[0].style.webkitOverflowScrolling = 'touch'"];
// 设置Webview的尺寸
CGRect frame = webView.frame;
frame.size.height = webView.scrollView.contentSize.height;
webView.frame = frame;
// 处理其他UI元素的位置调整
// ...
// 响应触摸事件
[webView stringByEvaluatingJavascriptFromString:kTouchJavascriptString];
}

问题分析:当用户从图片查看器返回到详情页时,`shouldStartLoadWithRequest:` 方法会被调用两次,这导致了触控事件的响应延迟。为了解决这个问题,可以在返回时手动重置或重新初始化相关的计时器和状态变量,确保触控事件能够及时响应。


推荐阅读
  • 交互式左右滑动导航菜单设计
    本文介绍了一种使用HTML和JavaScript实现的左右可点击滑动导航菜单的方法,适用于需要展示多个链接或项目的网页布局。 ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 目录介绍01.CoordinatorLayout滑动抖动问题描述02.滑动抖动问题分析03.自定义AppBarLayout.Behavior说明04.CoordinatorLayo ... [详细]
  • 深入探讨jQuery中的事件处理、动画效果及表单操作
    本文详细介绍了jQuery这一流行的JavaScript库在事件处理、动画效果实现以及表单操作方面的应用。通过具体的示例和代码片段,帮助开发者更好地理解和运用jQuery的强大功能。 ... [详细]
  • 本文详细介绍了JSP(Java Server Pages)的九大内置对象及其功能,探讨了JSP与Servlet之间的关系及差异,并提供了实际编码示例。此外,还讨论了网页开发中常见的编码转换问题以及JSP的两种页面跳转方式。 ... [详细]
  • 本文介绍了如何利用Java中的URLConnection类来实现基本的网络爬虫功能,包括向目标网站发送请求、接收HTML响应、解析HTML以提取所需信息,并处理可能存在的递归爬取需求。 ... [详细]
  • 本文介绍了如何通过ARM编译器组件重定向标准C运行时库的I/O函数,以适应不同的硬件平台。原文链接:https://www.keil.com/pack/doc/compiler/RetargetIO/html/retarget_overview.html ... [详细]
  • 本文提供了在 Kali Linux 2020.01 x64 版本上安装 Docker 的详细步骤,包括环境准备、使用清华大学镜像源、配置 APT 仓库以及安装过程中的常见问题处理。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 本文探讨了如何利用System.Diagnostics.Trace作为.NET库中的通用日志记录方法,同时考虑了其在性能关键代码中的影响。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 欢迎学习交流!!!持续更新中…文章目录页面生成过程渲染重排与重绘的比较重排(reflow)常见引起重排的属性和方法重排影响的范围尽可能减少 ... [详细]
author-avatar
遇遇yuyu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有