Ich möchte das Aussehen meiner App anpassen, indem ich anstelle von einfachem Text ein Logo als Titel der Navigationsleiste verwende. Wenn ich diesen Code benutze
let logo = UIImage(named: "logo.png")
self.navigationItem.titleView = logo;
Ich erhalte die Fehlermeldung "UIImage kann nicht in UIView konvertiert werden". Wie kann ich das richtig machen?
UINavigationController.viewDidLoad
(die Klasse, die ich für den Navigationscontroller implementiert habe), aber es funktioniert, wenn ich es hinzufügeViewController
. Aber ich möchte diesen Code getrennt halten (also innerhalb meiner Klasse, die UINavigationController erweitert). Ist es möglich?viewDidLoad
den Ansichts-Controller verwenden, der an den Navigations-Controller gesendet wird, nicht den Navigations-Controller selbst.Ich benutze das. Es funktioniert in iOS 8
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. let image = UIImage(named: "YOURIMAGE") navigationItem.titleView = UIImageView(image: image) }
Und hier ist ein Beispiel, wie Sie es mit CGRect machen können.
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 38, height: 38)) imageView.contentMode = .ScaleAspectFit let image = UIImage(named: "YOURIMAGE") imageView.image = image navigationItem.titleView = imageView }
Hoffe das wird helfen.
quelle
Für Swift 4 und Sie können die Größe der Bildansicht anpassen
let logoContainer = UIView(frame: CGRect(x: 0, y: 0, width: 270, height: 30)) let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 270, height: 30)) imageView.contentMode = .scaleAspectFit let image = UIImage(named: "your_image") imageView.image = image logoContainer.addSubview(imageView) navigationItem.titleView = logoContainer
quelle
Ich habe die Antwort von @ Jack oben ausprobiert. Das Logo wurde angezeigt, das Bild nahm jedoch die gesamte Navigationsleiste ein. Ich wollte, dass es passt.
Swift 4, Xcode 9.2
1. Weisen Sie dem Navigationscontroller UIImage einen Wert zu. Passen Sie die Größe an, indem Sie den Rahmen und die Bildgröße teilen.
func addNavBarImage() { let navController = navigationController! let image = UIImage(named: "logo-signIn6.png") //Your logo url here let imageView = UIImageView(image: image) let bannerWidth = navController.navigationBar.frame.size.width let bannerHeight = navController.navigationBar.frame.size.height let bannerX = bannerWidth / 2 - (image?.size.width)! / 2 let bannerY = bannerHeight / 2 - (image?.size.height)! / 2 imageView.frame = CGRect(x: bannerX, y: bannerY, width: bannerWidth, height: bannerHeight) imageView.contentMode = .scaleAspectFit navigationItem.titleView = imageView }
Fügen Sie die Funktion direkt unter hinzu
viewDidLoad()
addNavBarImage()
Hinweis zum Bildobjekt. Vor dem Hochladen habe ich das Logo mit zusätzlichen Rändern angepasst, anstatt es an den Rändern zu beschneiden.
Endergebnis:
quelle
Sie können ein benutzerdefiniertes UINavigationItem verwenden, sodass Sie nur "Navigationselement" als YourCustomClass auf dem Main.storyboard ändern müssen.
In Swift 3
class FixedImageNavigationItem: UINavigationItem { private let fixedImage : UIImage = UIImage(named: "your-header-logo.png")! private let imageView : UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 37.5)) required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) imageView.contentMode = .scaleAspectFit imageView.image = fixedImage self.titleView = imageView } }
quelle
Das hat bei mir im September 2015 funktioniert - Ich hoffe, das hilft jemandem da draußen.
// 1 var nav = self.navigationController?.navigationBar // 2 set the style nav?.barStyle = UIBarStyle.Black nav?.tintColor = UIColor.yellowColor() // 3 let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 40)) imageView.contentMode = .ScaleAspectFit // 4 let image = UIImage(named: "logo.png") imageView.image = image // 5 navigationItem.titleView = imageView
quelle
navigationItem.titleView = imageView
tunself.navBar.topItem?.titleView = imageView
Es wird hier erklärt:Hier ist eine praktische Funktion für Swift 4.2, die ein Bild mit Titeltext zeigt: -
override func viewDidLoad() { super.viewDidLoad() //Sets the navigation title with text and image self.navigationItem.titleView = navTitleWithImageAndText(titleText: "Dean Stanley", imageName: "online") } func navTitleWithImageAndText(titleText: String, imageName: String) -> UIView { // Creates a new UIView let titleView = UIView() // Creates a new text label let label = UILabel() label.text = titleText label.sizeToFit() label.center = titleView.center label.textAlignment = NSTextAlignment.center // Creates the image view let image = UIImageView() image.image = UIImage(named: imageName) // Maintains the image's aspect ratio: let imageAspect = image.image!.size.width / image.image!.size.height // Sets the image frame so that it's immediately before the text: let imageX = label.frame.origin.x - label.frame.size.height * imageAspect let imageY = label.frame.origin.y let imageWidth = label.frame.size.height * imageAspect let imageHeight = label.frame.size.height image.frame = CGRect(x: imageX, y: imageY, width: imageWidth, height: imageHeight) image.contentMode = UIView.ContentMode.scaleAspectFit // Adds both the label and image view to the titleView titleView.addSubview(label) titleView.addSubview(image) // Sets the titleView frame to fit within the UINavigation Title titleView.sizeToFit() return titleView }
quelle
Swift 5.1, Xcode 11
Manchmal, wenn Ihr Bild in hoher Auflösung ist, verschiebt sich imageView von der Mitte. Ich würde empfehlen, diese Methode zu verwenden
lazy var navigationTitleImageView = UIImageView() override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.setNavigationBar() self.navigationTitleImageView.image = logo self.navigationTitleImageView.contentMode = .scaleAspectFit self.navigationTitleImageView.translatesAutoresizingMaskIntoConstraints = false if let navC = self.navigationController{ navC.navigationBar.addSubview(self.navigationTitleImageView) self.navigationTitleImageView.centerXAnchor.constraint(equalTo: navC.navigationBar.centerXAnchor).isActive = true self.navigationTitleImageView.centerYAnchor.constraint(equalTo: navC.navigationBar.centerYAnchor, constant: 0).isActive = true self.navigationTitleImageView.widthAnchor.constraint(equalTo: navC.navigationBar.widthAnchor, multiplier: 0.2).isActive = true self.navigationTitleImageView.heightAnchor.constraint(equalTo: navC.navigationBar.widthAnchor, multiplier: 0.088).isActive = true } }
und viewWillDisappear ()
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.navigationTitleImageView.removeFromSuperview() }
oder reduzieren Sie einfach die Bildgröße
quelle
Wenn Sie das automatische Layout bevorzugen und ein dauerhaftes festes Bild in der Navigationsleiste wünschen, das nicht bei jedem Bildschirm animiert wird, funktioniert diese Lösung gut:
class CustomTitleNavigationController: UINavigationController { override func viewDidLoad() { super.viewDidLoad() let logo = UIImage(named: "MyHeaderImage") let imageView = UIImageView(image:logo) imageView.contentMode = .scaleAspectFit imageView.translatesAutoresizingMaskIntoConstraints = false navigationBar.addSubview(imageView) navigationBar.addConstraint (navigationBar.leftAnchor.constraint(equalTo: imageView.leftAnchor, constant: 0)) navigationBar.addConstraint (navigationBar.rightAnchor.constraint(equalTo: imageView.rightAnchor, constant: 0)) navigationBar.addConstraint (navigationBar.topAnchor.constraint(equalTo: imageView.topAnchor, constant: 0)) navigationBar.addConstraint (navigationBar.bottomAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 0)) }
quelle
Ich habe dies für iOS 10 und iOS 11 geschrieben und es hat bei mir funktioniert:
extension UINavigationBar { func setupNavigationBar() { let titleImageWidth = frame.size.width * 0.32 let titleImageHeight = frame.size.height * 0.64 var navigationBarIconimageView = UIImageView() if #available(iOS 11.0, *) { navigationBarIconimageView.widthAnchor.constraint(equalToConstant: titleImageWidth).isActive = true navigationBarIconimageView.heightAnchor.constraint(equalToConstant: titleImageHeight).isActive = true } else { navigationBarIconimageView = UIImageView(frame: CGRect(x: 0, y: 0, width: titleImageWidth, height: titleImageHeight)) } navigationBarIconimageView.contentMode = .scaleAspectFit navigationBarIconimageView.image = UIImage(named: "image") topItem?.titleView = navigationBarIconimageView } }
quelle
Lassen Sie uns versuchen, auszuchecken
let image = UIImage(named: "Navbar_bg.png") navigationItem.titleView = UIImageView(image: image) let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 40)) imageView.contentMode = .ScaleAspectFit
quelle
let imageView = UIImageView(frame: (CGRect(x: 0, y: 0, width: 40, height: 40))) imageView.contentMode = .scaleAspectFit let image = UIImage (named: "logo") // logo is your NPG asset imageView.image = image self.navigationItem.titleView = imageView
quelle
Funktioniert für mich in Swift 4 (quadratisches Bild 40x40)
let imageView = UIImageView() imageView.frame.size.width = 40 imageView.frame.size.height = 40 imageView.contentMode = .scaleAspectFit let image = UIImage(named: "YOUR_IMAGE_NAME") imageView.image = image navigationItem.titleView = imageView
Wenn Sie andere Maßnahmen wünschen, versuchen Sie es
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 100.5))) imageView.contentMode = .scaleAspectFit let image = UIImage(named: "YOUR_IMAGE_NAME") imageView.image = image navigationItem.titleView = imageView
Ich hoffe es dient dir. Für mich geht das.
quelle
Programmatisch könnte so gemacht werden.
private var imageView: UIView { let bannerWidth = navigationBar.frame.size.width * 0.5 // 0.5 its multiplier to get correct image width let bannerHeight = navigationBar.frame.size.height let view = UIView() view.backgroundColor = .clear view.frame = CGRect(x: 0, y: 0, width: bannerWidth, height: bannerHeight) let image = UIImage(named: "your_image_name") let imageView = UIImageView(image: image) imageView.contentMode = .scaleAspectFit imageView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height) view.addSubview(imageView) return view }
Das ändert einfach titleView
navigationItem.titleView = imageView
quelle
Objective-C- Version:
//create the space for the image UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 256, 144)]; //bind the image with the ImageView allocated myImage.image = [UIImage imageNamed:@"logo.png"]; //add image into imageview _myNavigationItem.titleView = myImage;
Nur für den Fall, dass jemand (wie ich) hier angekommen ist und nach der Antwort in Ziel-C gesucht hat .
quelle
Das hat bei mir funktioniert ... probier es aus
let image : UIImage = UIImage(named: "LogoName") let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 25, height: 25)) imageView.contentMode = .scaleAspectFit imageView.image = image navigationItem.titleView = imageView
quelle
Um die Bildansicht mit der richtigen Größe und in der Mitte zu erhalten, sollten Sie den folgenden Ansatz verwenden:
let width = 120 // choose the image width let height = 20 // choose the image height let titleView = UIView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 44)) //44 is the standard size of the top bar let imageView = UIImageView(frame: CGRect(x: (view.bounds.width - width)/2, y: (44 - height)/2, width: width, height: height)) imageView.contentMode = .scaleAspectFit //choose other if it makes sense imageView.image = UIImage(named: "your_image_name") titleView.addSubview(imageView) navigationItem.titleView = titleView
quelle