ios - 如何使用 Swift 从 UITabBarController 的子类触发动作
问题描述
我在我的 iOS 应用程序上创建了一个 UITabBarController 的子类,因为我想在标签栏上添加一个中间的“+”按钮。我使用下面的代码添加了这个额外的按钮:
class XGTabBarViewController: UITabBarController {
let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 70, height: 70))
private let optionMenu = UIAlertController(title: nil, message: "New", preferredStyle: .actionSheet)
override func viewDidLoad() {
super.viewDidLoad()
let action1 = UIAlertAction(title: "Action 1", style: .default)
let action2 = UIAlertAction(title: "Action 2", style: .default)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
optionMenu.addAction(action1)
optionMenu.addAction(action2)
optionMenu.addAction(cancelAction)
var menuButtonFrame = menuButton.frame
let iconConfig = UIImage.SymbolConfiguration(pointSize: 24, weight: .medium, scale: .medium)
let iconImage = UIImage(systemName: "plus", withConfiguration: iconConfig)
let icon = UIImageView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
icon.image = iconImage
icon.tintColor = UIColor.white
menuButtonFrame.origin.y = view.bounds.height - menuButtonFrame.height - 50
menuButtonFrame.origin.x = view.bounds.width/2 - menuButtonFrame.size.width/2
menuButton.frame = menuButtonFrame
menuButton.backgroundColor = UIColor(named: "LinkBlue")
menuButton.layer.cornerRadius = menuButtonFrame.height/2
menuButton.layer.shadowColor = UIColor.black.cgColor
menuButton.layer.shadowRadius = 3
menuButton.layer.shadowOpacity = 0.3
menuButton.layer.shadowOffset = CGSize(width: 0, height: 3)
menuButton.addSubview(icon)
icon.translatesAutoresizingMaskIntoConstraints = false
icon.widthAnchor.constraint(equalToConstant: 30).isActive = true
icon.heightAnchor.constraint(equalToConstant: 30).isActive = true
icon.centerXAnchor.constraint(equalTo: menuButton.centerXAnchor).isActive = true
icon.centerYAnchor.constraint(equalTo: menuButton.centerYAnchor).isActive = true
view.addSubview(menuButton)
menuButton.addTarget(self, action: #selector(menuButtonAction(sender:)), for: .touchUpInside)
view.layoutIfNeeded()
}
@objc private func menuButtonAction(sender: UIButton) {
self.present(optionMenu, animated: true, completion: nil)
}
我通过 IB 设置标签栏控制器。这就是它的样子
那么,我想知道是否应该在此类中定义菜单按钮操作?还是有更好的(最佳实践)方法来做到这一点?
如您所见,我尝试添加一个在点击按钮时将显示的操作表。但是我遇到了一些布局错误。我想知道我是否在正确的位置添加了此代码。
我收到以下错误:
谢谢!
解决方案
请添加标签栏控制器和三个视图控制器连接到标签栏。中心视图控制器标签栏 iteam 设置图像插图。
没有布局错误。
import UIKit
class TabBarVC: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
let tabBar = self.tabBar
(tabBar.items![0] ).selectedImage = UIImage(named:"icn_audio_icon")?.withRenderingMode(.alwaysOriginal)
(tabBar.items![1] ).selectedImage = UIImage(named:"icn_home_active")?.withRenderingMode(.alwaysOriginal)
tabBar.items![2].image = UIImage(named:"icn_categary")?.withRenderingMode(.alwaysOriginal)
tabBar.items![0].image = UIImage(named:"icn_audio_icon")?.withRenderingMode(.alwaysOriginal)
tabBar.items![1].image = UIImage(named:"icn_home")?.withRenderingMode(.alwaysOriginal)
tabBar.items![2].image = UIImage(named:"icn_categary")?.withRenderingMode(.alwaysOriginal)
self.tabBarController?.selectedIndex = 1
tabBar.layer.shadowColor = UIColor.red.cgColor
tabBar.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
tabBar.layer.shadowRadius = 5
tabBar.layer.shadowOpacity = 0.6
tabBar.layer.masksToBounds = false
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tabBar.invalidateIntrinsicContentSize()
}
}
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if viewController.isKind(of: ActionViewController.self) {
let vc = ActionViewController()
vc.modalPresentationStyle = .overFullScreen
self.present(vc, animated: true, completion: nil)
return false
}
return true
}
推荐阅读
- openlayers - 我想要制作 ol.js 文件。如何制作全包ol.js?
- sql - 如何删除 SQL 文件中的特殊字符
- macos - 在 macOS 上安装 netfilterqueue 时出现错误代码(退出代码 1)
- vim - 无法重新映射
在 vim 正常模式下 - camera - 使用 uvc-gadget 和 g_webcam 闪烁和失败的视频流
- angular - 无法以模板驱动的形式选中或未选中复选框(角度 7)
- java - 如何检查文本字段数组中的值是否不包含字母
- excel - 当表相关(连接)时选择要“计数”的表列?
- android - 如何解决itext image get instance network on main thread问题?
- dragula - Dragula 禁用拖动以重新排序