- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我做了一些实验来复制(或至少有一个类似的工作示例)airbnb 导航栏。对于那些不知道该应用程序的人,请查看以下屏幕截图:
如您所见,导航栏最初是隐藏的,然后位于图像后面但覆盖了标题标签。我真的很喜欢导航栏平滑过渡到前面的动画。
我想用
实现看起来像:https://github.com/mbecker/AirbnbCopy
import UIKit
private let kTableHeaderHeight: CGFloat = 300.0
private let kTableHeaderCutAway: CGFloat = 60.0
class MainViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet var headerView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var parkHeading: UILabel!
@IBOutlet weak var parkImage: UIImageView!
var headerMaskLayer: CAShapeLayer!
// create background images for the navigation bar
var navBarImage = UIImage().imageWithColor(UIColor(red:0.11, green:0.64, blue:0.98, alpha:0.0))
var gradientImage32 = UIImage().imageWithColor(UIColor(red:0.11, green:0.64, blue:0.98, alpha:0.0))
let image = UIImage(named: "bg-addo")
let overlay: UIView = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.height, 400))
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
// Adjust view
self.automaticallyAdjustsScrollViewInsets = false
// NavigationBar
let attrs = [
NSForegroundColorAttributeName : UIColor.blackColor(),
NSFontAttributeName : UIFont(name: "HelveticaNeue-Bold", size: 17)!
]
self.navigationController!.navigationBar.titleTextAttributes = attrs
self.navigationController!.navigationBar.hidden = true
self.navigationController!.navigationBar.setBackgroundImage(navBarImage, forBarMetrics: .Default)
self.navigationController!.navigationBar.setBackgroundImage(navBarImage, forBarMetrics: .Compact)
// self.navigationController!.navigationBar.shadowImage = UIImage()
self.navigationController!.navigationBar.barStyle = .Default
// Header
overlay.backgroundColor = UIColor(red:0.04, green:0.28, blue:0.44, alpha:0.4)
parkImage.addSubview(overlay)
parkImage.image = image?.imageWithAlpha(1)
headerMaskLayer = CAShapeLayer()
headerMaskLayer.fillColor = UIColor.blackColor().CGColor
headerView.layer.mask = headerMaskLayer
updateHeaderView()
}
func scrollViewDidScroll(scrollView: UIScrollView) {
let heightShowNavBarStart = kTableHeaderHeight - kTableHeaderCutAway - parkHeading.frame.height - 66
let heightShowNavBarEnd = kTableHeaderHeight - kTableHeaderCutAway - 66
print("scrollView.contentOffset.y - \(scrollView.contentOffset.y)")
print("heightShowNavBarStart - \(heightShowNavBarStart)")
print("heightShowNavBarEnd - \(heightShowNavBarEnd)")
let base = parkHeading.frame.height
let counter = heightShowNavBarEnd - scrollView.contentOffset.y
var alpha = counter / base
var navigationBarHidden = false;
if(scrollView.contentOffset.y >= heightShowNavBarStart && scrollView.contentOffset.y <= heightShowNavBarEnd){
} else if (scrollView.contentOffset.y < heightShowNavBarStart ){
navigationBarHidden = true
alpha = 1
} else if(scrollView.contentOffset.y > heightShowNavBarEnd) {
navigationBarHidden = false
alpha = 0
}
print("alpha - \(alpha)")
print("navigationBarHidden - \(navigationBarHidden)")
self.navigationController!.navigationBar.hidden = navigationBarHidden
if(!navigationBarHidden && alpha == 0){
// Show navigationBar && hide headerView parkImage
parkImage.hidden = true
self.navigationController!.navigationBar.setBackgroundImage(nil, forBarMetrics: .Default)
self.navigationController!.navigationBar.setBackgroundImage(nil, forBarMetrics: .Compact)
self.navigationController!.navigationBar.barStyle = .Default
} else {
parkImage.hidden = false
parkImage.image = image?.imageWithAlpha(alpha)
navBarImage = UIImage().imageWithColor(UIColor(red:0.96, green:0.96, blue:0.98, alpha: 1 - alpha))
self.navigationController!.navigationBar.setBackgroundImage(navBarImage, forBarMetrics: .Default)
self.navigationController!.navigationBar.setBackgroundImage(navBarImage, forBarMetrics: .Compact)
overlay.backgroundColor = UIColor(red:0.04, green:0.28, blue:0.44, alpha: alpha * 0.4)
}
}
func updateHeaderView(){
let effectiveHeight = kTableHeaderHeight-kTableHeaderCutAway/2
var headerRect = CGRect(x: 0, y: -effectiveHeight, width: scrollView.bounds.width, height: kTableHeaderHeight)
if scrollView.contentOffset.y < -effectiveHeight {
headerRect.origin.y = scrollView.contentOffset.y
headerRect.size.height = -scrollView.contentOffset.y + kTableHeaderCutAway/2
}
headerView.frame = headerRect
let path = UIBezierPath()
path.moveToPoint(CGPoint(x: 0, y: 0))
path.addLineToPoint(CGPoint(x: headerRect.width, y: 0))
path.addLineToPoint(CGPoint(x: headerRect.width, y: headerRect.height))
path.addLineToPoint(CGPoint(x: 0, y: headerRect.height-kTableHeaderCutAway))
headerMaskLayer?.path = path.CGPath
}
}
extension UIImage {
func imageWithColor(colour: UIColor) -> UIImage {
let rect = CGRectMake(0, 0, 1, 1)
// Create a 1x1 pixel content
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
colour.setFill()
UIRectFill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
func imageWithAlpha(alpha: CGFloat) -> UIImage {
UIGraphicsBeginImageContextWithOptions(size, false, scale)
drawAtPoint(CGPointZero, blendMode: .Normal, alpha: alpha)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}
我认为动画不是很流畅,在某些时候标题图像没有设置回屏幕顶部。
有人知道如何创建这样的导航栏吗?
最佳答案
这正是您想要的,它允许您创建具有灵活高度的标题栏。通常,这种 UI 范例用于隐藏“chrome”并在用户滚动时为更多内容腾出空间。
关于ios - 如何隐藏 navigationBar -> Overlay Label 但作为图像,如 Airbnb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39163431/
我尝试托管 knowledge-repo (airbnb)在heroku上。 我发现了几个问题,例如在尝试初始化 /app 时作为知识库: 我注意到,如果我使用 knowledge_repo --re
我正在尝试设置 Enzyme(由 Airbnb 编写)以便在 React 中运行一些 UI 测试。但是,无论我有什么配置(并且我已经尝试了几种),我都会不断收到此错误。我添加了一个 .babelrc
使用 air bnb 应用程序,如果您点击选项卡菜单上最右侧的图标,它会打开一个用户菜单,该菜单从顶部右侧滑入,但只占屏幕的一半。下面屏幕的其余部分变暗。 如何实现?它是否需要自定义 segue 或
希望有好心人可以帮助我。我没有足够的 google api 和 jquery 知识来实现我所需要的。 我有一个谷歌地图,你可以在这里看到演示 http://divinethemes.eu/map/
Airbnb 最近推出了包含视频标题的新设计。我无法弄清楚他们是如何实现视频标题始终与浏览器窗口保持相同比例,同时视频保持全宽和居中。 因此,无论我的浏览器窗口有多大,我都想要一个 50% 高度的视频
我似乎遇到了 AirBnB linting 悖论。 我有以下行: const pagePromiseGenerator = (graphql, createPage) => (gqlNodeName,
当我运行时( export PKG=eslint-config-airbnb; npm info "$PKG@latest" peerDependencies --json | command sed
我正在尝试获取出现在 Airbnb 中的列表的纬度和经度,我认为该信息位于嵌入式谷歌地图中。当我试图通过使用 lxml 库或 Beautiful Soup 复制完整的 Xpath 来抓取该对象时,我无
我正在尝试创建一个像 Airbnb 这样的搜索字段,您在其中开始输入内容,它会自动完成您输入的内容。我开始使用jQuery Geocomplete但我似乎找不到一种方法来设置 CSS 样式。 任何人都
我一直在使用爱彼迎knowledge repo在本地主机上。问题是我的网络开发经验很少,所以我对如何让它在线运行一无所知,最好是在受密码保护的网站上运行。 到目前为止,我只使用 runserver 查
我正在尝试添加 AirBnB React-dates 。所有功能都正常工作,除了一件事(不打开已选择日期的月份)。 当我分配开始日期和结束日期时,它会选择范围但不显示所选月份。它显示当前月份。 例如:
我正在使用 Ruby on Rails 制作一个网站,引用了 Airbnb,但我发现很难制作以下 URL 结构。 https://www.airbnb.com/help/article/767/wha
我想要像 Airbnb 房间细节布局那样的两层重叠滚动布局 类似 Airbnb 的重叠滚动: 但是我的 XML 布局文件输出以下结果: 这是我的布局代码:
如何airbnb.com当您将鼠标悬停在 Logo 上时实现动画?我认为它使用了 css3,但我无法完全理解它。 最佳答案 你是对的,它使用了 CSS3 动画: @-webkit-keyframes
我正在尝试添加 airbnb-react-date .在我重新打开日期选择器时选择开始日期和结束日期后,日历显示当前月份而不是所选开始日期/结束日期所在的月份。 例如:如果我设置开始日期 = 2017
// bad class Listing extends React.Component { render() { return {this.props.hello}; } } //
我们已经使用 LocalExecutor 为我们的 ETL 设置了 Airbnb/Apache Airflow,并且随着我们开始构建更复杂的 DAG,我们注意到 Airflow 已经开始使用大量的系统
我在用于移动浏览器的 Web React 应用程序中有一个 react-dates 组件。该组件垂直显示月 View 。 组件初始化显示 3 个月。要转到下个月,用户需要单击一个按钮。 目标是实现
我正在尝试使用 epoxy 显示一个简单的 TextView 在回收站 View 中,但它没有出现。我可能做错了什么。 我期待这样的事情 但我得到的是这个 //build.gradle imp
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我是一名优秀的程序员,十分优秀!