![]() |
UIScrollView in UIPageViewController
Guten Abend,
ich brauche dringend Eure Hilfe bei folgendem Problem:
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:
Delphi-Quellcode:
Der PageViewController funktioniert einwandfrei, sobald ich das UIScrollView nicht erzeuge.
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. Hoffe, dass mir jemand helfen kann. Das Problem liegt mir schon ein Weilchen im Magen... Viele Grüße Croco |
AW: UIScrollView in UIPageViewController
Ich habe nur 2 wage Ideen für Dich.
1. Beißt sich eventuell die horizontale Swipe Gesture des UIScrollviews mit der horizontalen Swipe Gesture für das Umblättern des UIPageViewControllers? Das halte ich allerdings für unwahrscheinlich, weil ich in meiner App fast das gleiche Szenario habe (UICollectionView auf UIPageView Seiten) und hier tritt dieser Effekt nicht auf. Die UICollectionView erbt ja von UIScrollView. Testen könntest Du es recht einfach, indem du das horizontale Scrollen in deinem UIScrollview verbietest. ![]() 2. Schau mal in die Oxygene Methode, die ich dir in dem "UIPageViewController umblättern Thread" gepostet habe. Ganz unten in meinem Code sind 3 Codezeilen, die in den Apple Beispielen stehen und die auch im Xcode "PageBased App Template" in dieser Methode vorhanden sind. In deinem
Delphi-Quellcode:
finde ich nur einen der Befehle wieder.
TTestViewer.Create()
Delphi-Quellcode:
Hast Du das Starten bei einer bestimmten Seite hinbekommen?
// Das hast Du sicher mit "FPager.Parent:=self;" richtig gelöst.
// Oder geht auch der originale API Befehl "self.addChildViewController(FPager);"? addChildViewController(pageViewController); // Nicht nur den PageViewController als ChildViewController hinzufügen, sondern // auch den PageViewController.View als Subview in den RootView einbetten view.addSubview(pageViewController.view); // Das hier macht Apple auch immer... // Dem RootView werden die GestureRecognizer des UIPageViewControllers zugewiesen. view.gestureRecognizers := pageViewController.gestureRecognizers; |
AW: UIScrollView in UIPageViewController
Zitat:
Hab einfach mal ein bisschen rumgespielt und folgendes funktionert, aber eben ohne die GestureRecognizer vom ScrollView:
Delphi-Quellcode:
constructor TViewerElement.Create(AOwner: TComponent);
begin inherited; 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; FContainer.ScrollView.setGestureRecognizers(Self.View.gestureRecognizers); {...} end; |
AW: UIScrollView in UIPageViewController
Nach unzähligen Stunden hin- und her versuchen konnte ich den Fehler finden bzw. eingrenzen.
Dieses Objekt mit dem ScrollView und dem PageViewController befindet sich auf einem Pan-able View. Wenn ich das deaktiviere gibt es keine Probleme mehr. Jetzt stellt sich aber die Frage, wie es dazu kommt, dass es dort ein Konflikt gibt und warum dieser nur zufällig eintritt? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz