2012-02-20 2 views
2

Я пытаюсь узнать больше о MonoTouch и поэтому попробовал рисовать с помощью Quartz2D. Я хочу создать пример, где я программно рисую n-прямоугольники. Проблема в том, что нарисован только первый. Я думаю, что второй удаляется/очищается/покрывается первым.Программно рисуем прямоугольники с помощью MonoTouch

Вот мой код:

SingleViewMTViewController.cs

public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     PointF locationOne = new PointF (5, 5); 
     PointF locationTwo = new PointF (5, 100); 
     SizeF size = new SizeF (120, 40); 

     DraggableRectangle tView = new DraggableRectangle (locationOne, size, UIColor.Yellow); 
     DraggableRectangle tView2 = new DraggableRectangle (locationTwo, size, UIColor.Brown); 

     DraggableRectangle[] views = new DraggableRectangle[2]; 
     views [0] = tView; 
     views [1] = tView2; 

     View.AddSubviews (views); 
    } 

DraggableRectangle.cs

public class DraggableRectangle : UIView 
{ 
    private CGPath path; 
    private PointF _targetLocation; 
    private SizeF _size; 
    private UIColor _fillColor = UIColor.Brown; 

    public DraggableRectangle (PointF targetLocation, SizeF size) 
    { 
     _targetLocation = targetLocation; 
     _size = size; 

     RectangleF frameRect = new RectangleF (_targetLocation.X, _targetLocation.Y, _size.Width, _size.Height); 
     this.Frame = frameRect; 
     this.BackgroundColor = UIColor.Clear; //without this, nothing is drawn 
    } 

    public DraggableRectangle (PointF targetLocation, SizeF size, UIColor fillColor):this(targetLocation,size) 
    { 
     _fillColor = fillColor; 
    } 

    public override void Draw (RectangleF rect) 
    { 
     //base.Draw (rect); 
     //works without base-call? 

     //get graphics context 
     using (CGContext gctx = UIGraphics.GetCurrentContext()) { 

      //set up drawing attributes 
      _fillColor.SetFill(); 

      //create geometry 
      path = new CGPath(); 

      path.AddRect (new RectangleF (_targetLocation.X, _targetLocation.Y, _size.Width, _size.Height)); 

      path.CloseSubpath(); 

      //add geometry to graphics context and draw it 
      gctx.AddPath (path);   
      gctx.DrawPath (CGPathDrawingMode.FillStroke); 
     }  
    } 

Есть ли лучший способ сделать самостоятельные прямоугольники с MonoTouch? Или может кто-нибудь объяснить, что я делаю неправильно?

Заранее благодарен!

ОБНОВЛЕНИЕ: То к чему. лучший выход я могу достичь, но вот только не исправить для «Yellow» и «Браун» http://www.bilder-upload.eu/show.php?file=81bfea-1329755225.png http://www.bilder-upload.eu/show.php?file=81bfea-1329755225.png

ответ

3

На самом деле, оба ваших прямоугольников нарисованы. Проблема заключается в вашем значении _targetLocation.Y. Вы устанавливаете то же значение Y как для вашего вида Frame, так и для его прямоугольника, который будет нарисован в его методе Draw.

Так что, в основном, ваш прямоугольник выведен за пределы видимости. Высота вашего «коричневого» вида составляет 40pt, а его прямоугольник - Y = 100 (ниже его видимой части).

Вы должны различать эти значения, так как местоположение вида всегда относится к его родительским координатам.

Редактировать: пример псевдокода.

Следующая строка:

path.AddRect (new RectangleF (_targetLocation.X, _targetLocation.Y, _size.Width, _size.Height)); 

Должно быть что-то вроде:

path.AddRect (new RectangleF ({Frame.Width >= something >= 0}, 
{Frame.Height >= something >= 0}, width, height); 

Edit # 2:

Если изменить прямоугольник в пути, со следующим:

path.AddRect (new RectangleF (0f, 0f, _size.Width, _size.Height)); 

Вот что я получаю ...

Two rects

+0

Звучит интересно, не могли бы вы дать мне пример-кода? Достаточно того, чтобы я знал, где я должен что-то изменить. Поскольку я не уверен на 100%, я понял, что вы имели в виду. Особенно, почему это делается ниже рамки? – basti

+0

Вау - это было быстро :) Большое спасибо. Еще один вопрос: на что зависит FrameSize? Итак, каково ваше «что-то» в вашем примере кода? – basti

+0

Только что отредактировал мой ответ, дайте мне знать! –

Смежные вопросы