Перейти к содержанию
Fire Monkey от А до Я
  • 0

Airdrop или новая кнопка "Open In..." в iOS9 [Решено]


Дениска

Вопрос

C недавних пор мой старый метод открытия файлов в другом приложении перестал работать на ipad mini и iphone6. Оказалось что Apple ещё с ios 7 представил свой способ передачи файлов Airdrop, он же предоставляет возможность открывать файл в различных приложениях аналогично кнопке Open in. Итак код:

 

uses
  {$IFDEF IOS}
    iOSapi.UIKit,
    iOSapi.Foundation,
    iOSapi.CoreGraphics,
    FMX.Helpers.iOS,
    Macapi.Helpers,
    Macapi.ObjectiveC
  {$ENDIF};
procedure Share(const AControl: TControl; filepath: string);
var
  objects: NSMutableArray;
  controller : UIActivityViewController;
  popoverController: UIPopoverController;
  url: NSURL;

  procedure ShowForPhone;
  var
    Window: UIWindow;
  begin
    Window := SharedApplication.keyWindow;
    if (Window <> nil) and (Window.rootViewController <> nil) then
      Window.rootViewController.presentModalViewController(controller, True);
  end;

  procedure ShowForPad;
  var
    Window: UIWindow;
    PopoverRect: CGRect;
    AbsolutePos: TPointF;
  begin
    Window := SharedApplication.keyWindow;
    if AControl <> nil then
    begin
      AbsolutePos := AControl.LocalToAbsolute(PointF(0, 0));
      if AControl.Scene <> nil then
        AbsolutePos := AControl.Scene.LocalToScreen(AbsolutePos);
      PopoverRect := CGRectMake(AbsolutePos.X, AbsolutePos.Y, AControl.Width, AControl.Height);
    end
    else
      PopoverRect := CGRectMake(0, 0, 0, 0);
    popoverController := TUIPopoverController.Alloc;
    popoverController.initWithContentViewController(controller);
    popoverController.presentPopoverFromRect(PopoverRect, Window.rootViewController.View, UIPopoverArrowDirectionAny, True);
  end;

  procedure ShowActionsSheet;
  begin
    if IsPad then
      ShowForPad
    else
      ShowForPhone;
  end;

begin
  url := TNSURL.Wrap(TNSURL.OCClass.fileURLWithPath(StrToNSStr(filepath)));
  objects := TNSMutableArray.Create;
  objects.addObject((url as ILocalObject).GetObjectID);
  try
    if objects.count > 0 then
    begin
      controller := TUIActivityViewController.alloc;
      controller.initWithActivityItems(objects , nil);
      ShowActionsSheet;
    end;
  finally
    objects.release;
    objects := nil;
  end;
end;

Возможно Вы найдёт для себя что-то лишнее или нагромождённое, но заметьте, этот код подходит и для телефона и для планшета и сделан для быстрого  понимания происходящего. Он был "заимствован" и модифицирован из самой RAD Studio из модуля FMX.MediaLibrary.IOS 395 строка. Оригинал же позволял передавать лишь String и TBitmap. Если же Вам нужно передавать именно их, Вы можете открыть этот модуль "C:\Program Files\Embarcadero\Studio\17.0\source\fmx\FMX.MediaLibrary.iOS.pas" и найти в оригинале как это делается.

 

Изменено пользователем Дениска
Ссылка на комментарий

Рекомендуемые сообщения

Ответов пока нет

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...