Ios 自定义标题UIView到所有VC?
我正在尝试为项目中的所有视图控制器创建自定义头文件。下图是一个实际的设计 因此,我尝试使用Xib文件创建自定义视图,如下所示:Ios 自定义标题UIView到所有VC?,ios,uiview,custom-view,swift5,Ios,Uiview,Custom View,Swift5,我正在尝试为项目中的所有视图控制器创建自定义头文件。下图是一个实际的设计 因此,我尝试使用Xib文件创建自定义视图,如下所示: import UIKit class HamburgrView: UIView { override init(frame: CGRect) { // 1. setup any properties here // 2. call super.init(frame:) super.init(frame: fra
import UIKit
class HamburgrView: UIView {
override init(frame: CGRect) {
// 1. setup any properties here
// 2. call super.init(frame:)
super.init(frame: frame)
// 3. Setup view from .xib file
xibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
xibSetup()
}
override open func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
xibSetup()
}
override func layoutSubviews() {
}
func xibSetup() {
let tempView = loadViewFromNib()
// use bounds not frame or it'll be offset
tempView.frame = bounds
// Make the view stretch with containing view
tempView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Adding custom subview on top of our view (over any custom drawing > see note below)
addSubview(tempView)
}
func loadViewFromNib() -> UIView {
let bundle = Bundle(for: type(of:self))
let nib = UINib(nibName: "HamburgrView", bundle: bundle)
// Assumes UIView is top level and only object in CustomView.xib file
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
return view
}
}
我们不知道如何从安全区域布局指南中绘制带有曲线及其起始位置的汉堡菜单图标
我尝试了一个x位置为负-40的视图,并给出了拐角半径,而不是像上图所示的完美曲线
输出看起来不好
MyViewController代码:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let hamView = HamburgrView(frame: .zero)
self.view.addSubview(hamView)
hamView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
hamView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 0),
hamView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0),
hamView.widthAnchor.constraint(equalToConstant: 120),
hamView.heightAnchor.constraint(equalToConstant: 80)
])
}
作为@sandip answer,我的变化如下:
func xibSetup() {
let tempView = loadViewFromNib()
// use bounds not frame or it'll be offset
tempView.frame = bounds
// Make the view stretch with containing view
tempView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Adding custom subview on top of our view (over any custom drawing > see note below)
addSubview(tempView)
let layer = CAShapeLayer()
layer.path = UIBezierPath.init(arcCenter: CGPoint(x: 0, y: self.center.y), radius: 50, startAngle: -1.5708, endAngle: 1.5708, clockwise: true).cgPath
layer.fillColor = UIColor.red.cgColor
self.layer.addSublayer(layer)
}
输出如下所示:
任何想法都将不胜感激。
这是你想要的吗
使用CAShapeLayer
和UIBezierPath
let layer = CAShapeLayer()
layer.path = UIBezierPath.init(arcCenter: CGPoint(x: 0, y: self.view.center.y), radius: 30, startAngle: -1.5708, endAngle: 1.5708, clockwise: true).cgPath
layer.fillColor = UIColor.red.cgColor
view.layer.addSublayer(layer)
在您的代码中,将弧中心更改为x为零,y为汉堡视图的垂直中心,并将其添加到self.view
希望能有帮助
编辑1:
因为OP要求在注释中提供完整的代码来更新答案
class HamburgrView: UIView {
override init(frame: CGRect) {
// 1. setup any properties here
// 2. call super.init(frame:)
super.init(frame: frame)
// 3. Setup view from .xib file
xibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
xibSetup()
}
override open func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
xibSetup()
}
override func layoutSubviews() {
}
func xibSetup() {
let tempView = loadViewFromNib()
// use bounds not frame or it'll be offset
tempView.frame = bounds
// Make the view stretch with containing view
tempView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Adding custom subview on top of our view (over any custom drawing > see note below)
addSubview(tempView)
}
func loadViewFromNib() -> UIView {
let bundle = Bundle(for: type(of:self))
let nib = UINib(nibName: "HamburgrView", bundle: bundle)
// Assumes UIView is top level and only object in CustomView.xib file
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
return view
}
override func didMoveToSuperview() {
super.didMoveToSuperview()
let layer = CAShapeLayer()
layer.path = UIBezierPath.init(arcCenter: CGPoint(x: 0, y: 40), radius: 50, startAngle: -1.5708, endAngle: 1.5708, clockwise: true).cgPath
layer.fillColor = UIColor.red.cgColor
self.layer.addSublayer(layer)
}
}
编辑2:
“汉堡”视野外出现OPs弧的原因是弧中心错误
从self.view.center.y
更改为CGPoint(x:0,y:40)
应该可以解决这个问题。更新代码以反映相同的情况
为什么是40?
因为OP将汉堡包视图的高度设置为80。所以80/2=40
为什么我们不能使用bounds.size.height/2
或self.view.center.y
?
因为在didMoveToSuperview中,OP的约束尚未生效,所以它采用了xib中的高度视图,我认为它不是80,所以它用该值设置了弧中心,但随后您的约束将高度更改为80
以下是最终订单:
您可以使用图像/图标。以编程方式,我尝试了一个x位置为负-40的视图,并给出了拐角半径不符合上述图像的完美曲线。您是在白色曲线中挣扎还是在创建3条水平线?使用菜单图标创建白色曲线?整个过程(菜单按钮、标题标签、配置文件按钮)在UINavigationBar或您有自己的视图/XIB中?我应该在哪里添加此代码控制器文件或汉堡视图文件?签入我的控制器文件代码question@karthikeyan:汉堡包档案。如果在
didMoveToSuperview
willMove(toSuperview
或willMove(toWindow
中调用此函数,以确保在实际调用core graphics APIs之前渲染视图的帧,我在加载xib后使用代码,但输出不正确..什么是开始角度和结束角度Func xibSetup(){let tempView=loadViewFromNib()tempView.frame=bounds tempView.autoresizingMask=[.flexibleWidth.flexibleHeight]addSubview(tempView)let layer=CAShapeLayer()layer.path=UIBezierPath.init(arcCenter:CGPoint(x:0,y:self.center.y),半径:50,星形缠结:-1.5708,端角:1.5708,顺时针:真)。cgPath layer.fillColor=UIColor.red.cgColor self.layer.addSublayer(layer)}@karthikeyan:我告诉过你在didMoveToSuperview
中调用这个函数,而不是在xibsetup中,当你的视图甚至没有渲染时,你的xibsetup在init中被调用,所以它的帧也没有设置,它的方式太早了