- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试找到一种向某些 UIViewControllers 添加带有操作的简单 UIButton subview 的好方法。
我认为它可以使用协议(protocol)及其扩展,但扩展 does not allow @objc 方法,这意味着,我无法使用选择器添加目标。
我创建了另一个类来解决这个@objc 问题,但我无法将 View 添加为参数...
我还创建了一个 UIViewController 子类,它运行良好,但我不确定用该子类实现大量 UIViewController 是否是个好主意。
所以问题是,向多个 UIViewController 添加具有操作的 subview 的最佳解决方案是什么?
请看下面我的代码:
public protocol ImplementNewRightIcon {
func setupNewBottomRightMenu()
}
public extension ImplementNewRightIcon where Self: UIViewController {
func setupNewBottomRightMenu() {
let buttonwith: CGFloat = 50
let button: UIButton = {
let btn = UIButton()
btn.setImage(#imageLiteral(resourceName: "icons8-plus-math-50_white"), for: .normal)
btn.backgroundColor = .red
btn.clipsToBounds = true
btn.layer.cornerRadius = buttonwith * 0.5
btn.imageEdgeInsets = UIEdgeInsetsMake(10,10,10,10)
btn.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.25).cgColor
btn.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
btn.layer.shadowOpacity = 0.5
btn.layer.shadowRadius = 0.0
btn.layer.masksToBounds = false
btn.addTarget(SetupMenuLayer.sharedInstance, action: #selector(SetupMenuLayer.showMenuButtonDidTapped(SenderViewController:)), for: .touchUpInside)
return btn;
}()
self.view.addSubview(button)
button.anchor(top: nil, left: nil, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 20, paddingRight: 20, width: buttonwith, height: buttonwith)
}
class SetupMenuLayer: NSObject {
static let sharedInstance = SetupMenuLayer()
@objc func showMenuButtonDidTapped(SenderViewController: UIViewController) {
let bottomMenuView: UIView = {
let view = UIView()
view.backgroundColor = .red
return view
}()
SenderViewController.view.addSubview(bottomMenuView)
bottomMenuView.anchor(top: nil, left: SenderViewController.view.leftAnchor, bottom: SenderViewController.view.bottomAnchor, right: SenderViewController.view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: SenderViewController.view.frame.width, height: SenderViewController.view.frame.height / 3)
}
class ImplementNewRightIconView: UIViewController {
override func viewDidLoad() {
self.setupNewRightIconBtn()
}
func setupNewRightIconBtn() {
let buttonwith: CGFloat = 50
let button: UIButton = {
let btn = UIButton()
btn.setImage(#imageLiteral(resourceName: "icons8-plus-math-50_white"), for: .normal)
btn.backgroundColor = .red
btn.clipsToBounds = true
btn.layer.cornerRadius = buttonwith * 0.5
btn.imageEdgeInsets = UIEdgeInsetsMake(10,10,10,10)
btn.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.25).cgColor
btn.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
btn.layer.shadowOpacity = 0.5
btn.layer.shadowRadius = 0.0
btn.layer.masksToBounds = false
//it works
btn.addTarget(self, action: #selector(showMenuButtonDidTapped), for: .touchUpInside)
return btn;
}()
self.view.addSubview(button)
button.anchor(top: nil, left: nil, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 20, paddingRight: 20, width: buttonwith, height: buttonwith)
}
@objc func showMenuButtonDidTapped() {
let bottomMenuView: UIView = {
let view = UIView()
view.backgroundColor = .red
return view
}()
self.view.addSubview(bottomMenuView)
bottomMenuView.anchor(top: nil, left: self.view.leftAnchor, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: self.view.frame.width, height: self.view.frame.height / 3)
}
最佳答案
您可以对 UIButton 进行扩展并添加具有以下语义的方法:
func addTergetClosure(didTouch: () -> Void)
didTouch
将在 touchUpInside 事件中调用,详情 here你怎么能做到。接下来,您只需要像您一样为 UIViewController 制定一个具有 self 约束的协议(protocol),这会将您的按钮添加为 subview 。我将添加按钮属性作为协议(protocol)部分,因为您可能需要在那些 View Controller 中的某处访问它,而不仅仅是添加将在 touchUpInside 上调用的按钮和闭包。
所以它会是这样的:
protocol MyProtocol {
var button: UIButton { get set }
func setButton()
}
extension MyProtocol where Self: UIViewController {
func setButton() { ... }
}
如果您的按钮在 ViewController 上看起来很相似,那么我建议您将该逻辑分离到带有静态字段的 UIButton 扩展,这将返回带有您需要的样式的 UIButton。在提供的解决方案中,您只需在 ViewController 中设置按钮,如
class MyController: UIViewController, MyProtocol {
var button = UIButton.shadowed
}
extension UIButton {
static let shadowed: UIButton = { ... }
}
关于swift - 添加多个 UIViewControllers subview 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51629518/
我希望能够在代码中布局我的 View Controller ,但可以看到界面构建器中显示的布局。 我知道我可以创建一个 UIView 子类,使其 IBDesignable,并将其分配给 View Co
我有一个父 UIViewController(MainVC)。从那里我有 2 个 segue 到 2 个 UIViewControllers:FirstVC(标识符:goFirstVC)和 Secon
我有一个导航 Controller 。第一个viewcontroller 是FirstViewController 的一种。当我在 FirstViewController 中点击一个按钮时,它会将第二
我有一个自定义的动画 UIViewController 过渡,似乎 iOS 中有一个错误会破坏横向布局。在主要动画方法中,我得到了横向和纵向 View 的混合。 (纵向 View 都是纵向的,所以没问
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我有一个 UIViewController,里面有 UITabBar。我正在尝试模仿 UITabBarController。 My question is how do I set or a UIVi
是否有任何方便的方法来确定是否正在从处于后台模式的应用加载 View ? 在 3.X 中,我将依赖 viewDidLoad 进行一些初始化等操作,但是对于 4.X 而言情况并非如此,因为您不能依赖调用
我将主视图 Controller 作为带有 UICollectionView 的 View Controller ,并且填充了照片。 一旦一个单元格被点击,一个新的 View Controller 被
我有一个简单的 UIViewController(单点触控),在 UI 上有一个按钮。现在,我的用例很简单 - 我想在单击按钮时重新加载 UIViewController。在某些线程上,我读到我只需要
我在它上面有一个 UIViewController 1 UIButton(添加为 subview ),在我按下 Button(见下面的图 1)之后,在它上面添加了另一个 UIViewControlle
尝试为 iPad 制作基于 Storyboard的应用程序。在其中,我需要从开始屏幕 (UIViewController) 过渡到主屏幕 (UISplitViewController),然后再到全屏
我想调整 UIViewController 的大小在 Storyboard中,所以我可以使用它的 UIViewController作为弹出 View 。 在大多数网站上,我可以读到这些操作是: 拖一个
我正在尝试从 XIB 或 Storyboard加载 ViewModel 绑定(bind)的 ViewController(使用 MvvmCross 5.0.6)。我的应用程序的逻辑是,该 View C
我正在构建一个锻炼应用程序。我的 TableViewController 中有一系列练习,每个单元格显示不同的练习。单元格转到 UIViewController。在 UIViewController
我正在尝试从 XIB 或 Storyboard加载 ViewModel 绑定(bind)的 ViewController(使用 MvvmCross 5.0.6)。我的应用程序的逻辑是,该 View C
我有一个 UIViewController,它有一个模式窗口,我想在整个界面上展示它,包括 UITabBar。 我的应用程序层次结构是这样的: UITabBarController (A) ->
我想显示另一个 ViewController 的缩小“预览”在另一个 ViewController .这可能吗?不需要交互,因此它基本上可以是屏幕截图,但按比例缩小。我可以通过手动截屏并将其保存为图像
我正在开发一个应用程序,其中 UIViewController ( firstViewController ) 包含一些 UILabels , 一个 UIButton , 和 UIView ( sub
我的标签栏中有五个标签栏项目。第五项是弹出ViewController。因此,当我单击该按钮时,当前 Controller 中将显示一个弹出窗口。我使用 UIViewController 作为子类来实
我正在开发 iOS 应用程序。 我的应用程序有 6 个按钮,每个按钮都有每个标签栏控件。 so Main screen is [btn1] [btn2] [btn3] [btn4] [btn5] [b
我是一名优秀的程序员,十分优秀!