2016-05-16 14 views
0

wie diese möchte ich meine Anwendung verhalten Zentrierung:zwei Ansichten in Navigation Titleview

enter image description here

Es ist wichtig, das genaue Verhalten für meine NavigationItem.titleView zu haben

ich diese Schritte befolgt so weit:

Ich erstelle drei Ansichten programmgesteuert in meiner Anwendung:

(1) container => hält (2) und (3) => hat eine GestureRecognizer angebracht

let container = UIView(frame: CGRectMake(0,0,200,40)) 

(2) imageContainer => hat ein Bild

 let imageContainer = UIImageView(frame: CGRectMake(0, 0, 30, 30)) 
     imageContainer.image = UIImage(named: "mock.jpg") 

(3) textContainer = > hat einen Text

 let textContainer = UILabel(frame: CGRectMake(0,0, 180, 20)) 
     textContainer.text = "Group xY" 

nach ich in der Mitte der Bilder setze sie ausrichten:

imageContainer.center = CGPointMake(container.frame.size.width/2, 
     container.frame.size.height/2) 
textContainer.center = CGPointMake(container.frame.size.width/2, 
      container.frame.size.height/2) 

Jetzt bin Hinzufügen ich alle Subviews meiner Ansicht und

self.navigationItem.titleView = (1) 

die App zeigt Starteinstellung, dass die Elemente des Titleview nicht richtig

enter image description here

ausgerichtet

Gibt es eine Möglichkeit, dieses genaue Verhalten korrekt zu implementieren?

Hinweis: mach dir keine Sorgen über das kreisförmige Bild. Ich weiß, wie man das umsetzt.

Antwort

1

Sie sollten die Größe von textContainer näher an den Grenzen des Textes festlegen. Sie können dies tun, indem Sie sizeToFit aufrufen, dann müssen Sie den imageContainer auf der linken Seite des Textes festlegen, so dass die Mitte des Bildes die halbe Breite des Bildes plus einen Puffer vom Anfang des Textes sein sollte. Sie könnten das tun, indem Sie imageContainer.center = CGPointMake(textContainer.frame.minX - imageContainer.frame.size.width * 0.5 - buffer,container.frame.size.height/2) sagen. Der Code sollte ungefähr so ​​aussehen:

let container = UIView(frame: CGRectMake(0,0,200,40)) 
let buffer:CGFloat = 8.0 
let maxWidth:CGFloat = 120.0 

let imageContainer = UIImageView(frame: CGRectMake(0, 0, 30, 30)) 
imageContainer.image = UIImage(named: "profile.jpg") 

let textContainer = UILabel(frame: CGRectMake(0,0, 180, 20)) 
textContainer.text = "Group xY" 
textContainer.adjustsFontSizeToFitWidth = true 
textContainer.minimumScaleFactor = 0.95 

textContainer.sizeToFit() 
textContainer.frame.size.width = min(maxWidth, textContainer.frame.size.width) 
textContainer.center = CGPointMake(container.frame.size.width/2, 
            container.frame.size.height/2) 
imageContainer.center = CGPointMake(textContainer.frame.minX - imageContainer.frame.size.width * 0.5 - buffer, 
            container.frame.size.height/2) 

container.addSubview(imageContainer) 
container.addSubview(textContainer) 

Welche Sie enter image description here für Ihren Behälter geben.

+0

Danke. Das hilft sehr. Gibt es eine Möglichkeit, eine maximale Breite der Ansicht festzulegen? wenn ich einen längeren Text darin lege, ist die ganze Navbar bevölkert, aber ich möchte auch meine Navigationbar.barButtonitems haben – JVS

+1

Ich aktualisierte meine Antwort. Sie können einfach die Breite des Etiketts nach 'sizeToFit' überprüfen, wenn es größer ist als die größte Breite, die Sie auf die maximale Breite setzen möchten, ansonsten lassen Sie es unverändert (zB' min (maxWidth, textContainer.frame.size.width) 'Sie können auch Passen Sie den Beschriftungsskalierungsfaktor so an, dass der Shrink passt, obwohl Sie ihn wahrscheinlich nicht um einen Titel verkleinern möchten. – beyowulf