AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung UINavigationController mit UIImage und UITapGestureRecognizer
Thema durchsuchen
Ansicht
Themen-Optionen

UINavigationController mit UIImage und UITapGestureRecognizer

Ein Thema von Crocotronic · begonnen am 3. Feb 2014 · letzter Beitrag vom 5. Feb 2014
Antwort Antwort
Seite 1 von 2  1 2      
Crocotronic

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

UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 3. Feb 2014, 14:48
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:
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;
Anwendung:
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
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#2

AW: UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 3. Feb 2014, 21:05
Jemand eine Idee, woran das liegt?
Jo.
Auf eine UINavigationBar gehört nicht einfach so ein UIImageView drauf! Sowas kann auch nur FMX

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.

Geändert von jensw_2000 ( 3. Feb 2014 um 22:53 Uhr)
  Mit Zitat antworten Zitat
Crocotronic

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

AW: UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 4. Feb 2014, 17:00
Jemand eine Idee, woran das liegt?
Jo.
Auf eine UINavigationBar gehört nicht einfach so ein UIImageView drauf! Sowas kann auch nur FMX
Die Idee fand ich ganz nett

Nagut, habs mal so gemacht, wie du gesagt hast:
Delphi-Quellcode:
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;
Aber jetzt bekomm ich leider gar kein Bild zusehen
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#4

AW: UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 4. Feb 2014, 18:00
So geht's bei mir. Vielleicht hilft Die das wieder ein bisschen weiter.
Delphi-Quellcode:
  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.
Geht es um Deine PageBased Application?
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

Geändert von jensw_2000 ( 4. Feb 2014 um 18:04 Uhr)
  Mit Zitat antworten Zitat
Crocotronic

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

AW: UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 4. Feb 2014, 20:19
Geht es um Deine PageBased Application?
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".
Genau, es geht um meine PageBased Application.
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:
ViewController.navigationItem.setLeftBarButtonItem(navBarItem); Das funktioniert zumindest für genau diese Seite.
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?
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#6

AW: UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 4. Feb 2014, 20:44
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:
var img:UIImage := UIImage.imageNamed('Gear.png');
rightbutton := UIBarButtonItem.alloc.initWithImage(img) ....
Mal PNG anstatt JPG getestet?

Oder erstmal klein anfangen und einen "+" Button ohne eigene Grafik testen?
Delphi-Quellcode:
var addButtonItem := UIBarButtonItem.alloc.initWithBarButtonSystemItem(UIBarButtonSystemItemAdd)
                                           target(self)
                                           action(SELECTOR(addEventTouchUpInside:));
  Mit Zitat antworten Zitat
Crocotronic

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

AW: UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 4. Feb 2014, 21:04
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
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.
Achso, also soll ich das mit dem Image für jeden einzelnen ViewController machen?
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#8

AW: UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 4. Feb 2014, 21:20
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
Ok, dachte der ganze Button wäre blau ohne Image drauf.
Du kannst das UIBarButtomItem mit einem CustomView initialisieren.
http://stackoverflow.com/questions/1...-colored-image

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.
Achso, also soll ich das mit dem Image für jeden einzelnen ViewController machen?
Sieht so aus, als ob bei Dir jede Seite ihr eigenes NavigationItem hat. Also musst Du deinen Button auch auf jeder Seite initialisieren. Das frisst aber auch kein Brot. 1-2 Millisekunden pro Seite vielleicht...
  Mit Zitat antworten Zitat
Crocotronic

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

AW: UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 4. Feb 2014, 21:53
Funktioniert prima Vielen Dank!!!
  Mit Zitat antworten Zitat
Crocotronic

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

AW: UINavigationController mit UIImage und UITapGestureRecognizer

  Alt 4. Feb 2014, 22:19
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...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz