![]() |
UINavigationController mit UIImage und UITapGestureRecognizer
Hallo,
meine App besitzt einen NavigationController mit einem Logo auf der linken Seite. Wenn das Logo angeklickt wird, öffnent sich ein Menü (NavCont. wird nach rechts geschoben -> UIImage nicht mehr an gleicher Stelle). Hier mal der Code:
Delphi-Quellcode:
Anwendung:
procedure StyleNavBar(ANavigationController: TTMSFMXNativeUINavigationController; ALogoClickHandler: UITapGestureRecognizer; ATitle: String);
var nd: NSDictionary; background: UIView; navBarIcon: UIImageView; bgdRect: CGRect; imgRect: CGRect; begin ANavigationController.Title:= ATitle; // Hintergrund bgdRect:= ANavigationController.NavigationController.navigationBar.frame; bgdRect.size.height:= bgdRect.size.height+Abs(MARGIN_TOP); bgdRect.origin.y:= MARGIN_TOP; background:= TUIView.Wrap(TUIView.Alloc.initWithFrame(bgdRect)); background.setBackgroundColor(AlphaColorToUIColor($FF3E3894)); // Logo navBarIcon:= TUIImageView.Wrap(TUIImageView.Alloc.initWithImage(ImageFromBitmap(BitmapContainer.Items[0].Bitmap))); imgRect:= navBarIcon.frame; imgRect.origin.x:= 5; imgRect.origin.y:= ((bgdRect.size.height/2)-(bgdRect.size.height/2))+Abs(MARGIN_TOP); navBarIcon.setUserInteractionEnabled(true); navBarIcon.setFrame(imgRect); navBarIcon.setContentMode(UIViewContentModeScaleAspectFit); if Assigned(ALogoClickHandler) then navBarIcon.addGestureRecognizer(ALogoClickHandler); // Zusammenführung background.addSubview(navBarIcon); ANavigationController.NavigationController.navigationBar.insertSubview(background,1); nd:= TNSDictionary.Wrap(TNSDictionary.OCClass.dictionaryWithObject((AlphaColorToUIColor($FFF1803C) as ILocalObject).GetObjectID, (NSForegroundColorAttributeName as ILocalObject).GetObjectID)); ANavigationController.NavigationController.navigationBar.setTitleTextAttributes(nd); end;
Delphi-Quellcode:
StyleNavBar(MainView,TUITapGestureRecognizer.Wrap(TUITapGestureRecognizer.Alloc.initWithTarget(aClickHandler.GetObjectID,sel_getUid('Click'))),'Test');
Jetzt ergibt sich das Problem, dass der ClickHandler nicht mehr reagiert, wenn das Menü offen ist. Erst wenn sich das Logo wieder an der alten Position befindet, wird der Klick erkannt. Jemand eine Idee, woran das liegt? Viele Grüße Croco |
AW: UINavigationController mit UIImage und UITapGestureRecognizer
Zitat:
Auf eine UINavigationBar gehört nicht einfach so ein UIImageView drauf! Sowas kann auch nur FMX :wink: Eine NavigationBar hat ein NavigationItem. Dieses NavigationItem hat drei wesentliche "weak" Properties: - leftButtonItem - rightButtonItem - titleView (beim Titel bin ich mir gerade nicht sicher bei der genauen Bezeichnung). "self.navigationItem.leftButtonItem" und "self.navigationItem.rightButtonItem" sind erstmal NIL. d.h. die sind unsichtbar. Man kann den beiden Properties nun jeweils eine UIBarButtonItem Instanz zuweisen. So ein UIBarButtonItem hat eine Image Property, die dein Bild anzeigen kann, kann Klick-Events verarbeiten (ohne GestureRecognizer) und das Ding bleibt auch an dem Platz, wo es hingehört. |
AW: UINavigationController mit UIImage und UITapGestureRecognizer
Zitat:
Nagut, habs mal so gemacht, wie du gesagt hast:
Delphi-Quellcode:
Aber jetzt bekomm ich leider gar kein Bild zusehen :(
procedure TF_MainiOS.StyleNavBar(ANavigationController: TTMSFMXNativeUINavigationController; ALogoClickHandler: TUIClickHandler; ATitle: String);
var navBarIcon: UIImageView; navBarItem: FMX.TMSNativeUICore.UIBarButtonItem; begin navBarIcon:= TUIImageView.Wrap(TUIImageView.Alloc.initWithImage(ImageFromBitmap(BitmapContainer.Items[0].Bitmap))); navBarItem:= FMX.TMSNativeUICore.TUIBarButtonItem.Wrap( FMX.TMSNativeUICore.TUIBarButtonItem.Alloc.initWithImage( navBarIcon.image,UIBarButtonItemStylePlain,nil,nil)); ANavigationController.NavigationController.navigationItem.setLeftBarButtonItem(navBarItem); end; |
AW: UINavigationController mit UIImage und UITapGestureRecognizer
So geht's bei mir. Vielleicht hilft Die das wieder ein bisschen weiter.
Delphi-Quellcode:
Geht es um Deine PageBased Application?
var rightbutton:UIBarButtonItem;
var img:UIImage := UIImage.imageNamed('Gear.png'); rightbutton := UIBarButtonItem.alloc.initWithImage(img) // was wird angezeigt? style(UIBarButtonItemStyle.UIBarButtonItemStylePlain ) // ButtonTyp? target(self) // wer ist Delegate? action(selector(buttonSettingsTouchUpInside:)); // Methode für KlickEvent? navigationItem.rightBarButtonItem := rightbutton; rightbutton := nil; // die Referenz brauchen wir nicht mehr. Dann versuche das barButtonItem mal im ViewDidLoad des RootViewControllers zu implementieren. Der Zugriff auf das richtige NavigationItem ist bei PageBased Apps etwas komplizierter, wegen der mehrfachen ViewController Verschachtelung. Du hast ja RootViewController, UIPageViewController und auf jeder Seite ggf. noch einen ViewController für den "Seiteninhalt". Kannst Dich auch aus dem "Seiten"ViewController hochhangeln, bis Du das richtige NavigationItem gefunden hast.
Code:
parentViewController.'<parentViewController.> ...'.navigationItem.rightBarButtonItem
|
AW: UINavigationController mit UIImage und UITapGestureRecognizer
Zitat:
An die ganzen Funktionen, wie ViewDidLoad, komm ich nicht ohne weiteres dran, d.h. nicht ohne eine Klasse zu bauen die dann das Interface implementiert. Bevor ich mir die Arbeit mache, möchte ich das Problem noch etwas begrenzen und gucken, ob es doch nicht noch anderes geht. Hab einfach mal den ViewController vom NavigationController genommen und dem ein Item zugewiesen:
Delphi-Quellcode:
Das funktioniert zumindest für genau diese Seite.
ViewController.navigationItem.setLeftBarButtonItem(navBarItem);
Aber auch hier ergibt sich ein neues Problem, denn das Bild wird blau dargestellt :| Wie ändert man das? Naja, aber selbst mit farbigen Bild wäre das Problem noch nicht gelöst, da ja auf jeder Seite das Logo zusehen sein soll. Meine App besteht aus einem MainView, ein NavigationController (der einzige) und 5 ViewControllern die über das Menü auf das MainView gepusht werden. Wenn ich nun explizit dem MainView, also dem einzigen NavigationController, das Item zuweise, dann würde ich annehmen, dass das "richtige" Item damit ja gefunden ist, oder nicht? |
AW: UINavigationController mit UIImage und UITapGestureRecognizer
Wenn das BarButtonItem auf einer Seite schonmal blau wird, dann hast Du schon fast einen Treffer. Dann brauchst Du dir doch nur noch ein "viewDidLoad ähnliches Event" für jede einzelne Seite suchen und da auch schon mal den Code zum Initialisieren des "blauen" BarbuttonItems aufrufen.
Warum es blau wird anstatt dein Image anzuzeigen weiß ich nicht. Image vielleicht zu groß oder zu klein? Hast Du es mal mit einem richtigen UIImage probiert?
Delphi-Quellcode:
Mal PNG anstatt JPG getestet?
var img:UIImage := UIImage.imageNamed('Gear.png');
rightbutton := UIBarButtonItem.alloc.initWithImage(img) .... Oder erstmal klein anfangen und einen "+" Button ohne eigene Grafik testen?
Delphi-Quellcode:
var addButtonItem := UIBarButtonItem.alloc.initWithBarButtonSystemItem(UIBarButtonSystemItemAdd)
target(self) action(SELECTOR(addEventTouchUpInside:)); |
AW: UINavigationController mit UIImage und UITapGestureRecognizer
Also das Image wird in der Form richtig angezeigt, nur ist blau, wie alle BarButtonItems. Auch das Plus hat so eine hellblauen Farbe.
Aber hab keine Idee wie ich das ändern kann :? Zitat:
|
AW: UINavigationController mit UIImage und UITapGestureRecognizer
Zitat:
Du kannst das UIBarButtomItem mit einem CustomView initialisieren. ![]() Zitat:
|
AW: UINavigationController mit UIImage und UITapGestureRecognizer
Funktioniert prima :) Vielen Dank!!! :thumb:
|
AW: UINavigationController mit UIImage und UITapGestureRecognizer
Ich war mal wieder zu voreilig. Das Logo wird jetzt zwar als BarButtonItem dargestellt, reagiert beim offenen Menü aber trotzdem nicht :|
Der Button lässt sicht nicht mehr drücken, wenn das View nach rechts geschoben wurde. Vermute aber, dass das eher ein Fehler in der Komponente ist... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:31 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