You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chart.js缩放平移插件在WKWebView中无法正常工作的问题求助

Chart.js 缩放平移在WKWebView中失效,图表整体缩放而非坐标轴缩放

我给Chart.js图表添加了缩放平移功能,在Chrome和Safari浏览器中正常工作,但嵌入SwiftUI的WKWebView后,图表会像图片一样整体缩放,无法实现坐标轴的正确缩放。

相关代码

HTML代码

<!DOCTYPE html>
<html>
    <head>
        <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js" integrity="sha512-UXumZrZNiOwnTcZSHLOfcTs0aos2MzBWHXOHOuB0J/R44QB0dwY5JgfbvljXcklVf65Gc4El6RjZ+lnwd2az2g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/chartjs-plugin-zoom/1.2.1/chartjs-plugin-zoom.min.js" integrity="sha512-klQv6lz2YR+MecyFYMFRuU2eAl8IPRo6zHnsc9n142TJuJHS8CG0ix4Oq9na9ceeg1u5EkBfZsFcV3U7J51iew==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    </head>
    <body>
        <div id="container" style="position: relative; height:95vh; width:95vw">
            <canvas id="myCanvas"></canvas>
        </div>

        <script>
            //var incomingData = __@data__;
            var ctx = document.getElementById("myCanvas").getContext('2d');
            var gradient = ctx.createLinearGradient(0, 0, 0, 500);
            gradient.addColorStop(0, 'rgba(158,200,62,1)');   
            gradient.addColorStop(1, 'rgba(188,190,50,1)');

            var myChart = new Chart(ctx, {
                type: 'line',

                data: {
                    labels: ["5:30 PM","5:45 PM","6:00 PM","6:15 PM","6:30 PM","6:45 PM","7:00 PM","7:15 PM","7:30 PM","7:45 PM","8:00 PM","8:15 PM","8:30 PM","8:45 PM","9:00 PM","9:15 PM","9:30 PM","9:45 PM","10:00 PM","10:15 PM","10:30 PM","10:45 PM","11:00 PM","11:15 PM","11:30 PM","11:45 PM","12:00 AM","12:00 AM","12:15 AM","12:30 AM","12:45 AM","1:00 AM","1:15 AM","1:30 AM","1:45 AM","2:00 AM","2:15 AM","2:30 AM","2:45 AM","3:00 AM","3:15 AM","3:30 AM","3:45 AM","4:00 AM","4:15 AM","4:30 AM","4:45 AM","5:00 AM","5:15 AM","5:30 AM","5:45 AM","6:00 AM","6:15 AM","6:30 AM","6:45 AM","7:00 AM","7:15 AM","7:30 AM","7:45 AM","8:00 AM","8:15 AM","8:30 AM","8:45 AM","9:00 AM","9:15 AM","9:30 AM","9:45 AM","10:00 AM","10:15 AM","10:30 AM","10:45 AM","11:00 AM","11:15 AM","11:30 AM","11:45 AM","12:00 PM","12:15 PM","12:30 PM","12:45 PM","1:00 PM","1:15 PM","1:30 PM","1:45 PM","2:00 PM","2:15 PM","2:30 PM","2:45 PM","3:00 PM","3:15 PM","3:30 PM","3:45 PM","4:00 PM","4:15 PM","4:30 PM","4:45 PM","5:00 PM"],
                    datasets: [{
                        backgroundColor : gradient, // Put the gradient here as a fill color
                        label: 'Temp',
                        data: [21.62,21.54,21.66,21.39,23,22.31,21.18,21.12,28.18,22.1633333333333333,20.66,20.18,19.7266666666666667,19.35,32.04,30.9533333333333333,33.18,31.9733333333333333,43.035,32.6225,31.7033333333333333,48.32,33.58,33.64,22.37,20.9,20.56,20.56,20.43,20.39,20.25,20,19.87,19.68,19.62,19.5,19.355,19.18,19.06,19,18.87,18.79,18.68,18.68,18.62,18.56,18.5,18.385,18.25,18.12,18,17.91,17.81,17.75,17.62,17.5,17.5,17.5,17.5,18.43,18.68,18.85,19.12,19.25,19.31,19.37,19.43,NaN,NaN,NaN,NaN,19.6,19.68,19.81,19.87,19.9533333333333333,20,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,NaN,NaN,NaN,NaN,NaN,NaN,NaN,22.18,22.37,22.31],
                        borderColor: '#9ec83e',
                        borderWidth: '1',
                        fill: true,
                     }]
                },

                options: {
                    plugins: {
                        legend:{
                         display: false,
                        },
                        zoom: {
                            limits: {
                                x: {min: 0, max: 400, minRange: 50},
                                y: {min: 0, max: 200, minRange: 50}
                            },            
                            pan: {
                                enabled: true,
                                mode: 'xy',
                            },
                            zoom: {
                                wheel: {
                                    enabled: true,
                                },
                                pinch: {
                                    enabled: true
                                },
                                mode: 'xy',
                            }
                        }
                    },

                    maintainAspectRatio: false,

                    animation: {
                        duration: 0, // general animation time
                    },
                    elements: {
                        point: {
                            radius: 0
                        }
                    },
                    scales: {
                        x: {
                            grid: {
                                display:false
                            }
                        },
                        y: {
                            grid: {
                                display:false
                            },
                            ticks: {
                                autoSkip: true,
                                maxTicksLimit: 4
                            }
                        }
                    },
                }
            });

            Chart.register(zoomPlugin);
        </script>
    </body>
</html>

我尝试过的Swift代码

wkWebview.scrollView.delegate = self

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return nil
}

解决方法

1. 彻底禁用WKWebView原生缩放

仅设置viewForZooming(in:)返回nil不足以阻止原生缩放,需要锁定scrollView的缩放范围:

wkWebview.scrollView.delegate = self
wkWebview.scrollView.minimumZoomScale = 1.0
wkWebview.scrollView.maximumZoomScale = 1.0
wkWebview.scrollView.bouncesZoom = false

2. 在HTML中添加禁用缩放的meta标签

在HTML的<head>内加入以下标签,确保WKWebView不会拦截缩放手势,让Chart.js插件能正常捕获事件:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

3. 调整Chart.js插件注册时机

将Chart.register(zoomPlugin)移到图表实例创建之前,保证插件在图表初始化前完成注册:

Chart.register(zoomPlugin);

var myChart = new Chart(ctx, {
  // 图表配置内容
});

内容的提问来源于stack exchange,提问作者Schwarz Software

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:15:40