我在iOS中有一个自定义绘图视图。这是在Xamarin,但我不认为这是相关的。
我得到一个触摸开始事件,几个移动事件,然后触摸被取消。特别是,如果我的手指移动一点远离原来的触点。如果我停留在几毫米内的原始触点,它不会被取消。
代码在iOS 10中工作,但现在已经停止工作了。我怀疑这是由于iOS 11中的一些新特性造成的,但我无法理解。
视图不是在任何类型的ScrollView中,只是普通的UIViewController。
有没有人知道在iOS 11中有什么SDK改变了我的绘图视图?
[Register("SignatureDrawView")]
public class SignatureDrawView : UIView
{
private UIImageView drawImage;
private List<CGPoint> currentLine;
public SignatureDrawView()
{
InitializeDrawImage();
}
public SignatureDrawView(NSCoder coder) : base(coder)
{
InitializeDrawImage();
}
public SignatureDrawView(NSObjectFlag t) : base(t)
{
InitializeDrawImage();
}
public SignatureDrawView(IntPtr handle) : base(handle)
{
InitializeDrawImage();
}
public SignatureDrawView(CGRect frame) : base(frame)
{
InitializeDrawImage();
}
private void InitializeDrawImage()
{
Layer.BorderColor = UIColor.Black.CGColor;
Layer.BorderWidth = 0.5f;
drawImage = new UIImageView
{
BackgroundColor = UIColor.Red,
Image = new UIImage()
};
AddSubview(drawImage);
}
public override void LayoutSubviews()
{
base.LayoutSubviews();
drawImage.Frame = new CGRect(0, 0, Frame.Size.Width, Frame.Size.Height);
}
public override void TouchesBegan(NSSet touches, UIEvent evt)
{
UITouch touch = (UITouch)touches.AnyObject;
CGPoint point = touch.LocationInView(this);
currentLine = new List<CGPoint>();
currentLine.Add(point);
SetNeedsDisplay();
}
public override void TouchesMoved(NSSet touches, UIEvent evt)
{
UITouch touch = (UITouch)touches.AnyObject;
CGPoint point = touch.LocationInView(this);
currentLine.Add(point);
SetNeedsDisplay();
}
public override void TouchesCancelled(NSSet touches, UIEvent evt)
{
SetNeedsDisplay();
}
public override void Draw(CGRect rect)
{
UIGraphics.BeginImageContext(drawImage.Frame.Size);
drawImage.Image.DrawAsPatternInRect(new CGRect(0, 0, drawImage.Frame.Size.Width, drawImage.Frame.Size.Height));
UIColor.Black.SetColor();
if (currentLine != null && currentLine.Count > 3)
{
UIBezierPath path = new UIBezierPath();
path.LineWidth = 1f;
for (int i = 3; i < currentLine.Count; i++)
{
CGPoint p0 = currentLine[i - 3];
CGPoint p1 = currentLine[i - 2];
CGPoint p2 = currentLine[i - 1];
CGPoint p3 = currentLine[i];
path.MoveTo(p0);
path.AddCurveToPoint(p3, p1, p2);
}
currentLine.RemoveRange(0, 3);
path.Stroke();
}
drawImage.Image = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
}
}
发布于 2017-11-08 18:04:26
我找到了答案。在我的应用程序中,我使用了一个侧抽屉,类似于这样的东西:https://github.com/jdehlin/Xamarin-Sidebar。
侧栏库为抽屉设置了一个pan手势,并且这个手势识别可能取消了我的触摸事件。在那个特定的视图中禁用抽屉后,所有东西都会正常工作。我想这也适用于正常的iOS,而不仅仅是Xamarin。
https://stackoverflow.com/questions/47177267
复制相似问题