如何禁用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
相关产品推荐
相关产品推荐

