Einzelnen Beitrag anzeigen

Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#1

UIScrollView in UIPageViewController

  Alt 30. Jan 2014, 20:53
Guten Abend,
ich brauche dringend Eure Hilfe bei folgendem Problem:
  • Ein UIPageViewController besteht aus 5 Seiten
  • Jede Seite besitzt ein UIScrollView (mit oder ohne Unterobjekte spielt keine Rolle)
  • Das UIScrollView hat die Eigenschafften Align=alClient und MarginTop=45
Nun passiert es bei allen 2-3 App-Aufrufen, dass zufällig ausgewählte Seiten sich nicht mit der Wisch-Geste umblättern lassen.
Aber:
Wischt man ganz unten oder ganz Oben am Rand des UIPageViewControllers, so funktioniert das Umblättern auch bei den "infizierten" Seiten einwandfrei.
Auch ein Klick auf den linken oder rechten Seiterand funktioniert.
Nur in der Mitte vom ScrollView werden keine Gesten erkannt.

Was Jens vermutet hat, kann ich aufgrund der gerade genannten Umstände ausschließen:
Zitat:
Blättert nicht zu einer vermeidlich vorhandenen Seite, GestureRecogniter nicht verbunden, NullPointerException ... Das hört sich genau nach solchen Speicherbereinigungseffekten an.
Ich zeig euch einfach mal mein Code (stark vereinfacht, mag deshalb vielleicht an manchen Stellen sinnlos erscheinen). Den Fehler konnte ich leider nicht in einem Testprojekt reproduzieren.
Delphi-Quellcode:
unit TestVieweriOS;

interface

uses
  SysUtils, DateUtils, Classes, System.Types, System.UITypes, Generics.Collections,
  iOSapi.UIKit, iOSapi.Foundation, iOSapi.CocoaTypes, iOSapi.CoreGraphics,
  MacApi.ObjectiveC, MacApi.ObjcRuntime,
  FMX.Types, FMX.TMSNativeUIScrollView, FMX.Dialogs, FMX.TMSNativeUIButton,
  FMX.TMSNativeUIViewController, FMX.TMSNativeUIPageViewController,
  FMX.TMSNativeUIBaseControl, FMX.TMSNativeUIView, FMX.TMSNativeUILabel,
  Interfaces.VPlanController.VPlanViewer;

type
  TViewerElement = class(TTMSFMXNativeUIViewController)
  private
   FContainer: TTMSFMXNativeUIScrollView;
   procedure Clear;
  public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
  end;

type
  TTestViewer = class(TTMSFMXNativeUIView)
  private
   FPager: TTMSFMXNativeUIPageViewController;
   FViewElements: array[0..4] of TViewerElement;
  public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
  end;

implementation

{ TTestViewer }

constructor TTestViewer.Create(AOwner: TComponent);
var n: Integer;
begin
 inherited;
 FPager:= TTMSFMXNativeUIPageViewController.Create(Self);
 FPager.Parent:= Self;
 FPager.Align:= TAlignLayout.alClient;

 for n:= Low(FViewElements) to High(FViewElements) do
 begin
  FViewElements[n]:= TViewerElement.Create(FPager);
  with FViewElements[n] do
  begin
   Parent:= FPager;
   Align:= TAlignLayout.alClient;
   Initialize;
  end;
  FPager.Pages.Add.View:= FViewElements[n];
 end;
 FPager.Initialize;
end;

destructor TTestViewer.Destroy;
var n: Integer;
begin
 for n:= Low(FViewElements) to High(FViewElements) do
  FViewElements[n].DisposeOf;
 FPager.DisposeOf;
 inherited;
end;

{ TViewerElement }

constructor TViewerElement.Create(AOwner: TComponent);
begin
 inherited;
 // ----------- PROBLEM ----------- //
 FContainer:= TTMSFMXNativeUIScrollView.Create(Self);
 with FContainer do
 begin
  Parent:= Self;
  Align:= TAlignLayout.alClient;
  ScrollView.setContentSize(CGSizeMake(FWidth,FHeight));
  Margins.Top:= CONTAINER_MARGIN_TOP;
  Initialize;
 end;
 // ------------------------------ //
end;

destructor TViewerElement.Destroy;
begin
 FContainer.DisposeOf;
 inherited;
end;

procedure TViewerElement.Clear;
begin
 FContainer.ScrollView.subviews.makeObjectsPerformSelector(sel_getUid('removeFromSuperview'));
end;

end.
Der PageViewController funktioniert einwandfrei, sobald ich das UIScrollView nicht erzeuge.
Hoffe, dass mir jemand helfen kann. Das Problem liegt mir schon ein Weilchen im Magen...

Viele Grüße
Croco
  Mit Zitat antworten Zitat