我在 Playgound 中实现了导航栏下方的分段控件。
这似乎是一个经典问题,曾经有人问过:
在 的文档中UIBarPositioningDelegate
,它说,
UINavigationBarDelegate、UISearchBarDelegate 和 UIToolbarDelegate 协议扩展了此协议以允许在屏幕上定位这些栏。
在UIBarPosition的文档中:
案例顶部
指定栏位于其包含视图的顶部。
在UIToolbar.delegate的文档中:
当工具栏由导航控制器管理时,您可能不会设置委托。默认值为无。
我目前的解决方案如下(保留注释掉的代码以供参考和方便):
import UIKit
import PlaygroundSupport
class ViewController : UIViewController, UIToolbarDelegate
{
let toolbar : UIToolbar = {
let ret = UIToolbar()
let segmented = UISegmentedControl(items: ["Good", "Bad"])
let barItem = UIBarButtonItem(customView: segmented)
ret.setItems([barItem], animated: false)
return ret
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(toolbar)
// toolbar.delegate = self
}
override func viewDidLayoutSubviews() {
toolbar.frame = CGRect(
x: 0,
y: navigationController?.navigationBar.frame.height ?? 0,
width: navigationController?.navigationBar.frame.width ?? 0,
height: 44
)
}
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
}
//class Toolbar : UIToolbar {
// override var barPosition: UIBarPosition {
// return .topAttached
// }
//}
let vc = ViewController()
vc.title = "Try"
vc.view.backgroundColor = .red
// Another way to add toolbar...
// let segmented = UISegmentedControl(items: ["Good", "Bad"])
// let barItem = UIBarButtonItem(customView: segmented)
// vc.toolbarItems = [barItem]
// Navigation Controller
let navVC = UINavigationController(navigationBarClass: UINavigationBar.self, toolbarClass: UIToolbar.self)
navVC.pushViewController(vc, animated: true)
navVC.preferredContentSize = CGSize(width: 375, height: 640)
// navVC.isToolbarHidden = false
// Page setup
PlaygroundPage.current.liveView = navVC
PlaygroundPage.current.needsIndefiniteExecution = true
如您所见,这不使用UIToolbarDelegate
.
UIToolbarDelegate
在这种情况下, (提供)如何position(for:)
发挥作用?由于我们总是可以定位自己(手动或使用自动布局),所以 a 的用例是UIToolbarDelegate
什么?
@Leo Natan 在上面第一个问题链接中的回答提到了UIToolbarDelegate
,但似乎工具栏放置在 Interface Builder 中。
此外,如果我们不使用UIToolbarDelegate
here,为什么不使用 plainUIView
而不是 aUIToolbar
呢?