- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我是 iOS UI 设计的新手,我正在编写显示高度自定义导航栏的代码,我的交通应用程序将使用它。
这是我的导航栏的特点(见下图):
Layout Margins
为 18
, subview 之间的 Space
为 9
。高度
都是44
,所有的UIBarButtonItem
都是矩形。backBarButtonItem
的位置应与 leftBarButtonItem
相同。高度
是80
。titleView
将包含两个UITextField
s,所以它的高度
应该是136
。查看真实设计截图 所以我声明了 UINavigationBar
的子类,并使用 Identity Inspector 将自定义类连接到 Storyboard中的 Navigation Bar
对象。但是,我不确定从哪里开始。虽然我暂时覆盖了 sizeThatFits(_ size:)
函数以使其 height
变长,但 subview 接近底部。我找不到自定义 UINavigationBar
的最佳实践,例如 Google map 、Uber 等。
如何通过子类化 UINavigationBar
来实现这样的导航栏?或者还有其他解决方案吗?
最佳答案
您可以通过以下步骤子类化 UINavigationBar..
添加一个新类(UINavigationBar 的子类),选择您的 ViewController 的 NavigationController。从 Document Outline 中选择 ViewController Navigation Bar。将类(class)设置为您的自定义类(class)。
在您的自定义类中,执行以下操作..
override func sizeThatFits(_ size: CGSize) -> CGSize {
var bound = super.sizeThatFits(size)
bound.height += sizeToAdd //The height you want
return bound
}
override init(frame: CGRect) {
super.init(frame: frame)
self.setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
override func layoutSubviews() {
super.layoutSubviews()
//If you don't override this function and do as follows, you'll
//find that all NavigationButtons and the Title positioned at the
//bottom of your navigation bar.(for the Title, we still need to
//add one line in setup())
let classes = ["UIButton", "UINavigationItemView",
"UINavigationButton"]
for object in self.subviews{
let classOfObject = String(describing: type(of: object))
if classes.contains(classOfObject){
var objectFrame = object.frame
objectFrame.origin.y -= self.sizeToAdd
object.frame = objectFrame
}
}
}
现在在 setup() 中,添加以下代码以根据需要提升标题(通常!)
func setup() -> Void {
self.setTitleVerticalPositionAdjustment(-self.sizeToAdd, for:
.default)
}
现在,您可以根据需要设计一个 View (在这里,我已经使用 XIB 加载了一个自定义 View ,您也可以使用代码来完成。)并在您的 ViewController 中将其作为 subview 添加到您的导航栏.例如,在您的 viewDidLoad..
YOURVIEW.frame = CGRect(x: 0, y: 44, width:
(self.navigationController?.navigationBar.bounds.width)!, height:
(self.navigationController?.navigationBar.bounds.height)! +
self.sizeToAdd)//The height
self.navigationController?.navigationBar.
addSubview(YOURVIEW)
因此,您可以通过这种方式对导航栏进行子类化。但是当你将任何其他 viewController 推到这个 viewController 上时,你会看到(如果你没有将另一个 NavigationController 嵌入到你正在推的 viewController 中) View 也保持在推送的 viewController 中。您可以在推送任何其他 viewController 之前将其从 super View 中删除。仅仅删除它不会提供良好的用户体验,因为其他系统元素(如果有的话)会很好地淡出。因此,请执行以下操作以提供良好的用户体验...
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
if(!(self.navigationController?.navigationBar.subviews.contains
(YOURVIEW))!){ //Either get it working with setting a tag to
//your view and checking it against all subviews
//if you haven't use XIB
self.navigationController?.navigationBar.
addSubview(YOURVIEW)
}else {
UIView.transition(with: YOURVIEW,
duration: 0.5, options: [ANYOPTIONS], animations: {
self.profileNavigationView.alpha = 1.0
}) { (success) in
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
UIView.transition(with: YOURVIEW, duration:
0.5,
options: [ANYOPTIONS], animations: {
self.profileNavigationView.alpha = 0.0
}) { (success) in
//remove it here if you want
}
关于ios - 自定义 UINavigationBar 的外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42265627/
我有一个带有导航栏的 viewController。我想增加导航栏的高度,但我不能。我已经在寻找增加导航栏高度的方法,但没有成功。 是否有任何增加导航栏或任何其他 lib/alternatives 的
是否可以在左侧或右侧放置自定义图像 UIBarButton 项 边缘一个 UINavigationBar?如果按钮的边缘接触 UINavigationBar 的边缘,我创建按钮的方式看起来最好。 最佳
我喜欢将我的 View 创建为独立的 Xib 文件,然后实例化它们并添加为 subview 。 因此,当使用 UINavigationBar 时,我希望能够做同样的事情,首先创建我的自定义 View
我正在创建一个 iOS 7 应用程序,其中我希望在 NavigationBar 下方有一个 SearchBar,我希望它们看起来像一个整体。因此,我需要用相同的颜色(已经完成)为它们着色,并删除 Na
我有一些UIViewControllers,它们都有纯背景颜色。但是,在用户的个人资料上,我想在背景上显示模糊的个人资料图像,因此我需要一个透明的 UINavigationBar。这很好用。我的做法如
更改 UINavigationBar 背景图像并使主 UINavigationBar 缩放到背景图像大小的最简单方法是什么? 我设计了一个导航栏,它不是我的 TableView Controller
我正在创建一个 iOS 7 应用程序,我希望在其中的 NavigationBar 下方有一个 SearchBar,并且我希望它们看起来像一个整体。因此,我需要用相同的颜色(已经完成)给它们着色,并删除
我需要将导航栏设置为自定义颜色,下面的代码将执行此操作: [[UINavigationBar appearance] setBackgroundImage:navigation
我添加了带有背景图片的 UINavigation 栏。 但不幸的是,UINavigation Bar 中间显示了一条不需要的 1px 细线。 我想隐藏那条线,但它不起作用。我添加了以下代码。 self
我有一个简单的应用程序,它是一个 UITableViewController。该应用程序使用自定义主题,将主题应用于背景和 UINavigationBar。从这个角度来看,我有一个 UINavigat
我在我的名为 BaseViewController 的 Superview 中以编程方式添加了 UINavigationBar,它继承了 UIViewController。但是当我尝试为 UINavi
我正在开发一个具有多个嵌套 UIViewController 的应用程序。我有两个 View ,一个是带有 uibarbuttonitem 的 Root View Controller ,连接到另一个
我知道我可以单独更改导航栏的字体,如以下答案所述:Change the navigation bar's font 目前我正在使用更全局的方法: //in my app delegate: [
我正在尝试从 Tinder 重新创建导航行为。为此,我翻译了一个 Framework delivering the NavigationBar进入 Swift 3。 测试应用程序非常简单。我创建了一个
我能否以某种方式使 UINavigationBar 在 iOS 7 和 iOS 8 中看起来像 iOS 6 UINavigationBar(具有蓝色背景颜色等)? 提前致谢。 最佳答案 我很惭愧地承认
在我的iPad应用程序中,我有一个应用程序设置 View 。选项之一允许用户切换界面颜色方案。通过segue将设置 View 加载到与“主”应用程序窗口不同的单独 View Controller 中。
我制作了一个自定义的 UIStoryboardSegue 但当它展开时,它似乎导致我的 UINavigationBar 变黑,然后又恢复到正确的颜色。请参阅下面的 GIF。 我的自定义segue只是让
下面的代码对我不起作用,任何人都可以帮助找出问题所在吗? var image = UIImage(named: "10384605_10152519403846670_5189785375955620
我想更改导航标题的字体和颜色..所以,为此我已经在下面的代码中完成了这个......但它不起作用...... if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@
我对iOS 7有一些奇怪的麻烦。我的应用程序中有一个UINavigationBar,它非常适合iOS 6; - IOS 6 - 但是,当我尝试在iOS 7上运行它时,后退按钮消失了。它在那里,仍在工作
我是一名优秀的程序员,十分优秀!