Using d3-zoom 1.1.1, a double-tap on iOS 10.1.1 yields this zoom event sequence:
start, end, start, zoom, ..., zoom, end, zoom, ..., zoom
The expected behavior is for the last event to be end:
start, end, start, zoom, ..., zoom, end
To repro, double-tap on the green cavas:
<html lang="en">
<head><style>p {margin: 0}</style></head>
<body>
<canvas style="background: green; width: 100%; height: 200px;"></canvas>
<div id="log"></div>
<script src="https://d3js.org/d3.v4.js"></script>
<script>
"use strict";
var zoom = d3.zoom();
var log = d3.select("#log");
zoom.on("start", function() { log.append("p").text("start"); });
zoom.on("zoom", function() { log.append("p").text("zoom"); });
zoom.on("end", function() { log.append("p").text("end"); });
d3.select("canvas").call(zoom);
</script>
</body>
</html>
Live repro here: https://jsfiddle.net/mtyzm1gc/
EDIT
Improved repro here: https://bl.ocks.org/cambecc/746946d403229182dda7ef0493efce99
Using d3-zoom 1.1.1, a double-tap on iOS 10.1.1 yields this zoom event sequence:
The expected behavior is for the last event to be
end:To repro, double-tap on the green cavas:
Live repro here: https://jsfiddle.net/mtyzm1gc/EDIT
Improved repro here: https://bl.ocks.org/cambecc/746946d403229182dda7ef0493efce99