夥計們!我有一個非常好的問題,我正在使用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;
}
}
}
}
我運行我的示例應用程序,沒有任何東西被繪製到視圖中。我想知道爲什麼。我試圖申請一個簡單的內容頁面來查看我的樣本視圖是否會呈現,但是沒有呈現任何人都可以指出我對這個方向是正確的。有沒有什麼我對我的方法做了什麼錯誤?請幫忙!
@SushiHangoverso是其他代碼我在我的其他CS文件是否正確?我知道我沒有正確初始化框架來渲染我的照片。我是否必須在我的Test.cs中提出你在UIView的子類中提出的建議,否則我必須在View的子類TestView中進行更改? – Nijoel
@Nijoel它取決於你當前的'DrawChatIcon'是基於硬編碼的維度,因此用UIView'對幀大小進行硬編碼可能是有意義的......我傾向於使用PaintCode的框架,約束和變量來製作調整大小的參數化設計到他們的容器(即一個文本輸入字段的圖形可能會垂直擴展不水平,因爲輸入字段的字體大小發生變化...)它真的取決於您的矢量圖形將如何在UI中使用的用例並因此需要多少工作,但進入它... – SushiHangover
@Nijoel在Paintcode中添加框架,約束,變量可以是很多工作,如果你從未在完成的UI控件中使用它...我有很多來自Paintcode的靜態圖紙,我只是放入控件的Draw方法中,然後完成了。其他時候,我將控件的內部大小連接到Paintcode繪圖,其他時候我通過控件屬性公開Paintcode變量,以便開發人員可以在設計時或在運行時以編程方式調整它們.... – SushiHangover