在我的移动程序的 UI 中,我有一个位于
SignaturePadView
内的 UIScrollView
(继承自 UIView 的第三方组件)。每当我尝试调试程序时,只要我将手指放入 SignaturePadView
并开始签名,它所在的 ScrollView 就会捕获输入并滚动,不允许我创建签名。当用户触摸 UIScrollView
内部时,是否可以禁用 SignaturePadView
的滚动功能。
我尝试过的两件事没有成功:
ExclusiveTouch
上将 SignaturePadView
设置为 true。对于这一点,ScrollView 似乎在检查 ExclusiveTouch
之前捕获输入。UIScrollView
并覆盖 TouchesShouldBegin
以关闭滚动。这使我能够检查 inContentView
参数,看看它是否属于 SignaturePadView
类型。这有两个问题:首先,SignaturePadView
内有子视图被返回到inContentView
而不是SignaturePadView
。其次,TouchesEnd
并不总是触发,允许我在用户完成签名后重新打开滚动。此时,我正在寻求任何可以获得的帮助。我是 Xamarin 和 iOS 开发的新手,最后一件事阻碍了我完成我的项目。
我在浏览了一些 Objective-C 代码后发现了这一点。我必须对
ScrollView
进行子类化并覆盖 HitTest
。对于将来遇到此问题的任何人,这是我使用的代码。
自定义滚动视图:
public class CustomScrollView : UIScrollView
{
public IList<CGRect> DeadAreas { get; } = new List<CGRect>();
public override UIView HitTest(CGPoint point, UIEvent uievent)
{
ScrollEnabled = DeadAreas.Any(x => x.Contains(point)) ? false : true;
return base.HitTest(point, uievent);
}
}
在我的视图控制器中:
_formView.DeadAreas.Add(signaturePadViewer.Frame);
就像魅力一样。原来我最初的错误是覆盖 Touch 方法而不是
HitTest
方法。
只是想进来更新这个帖子。罗伯特仍然有正确的方法来解决这个问题,我将帮助大家发布从 C -> Swift 转换后的代码。
享受快乐的狩猎!
class CustomScrollView: UIScrollView {
var deadAreas: [CGRect] = []
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if deadAreas.contains(where: { $0.contains(point) }) {
isScrollEnabled = false
} else {
isScrollEnabled = true
}
return super.hitTest(point, with: event)
}
}