Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在没有导航控制器的情况下返回导航栏按钮_Ios_Swift_Back Button_Back - Fatal编程技术网

Ios 如何在没有导航控制器的情况下返回导航栏按钮

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形

如图所示:

与此相反:


如何在没有导航控制器的情况下实现第二种效果?

一个选项是将您自己的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)]