私はiOSでカスタム図面ビューを持っています。それはXamarinにありますが、私はそれが適切だとは思わない。iOS 11 touch cancelled
私はタッチ開始イベント、いくつかの移動イベントを取得し、タッチがキャンセルされます。具体的には、元のタッチポイントから指を少し離した場合です。元のタッチポイントから数mm以内に留まると、キャンセルされません。
コードは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();
}
}