2017-11-08 16 views
0

私は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(); 
    } 

} 

答えて

0

回答が見つかりました。私のアプリ全体では、次のようなサイド・ドロワーを使用しています:https://github.com/jdehlin/Xamarin-Sidebar

サイドバーリブは、引き出しのパンジェスチャを設定します。ジェスチャは、おそらくキャンセルされたタッチイベントを認識します。その特定のビューでドロワを無効にした後、すべてが声を出して動作します。これはXamarinだけでなく、通常のiOSでも有効です。