2011-01-13 3 views
0

Ich gebe jetzt auf diesen sehr einfachen Test, den ich versucht habe zu laufen. Ich möchte meinem Fenster eine Unteransicht hinzufügen, die nur eine Linie von einer Ecke des iPhone-Bildschirms zur anderen zeichnet und dann mit touchesMoved() eine Linie vom letzten zum aktuellen Punkt zeichnen soll. Die Probleme: 1. Bereits die Anfangszeile ist nicht sichtbar. 2. Bei Verwendung von Interface Builder ist die Anfangszeile sichtbar, aber drawRect() wird nie aufgerufen, selbst wenn ich SetNeedsDisplay() aufruft.Sehr einfache Testansicht in MonoTouch zeichnet eine Linie mit Core Graphics, aber der Inhalt wird nicht angezeigt

Es kann nicht so schwer sein ... kann jemand den Code unten reparieren, damit es funktioniert?

In main.cs in FinishedLaunching():

oView = new TestView(); 
oView.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; 
oView.Frame = new System.Drawing.RectangleF(0, 0, 320, 480); 
window.AddSubview(oView); 
window.MakeKeyAndVisible(); 

Die TestView.cs:

using System; 
using MonoTouch.UIKit; 
using MonoTouch.CoreGraphics; 
using System.Drawing; 
using MonoTouch.CoreAnimation; 
using MonoTouch.Foundation; 
namespace Test 
{ 
    public class TestView : UIView 
    { 
     public TestView() : base() 
     { 
     } 

     public override void DrawRect (RectangleF area, UIViewPrintFormatter formatter) 
     { 
      CGContext oContext = UIGraphics.GetCurrentContext(); 
      oContext.SetStrokeColor(UIColor.Red.CGColor.Components); 
      oContext.SetLineWidth(3.0f); 
      this.oLastPoint.Y = UIScreen.MainScreen.ApplicationFrame.Size.Height - this.oLastPoint.Y; 
      this.oCurrentPoint.Y = UIScreen.MainScreen.ApplicationFrame.Size.Height - this.oCurrentPoint.Y; 
      oContext.StrokeLineSegments(new PointF[] {this.oLastPoint, this.oCurrentPoint }); 
      oContext.Flush(); 
      oContext.RestoreState(); 
      Console.Out.WriteLine("Current X: {0}, Y: {1}", oCurrentPoint.X.ToString(), oCurrentPoint.Y.ToString()); 
      Console.Out.WriteLine("Last X: {0}, Y: {1}", oLastPoint.X.ToString(), oLastPoint.Y.ToString()); 

     } 

     private PointF oCurrentPoint = new PointF(0, 0); 
     private PointF oLastPoint = new PointF(320, 480); 

     public override void TouchesMoved (MonoTouch.Foundation.NSSet touches, UIEvent evt) 
     { 
      base.TouchesMoved (touches, evt); 
      UITouch oTouch = (UITouch)touches.AnyObject; 
      this.oCurrentPoint = oTouch.LocationInView(this); 
      this.oLastPoint = oTouch.PreviousLocationInView(this); 
      this.SetNeedsDisplay(); 
     } 
    } 
} 

Antwort

6

overrode Sie die falsche Draw-Methode.

Sie überschreiben DrawRect (RectangleF, UIViewPrintFormatter), die zum Drucken verwendet wird.

Sie wollen Draw (RectangleF)

+0

Es gibt nur Draw (RectangleF) und DrawRect (RectangleF, UIViewPrintFormatter) außer Kraft zu setzen, so dass ich nehme an, Sie beziehen sich auf "Draw()". Und es funktioniert! Scheint so, als wäre ich gestern zu müde, weil ich schwören könnte, dass ich es auch ein paar Mal probiert habe! Vielen Dank. – Krumelur

+0

Noch eine Sache: Ich muss das Ergebnis von LocationInView() nicht in GL-Koordinaten in Monotouch konvertieren? Ich habe es in ObjC gemacht, denke ich, aber jetzt scheint es so, als ob (0,0) oben links ist. – Krumelur

+0

Sie sind ganz richtig, ich habe meine Antwort entsprechend aktualisiert. Vielen Dank! Wie für die LocationInView, können Sie ein separates Objc-Beispiel veröffentlichen und ich kann Ihnen das Äquivalent sagen? –

Verwandte Themen