2013-07-29 2 views
4

기존 iOS (XCode) 앱 중 하나를 Delphi FireMonkey (XE4)로 이식하기 시작했습니다. 지금까지 놀랍도록 매끄러운 과정이었습니다. 그러나 우리는 해결책을 모르는 막 다른 골목에 처했습니다.iOS 컨트롤을 기반으로 한 FireMonkey 컨트롤이 올바르게 작동하지 않습니다.

기존 앱은 새로운 Google Maps 앱과 비슷합니다. webbrowser 컨트롤에 여러 핀이 포함 된 Google지도가 표시됩니다. 또한 설정 버튼과 핀이 빠졌을 때 나타나는 정보 패널이 있습니다. 해당 버튼/핀이 눌려지면 설정 및 정보 패널이 맵의 왼쪽 및 오른쪽에서 슬라이드됩니다. 이 모든 Xcode 응용 프로그램에서 잘 작동합니다.

여기에 우리가 FireMonkey 포트가있는 문제입니다

  • 우리는 웹 브라우저 컨트롤의 위쪽에 걸쳐 FireMonkey 제어를 표시 할 수 없습니다. webbroswer가 iOS 컨트롤 인 네이티브이기 때문에 이것이 맞는 것 같습니다.
  • 웹 브라우저 컨트롤이 표시되면 예를 들어 이동할 수 없습니다. position.x 속성을 변경하면 웹 브라우저는 그대로 유지됩니다. 내장 된 애니메이션을 사용하여 x 속성으로 변경하면 동일합니다. 올바르게 작동하는 것으로 보이는 유일한 속성은 visible입니다.

TMS iCL 구성 요소를 사용하여 첫 번째 문제를 해결할 수 있습니다. 그러나 가장 걱정스러운 문제는 두 번째입니다. Webbrowser 구성 요소를 움직일 수 없으면 웹 브라우저 (또는 기본 iOS 제어)를 사용하는 현대적인 (슬라이딩) UI를 구현하는 것이 불가능합니다.

누구도 이러한 FireMonkey 제한 사항을 극복하는 방법을 찾아 왔습니까?)

1 버튼과 웹 브라우저로 두 번째 폼을 만든 : 1

UPDATE는 야로슬라프의 제안에 따라 경찰 나는 다음을 시도했다.

unit Unit2; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes, 
    System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, 
    FMX.StdCtrls, FMX.WebBrowser; 

type 
    TForm2 = class(TForm) 
    WebBrowser1: TWebBrowser; 
    Button1: TButton; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form2: TForm2; 

implementation 

{$R *.fmx} 

end. 

2) Form1을 Form1의 하위로 생성했습니다. 나는 응용 프로그램을 실행할 때

unit Unit1; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser, 

    Unit2; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    Button2: TButton; 
    Label1: TLabel; 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    FForm2: TForm2; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Fform2.left := Fform2.left - 5; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    Fform2.left := Fform2.left + 5; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FForm2 := TForm2.Create(Self); 
    FForm2.Parent := Self; 
    FForm2.Left := 10; 
    FForm2.Show; 
    FForm2.BringToFront; 
    FForm2.WebBrowser1.URL := 'www.google.com'; 
    FForm2.WebBrowser1.Navigate; 
end; 

end. 

나는 이것을 참조 : 버튼을 클릭

  • 는 효과가 없습니다 : 여기

    enter image description here

    내 관측이다.
  • Form2의 단추가 표시되지 않습니다.
  • Form2의 Left 속성이 디자이너에서 40으로 설정됩니다. 그러나 양식은 0으로 표시됩니다.업데이트 2

: 주석의 제안에 따라

내가에 Form1의 소스를 변경 : 불행하게도

unit Unit1; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser, 

    Unit2; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    Button2: TButton; 
    Label1: TLabel; 
    Popup1: TPopup; 
    WebBrowser1: TWebBrowser; 
    WebBrowser2: TWebBrowser; 
    Label2: TLabel; 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    FForm2: TForm2; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    TCustomForm(Popup1.Popupform).Left := TCustomForm(Popup1.Popupform).Left - 5; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    TCustomForm(Popup1.Popupform).Left := TCustomForm(Popup1.Popupform).Left + 5; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    WebBrowser1.URL := 'www.google.com'; 
    WebBrowser1.Navigate; 
    Popup1.Popup(FALSE); 
end; 

end. 

, 운동이나 오버레이도 작동합니다. 현재 코드는 TCustomForm (Popup1.Popupform) .Left를 참조 할 때 예외를 throw합니다. 예외가 발생하는 이유는 상위 폼에서 마우스 왼쪽 아래쪽 이벤트가 발생하자마자 델파이가 팝업을 닫는 것 (팝업 폼을 파기) 때문입니다. 심지어 낯선 사람은 클릭했을 때 반응하지 않더라도 웹 브라우저가 닫힌 것으로 가정 된 후에도 여전히 볼 수 있다는 것입니다.

코드를 Popup1.Position.X로 변경해도 예외가 발생하지 않지만 물론 팝업은 계속 이동하지 않습니다.

또한 팝업을 부모로 사용하는 레이블은 기본 폼이 소유 한 웹 브라우저 아래에도 계속 표시됩니다.

업데이트 3

나는 문제의 번호를 발견 있지만 고정하는 것은 더 나은 작동하지 않습니다. 일부 (불가사의) 때문에

  1. , 그것의 주요 형태가 아닌 선택된 제어에 커트 제어를 붙여 그 후, 제어부 (CTRL-X)를 절단하는 다른 제어 및 붙여 넣기 (CTRL-V)를 선택하는 것으로 보인다. 컨트롤을 reparent하는 유일한 방법은 그것을 구조 트리에 드래그 앤 드롭하는 것입니다.
  2. Popup에 컨트롤을 다시 보급 한 후 Popup1.Popup (FALSE)을 호출하자마자 예외가 발생합니다. 팝업은 Create 이벤트에 표시되기 때문에 가능합니다. OnClick 이벤트로 이동하면 예외가 제거됩니다.
  3. 주 폼을 클릭 할 때 팝업 닫는 것을 중지하려면 .Popup을 호출하기 전에 StaysOpen 속성을 설정해야합니다. 그러나 실제로이 속성은 올바르게 작동하지 않는 것 같습니다. 예를 들어 다음 코드는 TCustomForm (Popup1.PopupForm) .Left 행으로 변경하지만 팝업 양식이 이미 소멸되어 예외가 발생합니다!

코드 : 솔루션을

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Popup1.StaysOpen := TRUE; 
    Popup1.Popup(FALSE); 

    if Popup1.HasPopupForm then 
    TCustomForm(Popup1.PopupForm).Left := TCustomForm(Popup1.PopupForm).Left - 5; 
end; 

답변

2

우리가 알아야 : 홈페이지 의 UIViewController의 루트보기로 하위 뷰 기본 UIView의

  1. 각 Firemonkey 양식 기지. 따라서 FireMonkey 폼에 컨트롤을 삽입하면 폼의 UIView에 해당 컨트롤이 유지됩니다.
  2. 모든 standart Firemonkey 컨트롤에는 기본 UIView가 없습니다. FMX 형식은 모든 FMX 컨트롤을 가지고 있으며이를 관리합니다.
  3. Firemonkey WebBrowser는 UIWebView을 기반으로 Firemonkey 양식의 UIView에서 하위보기처럼 표시됩니다.
  4. 모든 팝업 폼은 투명 배경을 가진 UIView를 기반으로합니다. 팝업 및 위치의 설정 위치 TForm.Position, TForm.Size.따라서 TWebBrowser를 사용하여 양식 위에 투명한 배경을 가진 양식을 만들고 크기를 설정하고 위치를 설정할 수 있습니다.

    1. 하는 새로운 형태 또는 팝업 형태
    2. 세트의 크기와에 대한 위치를 만들기 : 당신이 할 수있는 문제의 해결책을

    .

  5. WebBrowser를 사용하여 양식에서 표시하십시오. 이 경우 새 양식은 모든 UIView의 맨 위에 분리 된 UIView로 표시됩니다.
+0

+ Yaroslav Brown - 귀하의 제안을 시도했습니다. 내 결과에 대해서는 위의 업데이트를 참조하십시오. – norgepaul

+0

확인. 내가 참조. 1. 양식에 TPopup을 추가하십시오. 2. TPopup에 컨트롤을 추가하십시오. 3. Popup1.Popup; 나를 위해 팝업이 웹 브라우저 위에 나타납니다 –

+0

지금 당장은이 방법을 사용할 수 없지만 ... a) 팝업에 컨트롤을 추가하면 기본 iOS 컨트롤과 b) 팝업을 통해 해당 팝업을 표시 할 수 있습니다. FireMonkey 컨트롤과 동일한 방식으로 네이티브 컨트롤이 이동 될 수 있습니다. iOS에서 팝업이 모달로 표시되지 않습니까? – norgepaul