Ios 如何创建自定义线段顶部选项卡视图控制器?(Swift)
我有一个2段顶标签VC类,感谢在软件的人。 下面是截图 //2段顶部选项卡VCIos 如何创建自定义线段顶部选项卡视图控制器?(Swift),ios,swift,Ios,Swift,我有一个2段顶标签VC类,感谢在软件的人。 下面是截图 //2段顶部选项卡VC class SegmentTabVC: UIViewController { //MARK: - Properties let viewControllers: [UIViewController] init(viewControllers: [UIViewController], nibName nibNameOrNil: String? = nil, bundle n
class SegmentTabVC: UIViewController {
//MARK: - Properties
let viewControllers: [UIViewController]
init(viewControllers: [UIViewController], nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
self.viewControllers = viewControllers
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private let leftButton: UIButton = {
let bt = UIButton()
bt.addTarget(self, action: #selector(switchTabs), for: .touchUpInside)
bt.setAttributedTitle(NSMutableAttributedString(string: "미팅", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).darker(componentDelta: 0.4)]), for: .selected)
bt.setAttributedTitle(NSMutableAttributedString(string: "미팅", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).lighter(componentDelta: 0.4)]), for: .normal)
bt.tag = 0
return bt
}()
private let rightButton: UIButton = {
let bt = UIButton()
bt.addTarget(self, action: #selector(switchTabs), for: .touchUpInside)
bt.setAttributedTitle(NSMutableAttributedString(string: "번개", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).darker(componentDelta: 0.4)]), for: .selected)
bt.setAttributedTitle(NSMutableAttributedString(string: "번개", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).lighter(componentDelta: 0.4)]), for: .normal)
bt.tag = 1
return bt
}()
private let contentView: UIView = {
let view = UIView()
return view
}()
var currentVC: UIViewController?
lazy var bannerTabVC = viewControllers[0]
lazy var gravitySliderTabVC = viewControllers[1]
//MARK: - Life Cycles
override func viewDidLoad() {
super.viewDidLoad()
configureUI()
leftButton.isSelected = true
displayCurrentTab(0)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let currentVC = currentVC {
currentVC.viewWillDisappear(animated)
}
}
//MARK: - Selectors
@objc func switchTabs(_ sender: UIButton) {
self.currentVC!.view.removeFromSuperview()
self.currentVC!.removeFromParent()
switch sender.tag {
case 0:
rightButton.isSelected = false
leftButton.isSelected = true
case 1:
rightButton.isSelected = true
leftButton.isSelected = false
default:
return
}
displayCurrentTab(sender.tag)
}
//MARK: - Helpers
func configureUI() {
view.backgroundColor = .white
let stack = UIStackView(arrangedSubviews: [leftButton, rightButton])
stack.axis = .horizontal
stack.distribution = .fillEqually
view.addSubview(stack)
stack.anchor(top: view.safeAreaLayoutGuide.topAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 50)
view.addSubview(contentView)
contentView.anchor(top: stack.bottomAnchor, left: view.leftAnchor, bottom: view.safeAreaLayoutGuide.bottomAnchor, right: view.rightAnchor)
}
func displayCurrentTab(_ tabIndex: Int){
if let vc = viewControllerForSelectedSegmentIndex(tabIndex) {
self.addChild(vc)
vc.didMove(toParent: self)
vc.view.frame = self.contentView.bounds
self.contentView.addSubview(vc.view)
self.currentVC = vc
}
}
func viewControllerForSelectedSegmentIndex(_ index: Int) -> UIViewController? {
var vc: UIViewController?
switch index {
case 0 :
vc = viewControllers[0]
case 1 :
vc = viewControllers[1]
default:
return nil
}
return vc
}
}
上述代码有效。
现在,我想为N段创建一个自定义段顶部选项卡VC类。
我不习惯自定义类。有人能帮我吗?
下面是我正在努力解决的代码
class Utilities {
func segmentButton(_ title: String, _ tag: Int) -> UIButton {
let bt = UIButton()
bt.setAttributedTitle(NSMutableAttributedString(string: title, attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).darker(componentDelta: 0.4)]), for: .selected)
bt.setAttributedTitle(NSMutableAttributedString(string: title, attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1393318772, green: 0.1493551731, blue: 0.2001486421, alpha: 1).lighter(componentDelta: 0.4)]), for: .normal)
bt.tag = tag
return bt
}
}
class SegmentTabVC: UIViewController {
//MARK: - Properties
let viewControllers: [UIViewController]
let titles: [String]
let buttons: [UIButton]
var currentIndex: Int
init(viewControllers: [UIViewController], titles: [String], nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
self.viewControllers = viewControllers
self.titles = titles
for index in 0 ..< viewControllers.count {
let button = Utilities().segmentButton(titles[index], index)
button.addTarget(self, action: #selector(switchTabs), for: .touchUpInside)
self.buttons.append(button)
}
self.currentIndex = 0
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
...
}
类实用程序{
func segmentButton(u标题:String,uTag:Int)->UIButton{
设bt=UIButton()
bt.setAttributedTitle(NSMutableAttributedString(字符串:标题,属性:[NSAttributedString.Key.font:UIFont.boldSystemFont(ofSize:17),NSAttributedString.Key.foregroundColor:#colorLiteral(红色:0.1393318772,绿色:0.149351731,蓝色:0.2001486421,alpha:1)。颜色更深(组件增量:0.4)],用于:。选定)
bt.setAttributedTitle(NSMutableAttributedString(字符串:标题,属性:[NSAttributedString.Key.font:UIFont.boldSystemFont(大小:17),NSAttributedString.Key.foregroundColor:#colorLiteral(红色:0.1393318772,绿色:0.149351731,蓝色:0.2001486421,alpha:1)。打火机(组件增量:0.4)],用于:。正常)
bt.tag=tag
返回bt
}
}
类SegmentTabVC:UIViewController{
//标记:-属性
让查看控制器:[UIViewController]
让标题:[字符串]
let按钮:[UIButton]
var-currentIndex:Int
init(viewControllers:[UIViewController],titles:[String],nibName-nibNameOrNil:String?=nil,bundle-nibBundleOrNil:bundle?=nil){
self.viewControllers=viewControllers
self.titles=标题
对于0中的索引..
对于将来遇到同样问题的人:
import UIKit
class SegmentTabVC: UIViewController {
//MARK: - Properties
let viewControllers: [UIViewController]
let titles: [String]
init(viewControllers: [UIViewController], titles: [String], nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
self.viewControllers = viewControllers
self.titles = titles
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
var currentIndex: Int = 0
var buttons: [UIButton] = []
var topView: UIView = {
let view = UIView()
view.backgroundColor = #colorLiteral(red: 0.7254901961, green: 0.6705882353, blue: 0.9607843137, alpha: 1)
return view
}()
private let contentView = UIView()
var currentVC: UIViewController?
//MARK: - Life Cycles
override func viewDidLoad() {
super.viewDidLoad()
prepareButtons()
configureUI()
buttons[0].isSelected = true
displayCurrentTab(currentIndex)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let currentVC = currentVC {
currentVC.viewWillDisappear(animated)
}
}
//MARK: - Selectors
@objc func switchTabs(_ sender: UIButton) {
self.currentVC!.view.removeFromSuperview()
self.currentVC!.removeFromParent()
buttons[currentIndex].isSelected = false
buttons[sender.tag].isSelected = true
currentIndex = sender.tag
displayCurrentTab(currentIndex)
}
//MARK: - Helpers
func createButton(_ index: Int) -> UIButton {
let button = Utilities().segmentButton(titles[index], index)
button.addTarget(self, action: #selector(switchTabs), for: .touchUpInside)
return button
}
func prepareButtons() {
for index in 0 ..< viewControllers.count {
buttons.append(createButton(index))
}
}
func configureUI() {
navigationController?.navigationBar.isHidden = true
view.backgroundColor = .white
let safeTopView = UIView()
safeTopView.backgroundColor = #colorLiteral(red: 0.7254901961, green: 0.6705882353, blue: 0.9607843137, alpha: 1)
view.addSubview(safeTopView)
safeTopView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.safeAreaLayoutGuide.topAnchor, right: view.rightAnchor)
view.addSubview(topView)
topView.anchor(top: view.safeAreaLayoutGuide.topAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 56)
let stack = UIStackView(arrangedSubviews: buttons)
stack.axis = .horizontal
stack.distribution = .fillEqually
view.addSubview(stack)
stack.anchor(top: topView.bottomAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 44)
let dividerView = UIView()
dividerView.backgroundColor = .systemGray6
view.addSubview(dividerView)
dividerView.anchor(top: stack.bottomAnchor, left: view.leftAnchor, right: view.rightAnchor, height: 0.75)
view.addSubview(contentView)
contentView.anchor(top: dividerView.bottomAnchor, left: view.leftAnchor, bottom: view.safeAreaLayoutGuide.bottomAnchor, right: view.rightAnchor)
}
func displayCurrentTab(_ tabIndex: Int){
let selectedVC = viewControllers[tabIndex]
self.addChild(selectedVC)
selectedVC.didMove(toParent: self)
selectedVC.view.frame = self.contentView.bounds
self.contentView.addSubview(selectedVC.view)
self.currentVC = selectedVC
}
}
import UIKit
class MeetVC: SegmentTabVC {
//MARK: - Properties
init() {
super.init(viewControllers: [MY_VC_0(), MY_VC_1(), MY_VC_2(), MY_VC_3()], titles: ["MY_TITLE_0", "MY_TITLE_1", "MY_TITLE_2", "MY_TITLE_3"])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//MARK: - Life Cycles
//MARK: - Selectors
//MARK: - Helpers
override func configureUI() {
super.configureUI()
// Whatever..
}
}
导入UIKit
类SegmentTabVC:UIViewController{
//标记:-属性
让查看控制器:[UIViewController]
让标题:[字符串]
init(viewControllers:[UIViewController],titles:[String],nibName-nibNameOrNil:String?=nil,bundle-nibBundleOrNil:bundle?=nil){
self.viewControllers=viewControllers
self.titles=标题
super.init(nibName:nil,bundle:nil)
}
必需初始化?(编码器:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
var currentIndex:Int=0
变量按钮:[UIButton]=[]
变量topView:UIView={
let view=UIView()
view.backgroundColor=#colorLiteral(红色:0.7254901961,绿色:0.6705882353,蓝色:0.9607843137,alpha:1)
返回视图
}()
私有let contentView=UIView()
var currentVC:UIViewController?
//马克:生命周期
重写func viewDidLoad(){
super.viewDidLoad()
准备按钮()
configureUI()
按钮[0]。isSelected=true
显示当前选项卡(当前索引)
}
覆盖函数视图将消失(u动画:Bool){
超级。视图将消失(动画)
如果让currentVC=currentVC{
currentVC.ViewWillEnglish(动画)
}
}
//标记:-选择器
@objc func开关选项卡(\发送方:UIButton){
self.currentVC!.view.removeFromSuperview()
self.currentVC!.removeFromParent()
按钮[currentIndex]。isSelected=false
按钮[sender.tag].isSelected=true
currentIndex=sender.tag
显示当前选项卡(当前索引)
}
//马克:助手
func createButton(u索引:Int)->UIButton{
let button=Utilities().segmentButton(标题[索引],索引)
button.addTarget(self,action:#选择器(开关选项卡),for:.touchUpInside)
返回按钮
}
func prepareButtons(){
对于0中的索引..