- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试为嵌入在 UINavigationController
中的详细信息 UITableViewController
的标题更改设置动画。
这两个关于堆栈溢出的问答似乎最相关......
我尝试了许多代码变体,主要是根据 Ashley Mills answer 和其他人的回答,但基本上我似乎无法使动画工作!
请注意使用 Xcode 10.2 在 Swift 5 中编写。
我正在使用 Master-Detail UITableViewController
设置来管理列表和该列表中项目的详细信息。
我正在使用大标题...
navigationController?.navigationBar.prefersLargeTitles = true
...和一个搜索 Controller ...
navigationItem.searchController = <<mySearchController>>
navigationItem.hidesSearchBarWhenScrolling = false
definesPresentationContext = true
...所有设置都在主视图 Controller 的 viewDidLoad()
方法中。
这是我所做的。
在我的项目中:
导入 QuartzCore 框架,根据 Jack Bellis 的评论“您需要通过 [project]>[target]>Build Phases>Link Binaries>QuartzCore.framework 添加 QuartzCore 框架。”;
在主视图 Controller 中:
导入QuartzCore
;
在细节 View Controller 中:
在 viewDidAppear(_ animated: Bool)
方法中,编写类似于上述 OP 答案的 CATransition
代码(这会更改 Large Title ,但没有动画)。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let animationTransition = CATransition()
animationTransition.duration = 2.0
animationTransition.type = CATransitionType.push
animationTransition.subtype = CATransitionSubtype.fromTop
navigationController!.navigationBar.layer.add(animationTransition, forKey: "pushText")
navigationItem.title = <<NEW TITLE TEXT>>
}
在 viewDidAppear(_ animated: Bool)
方法中,编写上述 OP 答案中建议的 CATransition
代码的替代方案(仅添加一个单独的标题到导航栏的中心并且不会改变大标题)。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let animationTransition = CATransition()
animationTransition.duration = 2.0
animationTransition.type = CATransitionType.fade
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 44))
label.text = <<NEW TITLE TEXT>>
navigationItem.titleView = label
navigationItem.titleView!.layer.add(animationTransition, forKey: "fadeText")
}
我也试过包括 CAMediaTimingFunction
...
animationTransition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
我也试过调用 setNeedsLayout
和 setNeedsDisplay
...
navigationItem.titleView?.setNeedsLayout()
navigationController?.navigationBar.setNeedsDisplay()
为清楚起见:
viewDidAppear(_ animated:)
方法中,因为我想让用户看到转换;UITableView
/Controller
和 UINavigationController
设置,看看我是否可以错过了什么。有什么建议吗?
最佳答案
所以我已经解决了。
我必须在 UINavigationBar
的 subview 中找到包含标题文本的特定层,然后为该层设置动画。结果正是我想要的。
这是我的答案(Swift 5 iOS 12)...
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if (newTitle ?? "").isEmpty == false { // only proceed with a valid value for newTitle.
// CATransition code
let titleAnimation = CATransition()
titleAnimation.duration = 0.5
titleAnimation.type = CATransitionType.push
titleAnimation.subtype = CATransitionSubtype.fromRight
titleAnimation.timingFunction = CAMediaTimingFunction.init(name: CAMediaTimingFunctionName.easeInEaseOut)
// this is a detail view controller, so we must grab the reference
// to the parent view controller's navigation controller
// then cycle through until we find the title labels.
if let subviews = parent?.navigationController?.navigationBar.subviews {
for navigationItem in subviews {
for itemSubView in navigationItem.subviews {
if let largeLabel = itemSubView as? UILabel {
largeLabel.layer.add(titleAnimation, forKey: "changeTitle")
}
}
}
}
// finally set the title
navigationItem.title = newTitle
}
注意:不需要 import QuartzCore
。
...这是我确定必须更改的内容的过程...
这个 SO Q&A How to set multi line Large title in navigation bar? ( New feature of iOS 11) 帮助我确定了下面详述的过程,因此特别感谢原始帖子和@Krunal 的 answer。
使用相同的代码循环遍历 UINavigationBar
的 subview (如上所述),我使用打印到终端来识别各种 UINavigationItem
及其 subview 。
counter = 0
if let subviews = parent?.navigationController?.navigationBar.subviews {
for navigationItem in subviews {
print("____\(navigationItem)")
for itemSubView in navigationItem.subviews {
counter += 1
print("_______\(itemSubView)")
}
}
}
print("COUNTER: \(counter)")
此代码在终端中产生了以下打印结果(对于在模拟器中运行 iOS 12.2 的 iPhone 8 Plus)...
____<_UIBarBackground: 0x7f922740c000; frame = (0 -20; 414 116); userInteractionEnabled = NO; layer = <CALayer: 0x6000026ce1c0>>
_______<UIImageView: 0x7f922740c9c0; frame = (0 116; 414 0.333333); userInteractionEnabled = NO; layer = <CALayer: 0x6000026ce7c0>>
_______<UIVisualEffectView: 0x7f922740cbf0; frame = (0 0; 414 116); layer = <CALayer: 0x6000026ce880>>
____<_UINavigationBarLargeTitleView: 0x7f922740f390; frame = (0 44; 414 52); clipsToBounds = YES; layer = <CALayer: 0x6000026cd840>>
_______<UILabel: 0x7f9227499fe0; frame = (20.1667 3.66667; 206.333 40.6667); text = 'Event Details'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x6000005bf250>>
____<_UINavigationBarContentView: 0x7f922740d660; frame = (0 0; 414 44); clipsToBounds = YES; layer = <CALayer: 0x6000026cea00>>
_______<_UIButtonBarStackView: 0x7f92274984a0; frame = (302 0; 100 44); layer = <CALayer: 0x60000261cc60>>
_______<_UIButtonBarButton: 0x7f922749a5c0; frame = (0 0; 82.3333 44); layer = <CALayer: 0x60000261ee60>>
_______<UILabel: 0x7f922749a2d0; frame = (155 11.6667; 104.333 20.3333); text = 'Event Details'; alpha = 0; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x6000005bfc50>>
____<_UINavigationBarModernPromptView: 0x7f9227602db0; frame = (0 0; 0 50); alpha = 0; hidden = YES; layer = <CALayer: 0x6000026e4600>>
COUNTER: 2
我实际上应用了动画两次 - UILabel
内的 layer
_UINavigationBarLargeTitleView
和 UILabel
内的 layer
_UINavigationBarContentView
。然而,这似乎并不重要,因为当大标题首次出现时,内容 View 中的标签(我假设是当大标题从屏幕上滚动时导航栏中的“旧式”标题)隐藏在 viewDidAppear
.
顺便说一句,如果你加入以下两行,你也会有多行大标题:
largeLabel.numberOfLines = 0
largeLabel.lineBreakMode = .byWordWrapping
但是,我还没有想出如何为大标题框的尺寸增加设置动画,所以立即更改为两行或更多行,恕我直言会破坏标题更改的动画。
尚未在设备上进行测试,但对于 iPhone 和 iPad sims 似乎都可以正常工作。
如果您发现任何错误,请告诉我,我会更新我的答案。
关于swift - 动画更改导航 Controller 中的标题文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55919318/
SO亲爱的 friend 们: 2014 年 3 月 18 日。我正在处理一种情况,在使用 ng-repeat 时,数组内的元素(我从 Json 字符串中获取)更改了原始顺序。 需要明确的是,数组中的
有很多问题询问如何在 JavaScript 单击处理程序中更改 div 的类,例如,此处:Change Div style onclick .我理解得很好(只需更改 .className),并且它有效
我从access导入了一个数据库到mysql,但其中一个表的列名“股数”带有空格,但我尝试更改、替换甚至删除列名,但失败了。任何人都可以帮助解决这一问题 String UpdateQuary = "U
我正在做一个随机的学校元素。 目前,我有一个包含两个 CSS 的页面。一种用于正常 View ,一种用于残障人士 View 。 此页面还包括两个按钮,它们将更改使用的样式表。 function c
我需要使用 javascript 更改 HTML 元素中的文本,但我不知道该怎么做。 ¿有什么帮助吗? 我把它定义成这样: Text I want to change. 我正在尝试这样做: docum
我在它自己的文件 nav_bar.shtml 中有一个主导航栏,每个其他页面都包含该导航栏。这个菜单栏是一个 jQuery 菜单栏(ApyCom 是销售这些导航栏的公司的名称)。导航栏上的元素如何确定
我正在摆弄我的代码,并开始想知道这个变化是否来自: if(array[index] == 0) 对此: if(!array[index] != 0) 可能会影响任何代码,或者它只是做同样的事情而我不需
我一直在想办法调整控制台窗口的大小。这是我正在使用的函数的代码: #include #include #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd;
我有很多情况会导致相同的消息框警报。 有没有比做几个 if 语句更简单/更好的解决方案? PRODUCTS BOX1 BOX2 BOX3
我有一个包含这些元素的 XELEMENT B Bob Petier 19310227 1 我想像这样转换前缀。 B Bob Pet
我使用 MySQL 5.6 遇到了这种情况: 此查询有效并返回预期结果: select * from some_table where a = 'b' and metadata->>"$.countr
我想知道是否有人知道可以检测 R 中日期列格式的任何中断的包或函数,即检测日期向量格式更改的位置,例如: 11/2/90 12/2/90 . . . 15/Feb/1990 16/Feb/1990 .
我希望能够在小部件显示后更改 GtkButton 的标签 char *ButtonStance == "Connect"; GtkWidget *EntryButton = gtk_button_ne
我正在使用 Altera DE2 FPGA 开发板并尝试使用 SD 卡端口和音频线路输出。我正在使用 VHDL 和 C 进行编程,但由于缺乏经验/知识,我在 C 部分遇到了困难。 目前,我可以从 SD
注意到这个链接后: http://www.newscientist.com/blogs/nstv/2010/12/best-videos-of-2010-progress-bar-illusion.h
我想知道在某些情况下,即使剧本任务已成功执行并且 ok=2,ansible 也会显示“changed=0”。使用 Rest API 和 uri 模块时会发生这种情况。我试图找到解释但没有成功。谁能告诉
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: add buttons to push notification alert 是否可以在远程通知显示的警报框中指定有
当您的 TabBarController 中有超过 5 个 View Controller 时,系统会自动为您设置一个“更多” View 。是否可以更改此 View 中导航栏的颜色以匹配我正在使用的颜
如何更改.AndroidStudioBeta文件夹的位置,默认情况下,该文件夹位于Windows中的\ .. \ User \ .AndroidStudioBeta,而不会破坏任何内容? /编辑: 找
我目前正在尝试将更具功能性的编程风格应用于涉及低级(基于 LWJGL)GUI 开发的项目。显然,在这种情况下,需要携带很多状态,这在当前版本中是可变的。我的目标是最终拥有一个完全不可变的状态,以避免状
我是一名优秀的程序员,十分优秀!