【问题标题】:Limitations in native iOS components for FiremonkeyFiremonkey 原生 iOS 组件的限制
【发布时间】:2014-12-31 10:25:32
【问题描述】:

我对使用原生组件进行 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 实现:使用命令 UINavigationController.PushViewController(UIViewController1),FMXwrapper 可以在 Form3(具有 FMX 组件)中滑动。我也可以在 UIViewController2 中滑动,但是这个表单(UIButton2)上的组件没有显示出来,这似乎是因为它在另一个表单上。如果 TMS iCL 真的要求所有组件都在同一个表单上,那么它是没有用的,除非你制作非常小的应用程序,但也许有解决这个问题的方法?

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

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

【问题讨论】:

  • 我认为 TMS iCL 没有这个限制。我在 8 种不同形式中使用 TMS iCL。但是,您的 UIViewController 正在制作它,因此其他表单实际上是当前表单。 DPF IOS 也是如此。您可以在同一个应用程序中混合使用 FMX 和 DPF IOS 表单。但是,如果您使用的是该视图控制器,则这两种形式实际上是一种。
  • 使用 TMS iCL,当我调用 UINavigationController.PushViewController(UIViewController2) 时,它确实在 Form 2 的 ViewController2 中滑动,但 ViewController2 上的组件未显示。这就是我遇到的问题。

标签: ios delphi firemonkey delphi-xe6


【解决方案1】:

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

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

【讨论】:

  • 是的,这将是处理这个问题的 Delphi/FMX 方法,它不是原生的。但是,我有一个想法,一个有经验的 iOS 用户将能够以一种或另一种方式看到差异,所以我真的很喜欢原生。如果我无法使用 UINavigationController 制作真正的原生解决方案,我将使用 FMX 解决方案作为后备方案。
  • 是的,我试图想出一个解决方案,在没有链接的情况下滑入表单。看起来 UIView 可以变得透明(stackoverflow.com/questions/15425149/making-uiview-transparent),这样您就可以采用相同的想法,但以本机方式。
【解决方案2】:

我联系了 TMS 以解决显示其他表单组件的问题。组件只需要首先在表单上进行初始化。简单的解决方案是在 MainForm.FormShow 中快速显示和隐藏 Form2。但是,由于许多“隐藏”形式可能会导致闪烁,因此 TMS 建议制作一个小功能(见下文)

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

TMS iCL:简单但稳定

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

D.P.F 原生控件:全面但不太稳定

  1. 它们在 FMX 控件中实现了更多的本地属性作为已发布的属性。它可以让您更快地使用它,尤其是在您不熟悉 iOS 原生控件及其属性的情况下。
  2. 它确实允许您在 Windows 上测试您的程序(这比在 iOS 模拟器上运行要快得多),因为这些控件实际上可以在 Windows 中运行。当然,图形被简化了,但这样做的目的是测试功能而不是用户界面。
  3. 无法混合 FMX 和本机组件,但您可以将本机组件放置在具有 FMX 组件的表单上,但有 TMS 第 3 点中提到的限制。

结论:最终我决定购买TMS iCL,原因有二:

  1. 我有很多自定义控件不想转换为 iOS 自定义控件,所以 FMX 包装器对我来说是必不可少的。
  2. 我可以得到支持。对于一家公司而言,这比没有支持的免费解决方案便宜得多,因为后者您必须花费数小时自己弄清楚所有事情。

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2011-11-13
    相关资源
    最近更新 更多