Ios 如何在没有导航控制器的情况下返回导航栏按钮
我正在制作一个应用程序,有一个例子,我不想使用导航控制器,我只想使用导航栏。我想要一个后退按钮,但我拿不到,所以有一个宽的V形 如图所示: 与此相反:Ios 如何在没有导航控制器的情况下返回导航栏按钮,ios,swift,back-button,back,Ios,Swift,Back Button,Back,我正在制作一个应用程序,有一个例子,我不想使用导航控制器,我只想使用导航栏。我想要一个后退按钮,但我拿不到,所以有一个宽的V形 如图所示: 与此相反: 如何在没有导航控制器的情况下实现第二种效果?一个选项是将您自己的V形渲染为UIImage,并将其设置为条形按钮的图像 // // ViewController.swift // StackOverflow // // Created by Brandon on 2018-01-07. // Copyright © 2018 XIO.
如何在没有导航控制器的情况下实现第二种效果?一个选项是将您自己的V形渲染为
UIImage
,并将其设置为条形按钮的图像
//
// ViewController.swift
// StackOverflow
//
// Created by Brandon on 2018-01-07.
// Copyright © 2018 XIO. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//Creating a custom navigation bar..
let navigationBar = UINavigationBar()
self.view.addSubview(navigationBar)
NSLayoutConstraint.activate([
navigationBar.leftAnchor.constraint(equalTo: self.view.leftAnchor),
navigationBar.rightAnchor.constraint(equalTo: self.view.rightAnchor),
navigationBar.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor)
])
navigationBar.translatesAutoresizingMaskIntoConstraints = false
//Creating a navigation bar item with title..
let item = UINavigationItem(title: "Custom Navigation")
//Creating the chevron (back-arrow)
//let img = makeBackChevron(size: CGSize(width: 20.0, height: 20.0), colour: nil)! //UIColor.red
//Creating the chevron (back-arrow) to look like Apple's..
let img = makeBackChevron(thickness: 3.0, size: CGSize(width: 22.0, height: 44.0), colour: nil)! //UIColor.red
//Creating the bar button.. Note: Add your own target and action..
let barButton = UIBarButtonItem(image: img, style: .done, target: nil, action: nil)
//Set the left bar button item to be the one we created
//Then set the items to be part of the navigation bar we created..
item.leftBarButtonItems = [barButton]
navigationBar.setItems([item], animated: true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//Creates a chevron (back-arrow) image with size and colour..
func makeBackChevron(size: CGSize, colour: UIColor? = nil) -> UIImage? {
//Create a rendering context..
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
let ctx = UIGraphicsGetCurrentContext()
//Create a chevron path with normalized 2D coordinates..
let path = UIBezierPath()
path.move(to: CGPoint(x: 1.0, y: 0.0)) //top right..
path.addLine(to: CGPoint(x: 0.75, y: 0.0)) //top left..
path.addLine(to: CGPoint(x: 0.0, y: 0.5)) //left center of pointy arrow head..
path.addLine(to: CGPoint(x: 0.75, y: 1.0)) //bottom left..
path.addLine(to: CGPoint(x: 1.0, y: 1.0)) //bottom right..
path.addLine(to: CGPoint(x: 0.25, y: 0.5)) //right center of pointy arrow head..
path.close()
//Scale the path to be the size specified..
path.apply(CGAffineTransform(scaleX: size.width, y: size.height))
//Set rendering colour..
if let colour = colour {
ctx?.setFillColor(colour.cgColor)
}
//Draw the path to the image context..
ctx?.addPath(path.cgPath)
ctx?.fillPath()
//Create the image from the context..
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
//If a colour was set, then always render the image with that colour.. else allow navigation bar or any view to `tint` the image..
return colour != nil ? img?.withRenderingMode(.alwaysOriginal) : img
}
//Closer to the Apple chevron.. Allows you to specify arrow-thickness..
func makeBackChevron(thickness: CGFloat, size: CGSize, colour: UIColor? = nil) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
let ctx = UIGraphicsGetCurrentContext()
//Create a thin-line chevron with some left-padding..
let padding: CGFloat = 0.20
let path = UIBezierPath()
path.move(to: CGPoint(x: padding + 0.5, y: 0.773))
path.addLine(to: CGPoint(x: padding + 0.0, y: 0.5))
path.addLine(to: CGPoint(x: padding + 0.5, y: 0.227))
path.apply(CGAffineTransform(scaleX: size.width, y: size.height))
//Use a stroke instead of a fill like previous algorithm..
ctx?.setStrokeColor(colour?.cgColor ?? UIColor.white.cgColor)
ctx?.addPath(path.cgPath)
ctx?.setLineWidth(thickness) //Set arrow-thickness..
ctx?.setLineJoin(.round) //Set line-join to round corners..
ctx?.strokePath()
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return colour != nil ? img?.withRenderingMode(.alwaysOriginal) : img
}
}
注:我将文本的绘制作为练习留给读者;)
结果:
为什么不能使用NavigationController?这感觉很不舒服。如果你点击“背”,会发生什么?应该有流行动画,看,是的,正如@rmaddy所说,或者你为它创建自己的图像。当然,如果没有UINavigationController,您还需要自己提供所有的后台功能。如果您也提供一些代码,那就太好了。为什么我需要提供代码?编辑:添加了一个创建V形的新算法,因此它看起来更接近OP文章中的算法。。(与苹果非常相似)。。如果要更改V形方向,可以应用另一个旋转变换或取消缩放。它不是“完美”的,也不像苹果那样“完全”匹配,但它已经足够接近了!我不能在数字和计算上花费更多的时间。对于那些正在寻找带标题的后退按钮的人(基于此解决方案):
让img=makeBackChevron(厚度:3.0,尺寸:CGSize(宽度:22.0,高度:44.0),颜色:nil)!让backButton=UIButton(类型:。自定义)backButton.setImage(img,用于:。正常)backButton.setTitle(“Back”,用于:。正常)backButton.sizeToFit()backButton.addTarget(self,action:#选择器(self.backButtonClick),用于:。touchUpInside)self.navigationItem.leftBarButtonItems=[UIBarButtonItem(customView:backButton)]