Рисовать средствами iOSapiVoreGraphics можно только на нативном UIView. Поэтому для начала нужно создать на форме нативный UIView. Рисование возможно только в перекрытом методу UIView.drawRect. Поэтому создаем отдельный класс UIView и перекрываем метод DrawRect.
Ниже приведен код, оболочки UIView, который выполняет отрисовку, через событие OnPaint.
unit FMX.DrawableView;
interface
uses
System.Types, System.TypInfo, iOSapi.CoreGraphics, iOSapi.UIKit, Macapi.ObjectiveC;
type
IMyView = interface(UIVIew)
['{A7145466-B0FA-42C1-A588-E73D03FFEBF1}']
procedure drawRect(rect: CGRect); cdecl;
end;
TOnPaint = procedure (Sender: UIView; Context: CGContextRef; const Rect: CGRect) of object;
TDrawableView = class(TOCLocal)
private
FOnPaint: TOnPaint;
function GetView: UIView;
protected
function GetObjectiveCClass: PTypeInfo; override;
public
constructor Create(const AFrame: TRectF);
procedure drawRect(rect: CGRect); cdecl;
public
property View: UIView read GetView;
property OnPaint: TOnPaint read FOnPaint write FOnPaint;
end;
implementation
{ TMyView }
constructor TDrawableView.Create(const AFrame: TRectF);
var
V: Pointer;
begin
inherited Create;
V := View.initWithFrame(CGRectMake(AFrame.Left, AFrame.Top, AFrame.Width, AFrame.Height));
if GetObjectID <> V then
UpdateObjectID(V);
end;
procedure TDrawableView.drawRect(rect: CGRect);
var
context: CGContextRef;
begin
context := UIGraphicsGetCurrentContext();
try
if Assigned(FOnPaint) then
FOnPaint(View, context, rect);
finally
CGContextClearRect(context, rect);
end;
end;
function TDrawableView.GetObjectiveCClass: PTypeInfo;
begin
Result := TypeInfo(IMyView);
end;
function TDrawableView.GetView: UIView;
begin
Result := UIView(Super);
end;
end.
После того, как у нас есть нативное UIView, мы должны его создать и повесить на наше введенное событие OnPaint обработчик отрисовки:
private
FView: TDrawableView;
protected
// Декларация обработчика рисования
procedure DoPaint(Sender: UIView; Context: CGContextRef; const Rect: CGRect);
uses
FMX.Platform.iOS;
constructor TForm1.Create(AOwner: TComponent);
var
iOSHandle: TiOSWindowHandle;
begin
inherited;
FView := TDrawableView.Create(TRectF.Create(0, 0, 200, 200));
FView.OnPaint := DoPaint;
iOSHandle := WindowHandleToPlatform(Handle);
iOSHandle.View.addSubview(FView.View);
end;
// Пример отрисовки красного прямоугольника
procedure TForm1.DoPaint(Sender: UIView; Context: CGContextRef; const Rect: CGRect);
begin
CGContextSetRGBFillColor(context, 255, 0, 0, 1);
CGContextFillRect(context, CGRectMake(20, 20, 100, 100));
end;
В итоге получаем встроенное представление в форму, с отрисованным красным квадратом:
Демо проект: iOS_Draw_Rect.zip
Подробности отрисовки: Введение в Core Graphics на iOS