2017-02-24 67 views
0

夥計們!我有一個非常好的問題,我正在使用Paintcode 3,並且正在使用Xamarin.Forms(PCL/SAP)項目。我現在有一個示例項目正在運行,並且我在paintcode 3中有一個自定義繪圖。但是,我瞭解paintcode是假定本機工作與c#Xamarin。然而,我在想,我可以創建一個自定義渲染器my xamarin.forms項目,然後提取自定義的paintcode 3繪圖,然後創建一個渲染並將其粘貼在那裏。在我發佈任何代碼之前,我的問題是之前已經完成了這種方法,或者任何人嘗試過?Xamarin.Forms PCL/SAP自定義渲染與paintcode 3支持

這裏是我到目前爲止的代碼很簡單的東西:

我的主頁:

public class MainPageCS :ContentPage 
{ 
    public MainPageCS() 
    { 

     // The root page of your application 

     Title = "PCTest"; 
     Padding = new Thickness(0, 20, 0, 0); 

     Content = new TestView 
     { 


      // draw object will go here once i render it. 

      BackgroundColor = Color.Blue, 
      HorizontalOptions = LayoutOptions.Center, 
      VerticalOptions = LayoutOptions.Center 

     }; 

    } 

} 

簡單的內容頁面的測試頁從Xamarin.forms視圖繼承。

public class TestView : View 
{ 
    public TestView() 
    { 
    } 
} 

現在看起來很簡單,但是,這裏是它變得怪異的地方這裏是我創建的paintcode項目。這裏是圖像。 PaintCodeProjectImage

現在,下面是生成該圖像的代碼。 TestChatBox.cs

namespace PaintCodeStyleKitTest 
{ 
[Register("TestChatBox")] 
public class TestChatBox : NSObject 
{ 

    //// Cache 

    private static UIImage imageOfChatIcon; 
    private static NSObject[] chatIconTargets; 

    //// Initialization 

    static TestChatBox() 
    { 

     DrawChatIcon(); 
    } 

    //// Drawing Methods 

    public static void DrawChatIcon() 
    { 

     //// Oval 2 Drawing 
     var oval2Path = new UIBezierPath(); 
     oval2Path.MoveTo(new CGPoint(105.65f, 43.5f)); 
     oval2Path.AddCurveToPoint(new CGPoint(55.59f, 56.97f), new CGPoint(87.51f, 43.64f), new CGPoint(69.43f, 48.13f)); 
     oval2Path.AddCurveToPoint(new CGPoint(35.44f, 96.92f), new CGPoint(38.57f, 67.85f), new CGPoint(31.85f, 82.81f)); 
     UIColor.Gray.SetStroke(); 
     oval2Path.LineWidth = 9.0f; 
     oval2Path.LineCapStyle = CGLineCap.Round; 
     oval2Path.Stroke(); 


     //// Bezier 2 Drawing 
     var bezier2Path = new UIBezierPath(); 
     bezier2Path.MoveTo(new CGPoint(166.1f, 48.28f)); 
     bezier2Path.AddCurveToPoint(new CGPoint(166.1f, 131.72f), new CGPoint(199.3f, 71.32f), new CGPoint(199.3f, 108.68f)); 
     bezier2Path.AddCurveToPoint(new CGPoint(89.68f, 147.91f), new CGPoint(145.34f, 146.13f), new CGPoint(116.5f, 151.53f)); 
     bezier2Path.AddCurveToPoint(new CGPoint(43.5f, 169.5f), new CGPoint(71.56f, 159.66f), new CGPoint(43.5f, 169.5f)); 
     bezier2Path.AddCurveToPoint(new CGPoint(58.33f, 138.86f), new CGPoint(43.5f, 169.5f), new CGPoint(53.16f, 153.11f)); 
     bezier2Path.AddCurveToPoint(new CGPoint(45.9f, 131.72f), new CGPoint(53.95f, 136.8f), new CGPoint(49.78f, 134.42f)); 
     bezier2Path.AddCurveToPoint(new CGPoint(45.9f, 48.28f), new CGPoint(12.7f, 108.68f), new CGPoint(12.7f, 71.32f)); 
     bezier2Path.AddCurveToPoint(new CGPoint(166.1f, 48.28f), new CGPoint(79.09f, 25.24f), new CGPoint(132.91f, 25.24f)); 
     bezier2Path.ClosePath(); 
     UIColor.Red.SetStroke(); 
     bezier2Path.LineWidth = 9.0f; 
     bezier2Path.Stroke(); 
    } 

    //// Generated Images 

    public static UIImage ImageOfChatIcon 
    { 
     get 
     { 
      if (imageOfChatIcon != null) 
       return imageOfChatIcon; 

      UIGraphics.BeginImageContextWithOptions(new CGSize(210.0f, 190.0f), false, 0); 
      TestChatBox.DrawChatIcon(); 
      imageOfChatIcon = UIGraphics.GetImageFromCurrentImageContext(); 
      UIGraphics.EndImageContext(); 

      return imageOfChatIcon; 
     } 
    } 

    //// Customization Infrastructure 

    [Outlet] 
    public NSObject[] ChatIconTargets 
    { 
     get { return chatIconTargets; } 
     set 
     { 
      chatIconTargets = value; 
      foreach (NSObject target in value) 
      { 
       target.PerformSelector(new ObjCRuntime.Selector("setImage:"), ImageOfChatIcon, 0); 
      } 
     } 
    } 

} 

現在,以上是當我完成那個簡單的圖像時爲我生成的paintcode。 從閱讀paintcode文檔生成的代碼必須覆蓋drawRect方法,以繪製圖片中看到我的test.cs中不過

using System; 
    using Xamarin.Forms; 
    using CoreGraphics; 
    using UIKit; 
    using System.Drawing; 
    using Foundation; 
    using PaintCodeStyleKitTest; 
    namespace PCTest 
    { 
     public class Test : UIView 
     { 
      public Test() 
      { 
       TestChatBox.DrawChatIcon(); 
      } 

      public override void Draw(CGRect rect) 
      { 

       base.Draw(rect); 
       TestChatBox.DrawChatIcon(); 


      } 


     } 
    } 

這將覆蓋繪製方法和所謂成功作畫,當我嘗試使用我的測試渲染器文件來完成自定義渲染。

using System; 
using Xamarin.Forms; 
using PCTest; 
using UIKit; 
using Xamarin.Forms.Platform.iOS; 
using PaintCodeStyleKitTest; 
using PCTest.iOS; 
using Foundation; 
using UIKit; 
using CoreGraphics; 

[assembly: ExportRenderer(typeof(TestView), typeof(TestRenderer))] 
namespace PCTest.iOS 
{ 
    public class TestRenderer : ViewRenderer<TestView, Test> 
    { 
     Test txt; 
     protected override void OnElementChanged(ElementChangedEventArgs <TestView> e) 
      { 
       base.OnElementChanged(e); 
     if (Control == null) 
     { 
      //txt = new Test(tes); 
      Test tests = new Test(); 

      SetNativeControl(new Test()); 

     } 
      if (e.OldElement != null) 
      { 
       return; 
      } 

     } 


} 


} 

我運行我的示例應用程序,沒有任何東西被繪製到視圖中。我想知道爲什麼。我試圖申請一個簡單的內容頁面來查看我的樣本視圖是否會呈現,但是沒有呈現任何人都可以指出我對這個方向是正確的。有沒有什麼我對我的方法做了什麼錯誤?請幫忙!

回答

0

您還沒有給予任何尺寸您的自定義控制,因此您的自定義UIViewFrame永遠不會被設置成它存在於0,0大小爲0,0

var test = new TestView 
{ 
    WidthRequest = 200, 
    HeightRequest = 200, 
    BackgroundColor = Color.Blue, 
    HorizontalOptions = LayoutOptions.Center, 
    VerticalOptions = LayoutOptions.Center 
}; 

enter image description here

+0

@SushiHangoverso是其他代碼我在我的其他CS文件是否正確?我知道我沒有正確初始化框架來渲染我的照片。我是否必須在我的Test.cs中提出你在UIView的子類中提出的建議,否則我必須在View的子類TestView中進行更改? – Nijoel

+0

@Nijoel它取決於你當前的'DrawChatIcon'是基於硬編碼的維度,因此用UIView'對幀大小進行硬編碼可能是有意義的......我傾向於使用PaintCode的框架,約束和變量來製作調整大小的參數化設計到他們的容器(即一個文本輸入字段的圖形可能會垂直擴展不水平,因爲輸入字段的字體大小發生變化...)它真的取決於您的矢量圖形將如何在UI中使用的用例並因此需要多少工作,但進入它... – SushiHangover

+0

@Nijoel在Paintcode中添加框架,約束,變量可以是很多工作,如果你從未在完成的UI控件中使用它...我有很多來自Paintcode的靜態圖紙,我只是放入控件的Draw方法中,然後完成了。其他時候,我將控件的內部大小連接到Paintcode繪圖,其他時候我通過控件屬性公開Paintcode變量,以便開發人員可以在設計時或在運行時以編程方式調整它們.... – SushiHangover

相關問題