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

如何禁用UIViewRepresentable中AAInfographics图表的滚动

解决AAChartView在SwiftUI中可滚动的问题

问题根源在于AAChartView底层基于WKWebView,其内部的UIScrollView默认开启了滚动,SwiftUI的scrollDisabled(true)无法直接禁用UIKit视图内部的滚动行为,需要从UIKit层面处理。

解决方案:禁用底层WKWebView的滚动

修改makeUIView方法,在创建并配置好AAChartView后,找到其内部的WKWebView,禁用其滚动视图的滚动功能:

import SwiftUI
import AAInfographics

struct PolarAreaChart: UIViewRepresentable {
    func updateUIView(_ uiView: AAChartView, context: Context) {
        
    }
        
    func makeUIView(context: Context) -> AAChartView {
        let aaChartView = AAChartView()
        
        let aaChartModel = AAChartModel()
            .chartType(.column)
            .polar(true)
            .animationType(.bounce)
            .yAxisLabelsEnabled(false)
            .xAxisLabelsEnabled(false)
            .tooltipEnabled(false)
            .legendEnabled(false)
            .dataLabelsEnabled(false)
            .categories(["a", "b", "c", "d", "e", "f"])
            .colorsTheme(["#403d39","#ffbe0b","#00b4d8","#e73265", "#90be6d", "#ada7c9"])
            .yAxisMax(100)
            .series([
                AASeriesElement()
                    .colorByPoint(true)
                    .data([22.0, 60.9, 38.0, 74.0, 92.0, 42.0]),
            ])
        
        aaChartView.aa_drawChartWithChartModel(aaChartModel)
        
        // 禁用底层WKWebView的滚动
        aaChartView.webView?.scrollView.isScrollEnabled = false
        
        // 如果上述代码无效(webView为私有属性),可以使用下方扩展方法
        // aaChartView.disableWebViewScroll()
        
        return aaChartView
    }
}

// 可选:扩展AAChartView添加便捷方法,用于递归查找并禁用WKWebView滚动
extension AAChartView {
    func disableWebViewScroll() {
        subviews.forEach { subview in
            if let webView = subview as? WKWebView {
                webView.scrollView.isScrollEnabled = false
            } else {
                // 递归查找深层子视图
                (subview as? AAChartView)?.disableWebViewScroll()
            }
        }
    }
}

补充说明

  • 如果aaChartView.webView无法直接访问(因版本或私有属性限制),可以调用扩展中的disableWebViewScroll()方法,通过遍历子视图找到WKWebView并禁用其滚动。
  • 该方法直接从UIKit层面禁用滚动容器的滚动能力,比SwiftUI的scrollDisabled(true)更有效——后者仅作用于SwiftUI原生的ScrollView组件,无法影响UIKit视图内部的滚动逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:20:34