Firemonkey的原生iOS组件的限制

时间:2014-11-04 13:45:24

标签: ios delphi firemonkey delphi-xe6

我非常喜欢使用本机组件进行iOS开发,因此我正在测试当前可用的两个选项:TMS iCLD.P.F iOS Native Components。不幸的是,我发现它们都有限制,使它们很麻烦或不可能使用,但我仍然希望我只是忽略了一些东西,因此我在这里问。

我发现限制:

  • TMS iCL:它要求整个应用程序中的所有本机组件都在同一个表单上!
  • D.P.F。:没有FMX包装器可以将它与FMX表单/组件结合使用。

这是我需要的简化版。我有3个表单,一个带有主菜单的主表单(作为按钮)和两个我想要滑入的表单。这是组件结构:

MainForm
  UINavigationController
    UIButtonA
    UIButtonB
  UIViewController1
    FMXwrapper that wraps Form3 (only in TMS iCL)

Form2
  UIViewController2
    UIButton2

Form3
  Various Firemonkey custom controls

使用TMS iCL实现:FMXwrapper可以使用命令UINavigationController.PushViewController(UIViewController1)在Form3(具有FMX组件)中滑动。我也可以在UIViewController2中滑动,但是这个窗体上的组件(UIButton2)没有显示,这似乎是因为它在另一个窗体上。如果TMS iCL真的要求所有组件都在同一个表单上,那么它是没用的,除非你制作非常小的应用程序,但也许有一个解决方案吗?

使用D.P.F实现。:您实际上可以嵌入来自其他单位的表单,因此我可以在Form2中滑动,但它只会在这些表单上显示DPF组件。因此,在Form3中滑动不会显示任何组件。是否有任何解决方案或解决方法可以使其发挥作用?

如何解决任何一个组件集中的限制的任何建议?

2 个答案:

答案 0 :(得分:1)

在Form1上使用带有多个选项卡(而不是Form2)的UITabBarController。您可以在选项卡之间滑动本机控件。

要让FMX Form3滑入,你可以设置TForm.Transparent:= True;。然后使用Form3.Show;显示表格。在Form3中有一个包含控件的TPanel / TRectangle。设置TPanel.Position.X:=屏幕宽度;然后在TForm.Show之后动画从右边滑动它。

答案 1 :(得分:1)

我联系TMS解决了显示其他表单组件的问题。组件只需要首先在表单上初始化。简单的解决方案是在MainForm.FormShow中快速显示和隐藏Form2。然而,有许多"隐藏"形成它可能会导致闪烁,所以TMS建议做一个小功能(见下文)

作为奖励,这是我对两个组件集的评估:

TMS iCL:简单但稳定

  1. 它们将很少的本机属性实现为FMX控件中的已发布属性。这不是一个大问题,因为您仍然可以直接访问本机对象并修改其属性,但它需要更多关于iOS类及其工作方式的知识。
  2. 它不包括正在运行的Windows目标用户界面。
  3. 它具有FMX包装器,允许您在某种程度上将FMX组件放置在本机组件中。 (通常当您在表单上混合使用FMX组件的本机组件时,本机始终位于前面,因此您无法使用本机导航组件,因为它们会占据整个屏幕并覆盖FMX组件)
  4. D.P.F原生控制:全面但不太稳定

    1. 他们在FMX控件中实现了更多本机属性作为已发布属性。它使得使用起来要快得多,特别是如果您不熟悉iOS本机控件及其属性。
    2. 它允许您在Windows上测试您的程序(这比在iOS模拟器上运行它快得多),因为控件实际上可以在Windows中运行。当然图形是简化的,但目的是测试功能而不是用户界面。
    3. 无法混合使用FMX和本机组件,但您可以将本机组件放置在具有FMX组件的表单上,并具有TMS第3点中提到的限制。
    4. 结论:最终我决定购买TMS iCL,原因有两个:

      1. 我有很多自定义控件,我不想转换为iOS自定义控件,因此FMX包装对我来说是不可或缺的。
      2. 我可以得到支持。对于一家公司来说,这比没有支持的免费解决方案便宜得多,你必须花费数小时才能弄清楚一切。
      3. TMS建议的程序:

        TMainForm
        ...
        procedure InitializeControl(AControl: TControl);
        ...
        
        implementation
        
        ...
        
        procedure TMainForm.InitializeControl(AControl: TControl); 
        var  I: Integer;
        begin
          if not Assigned(AControl) then
            Exit;
        
          if AControl is TTMSFMXNativeUIBaseControl then
          begin
            (AControl as TTMSFMXNativeUIBaseControl).Initialize;
            for I := 0 to AControl.ControlsCount - 1 do
              InitializeControl(AControl.Controls[I]);
          end;
        end;
        
        ...
        
        InitializeControl(Form2.TMSFMXNativeUIViewController2);