• 0
Antonyan

Рисование средствами iOSapi.CoreGraphics

Вопрос

Доброго времени суток !

 

Как нарисовать,например, квадрат и  кривую Безье, средствами iOSapi.CoreGraphics ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2 ответа на этот вопрос

  • 0

Рисовать средствами 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;

В итоге получаем встроенное представление в форму, с отрисованным красным квадратом:

post-1-0-40090400-1423233285_thumb.png

 

Демо проект: iOS_Draw_Rect.zip

Подробности отрисовки: Введение в Core Graphics на iOS

xenon54, Antonyan и Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Очень полезный материал, спасибо !

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу