在 swift 中下拉 UITableView 时为 TableView 的 headerView 设置动画
Animate headerView of TableView while pulling down UITableView in swift
我正在尝试在 UITableView
上创建一个不断增长的 UITableViewHeader
。我在UITableView的tableHeaderView中设置了一个UITableView和一个mapView。
tblView.bounces = true
tblView.bouncesZoom = true
tblView.alwaysBounceVertical = true
mapView.frame = CGRectMake(0, 0, self.view.frame.size.width, CGFloat(kMapHeaderHeight))
mapView.mapType = MKMapType.Standard
mapView.zoomEnabled=true
mapView.scrollEnabled = true
mapView.delegate = mapHelper
tblView.tableHeaderView = mapView
并且还实现了 scrollViewDidScroll
委托,每当它向下滚动时,我都将 headerview 的框架更改为
func scrollViewDidScroll(scrollView: UIScrollView) {
var scrollOffset = scrollView.contentOffset.y
println("\(scrollOffset)")
var headerFrame : CGRect = self.mapView.frame
if (scrollOffset < 0){
headerFrame.size.height -= scrollView.contentOffset.y/3
}
self.mapView.frame = headerFrame
}
但是,如果没有 bouncing.Seems 非常不清楚,它不会像预期的那样增长。有帮助吗?
我按照这些教程在下拉时创建一个 Growing UITableViewheader
UITableVIew header without bouncing when pull down ,
Expand UITableView Header View to Bounce Area When Pulling Down
这是项目的 link:
https://drive.google.com/file/d/0B6dTvD1JbkgBVENUS1ROMzI0Wnc/vie
已编辑:我以某种方式设法产生了效果,但动画看起来很慢
func scrollViewDidScroll(scrollView: UIScrollView) {
let yPos: CGFloat = -scrollView.contentOffset.y
if (yPos > 0) {
var mapViewRect: CGRect = self.mapView.frame
mapViewRect.origin.y = scrollView.contentOffset.y
mapViewRect.size.height = kHeaderHeight+yPos
self.mapView.frame = mapViewRect
}
}
let kHeaderHeight:CGFloat = 200
我建议你使用 this 教程。
其中最重要的部分:
- 创建一个
scrollView
(或者任何一个UIScrollView
的子类)和一个单独的视图(它将作为一个headerView,所以让我们调用if headerView)
- 将 headerView 和 scrollView 添加为视图的子视图
- 实现
scrollViewDidScroll
方法,并将框架逻辑放在那里(当然,如果你使用autolayout
,你必须在那里管理约束)
实际上动画在 xcode6.3 的模拟器中效果不佳。我为此尝试了 2 天并在这里发布了赏金,但是当我最终在真实设备上测试它并发现 MapView 是正确的 bouncing.If 任何人都需要它..这是逻辑部分。
let kHeaderHeight:CGFloat = 380
class NewBookingVC: UIViewController {
@IBOutlet weak var tblView: UITableView!
let mapView : MKMapView = MKMapView()
var customTableHeaderView:UIView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
tblView.delegate = self
tblView.dataSource = self
mapView.frame = CGRectMake(0, 0, self.view.frame.size.width, 380)
mapView.mapType = MKMapType.Standard
mapView.zoomEnabled=true
mapView.scrollEnabled = true
customTableHeaderView = UIView(frame: CGRectMake(0, 0, self.view.frame.size.width, 380))
customTableHeaderView.addSubview(mapView)
tblView.tableHeaderView = customTableHeaderView
}
func scrollViewDidScroll(scrollView: UIScrollView) {
let yPos: CGFloat = -scrollView.contentOffset.y
if (yPos > 0) {
var mapViewRect: CGRect = self.mapView.frame
mapViewRect.origin.y = scrollView.contentOffset.y
mapViewRect.size.height = kHeaderHeight+yPos
self.mapView.frame = mapViewRect
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
实际上你要做的是为 table 视图实现 scrollview 委托,因为它继承自 scrollview,你可以实现 scrollViewDidScroll
委托,当它向下滚动时,改变 headerview 的框架。
这背后的想法在滚动时你总是必须将 MKMapView
的 y 位置保持在零位置......并且高度应该相应地增加......
func scrollViewDidScroll(scrollView: UIScrollView) {
let yPos: CGFloat = -scrollView.contentOffset.y
if (yPos > 0) {
//adjust your mapview y-pos and height
//adjusting new position is all about real math
}
}
iOS 模拟器中的性能预计不会与设备上的性能相匹配。 iOS 模拟器是一种用于快速原型制作和快速 iteration.In 你的情况的工具,在模拟器中重新绘制 MapView 性能非常慢,因为在每个 Scroll 中你都在计算它的新框架和高度。所以调整新的框架需要一些时间,而且看起来很慢。
然而,它在真实设备上进行调整时效果很好。
我正在尝试在 UITableView
上创建一个不断增长的 UITableViewHeader
。我在UITableView的tableHeaderView中设置了一个UITableView和一个mapView。
tblView.bounces = true
tblView.bouncesZoom = true
tblView.alwaysBounceVertical = true
mapView.frame = CGRectMake(0, 0, self.view.frame.size.width, CGFloat(kMapHeaderHeight))
mapView.mapType = MKMapType.Standard
mapView.zoomEnabled=true
mapView.scrollEnabled = true
mapView.delegate = mapHelper
tblView.tableHeaderView = mapView
并且还实现了 scrollViewDidScroll
委托,每当它向下滚动时,我都将 headerview 的框架更改为
func scrollViewDidScroll(scrollView: UIScrollView) {
var scrollOffset = scrollView.contentOffset.y
println("\(scrollOffset)")
var headerFrame : CGRect = self.mapView.frame
if (scrollOffset < 0){
headerFrame.size.height -= scrollView.contentOffset.y/3
}
self.mapView.frame = headerFrame
}
但是,如果没有 bouncing.Seems 非常不清楚,它不会像预期的那样增长。有帮助吗?
我按照这些教程在下拉时创建一个 Growing UITableViewheader UITableVIew header without bouncing when pull down , Expand UITableView Header View to Bounce Area When Pulling Down
这是项目的 link: https://drive.google.com/file/d/0B6dTvD1JbkgBVENUS1ROMzI0Wnc/vie
已编辑:我以某种方式设法产生了效果,但动画看起来很慢
func scrollViewDidScroll(scrollView: UIScrollView) {
let yPos: CGFloat = -scrollView.contentOffset.y
if (yPos > 0) {
var mapViewRect: CGRect = self.mapView.frame
mapViewRect.origin.y = scrollView.contentOffset.y
mapViewRect.size.height = kHeaderHeight+yPos
self.mapView.frame = mapViewRect
}
}
let kHeaderHeight:CGFloat = 200
我建议你使用 this 教程。
其中最重要的部分:
- 创建一个
scrollView
(或者任何一个UIScrollView
的子类)和一个单独的视图(它将作为一个headerView,所以让我们调用if headerView) - 将 headerView 和 scrollView 添加为视图的子视图
- 实现
scrollViewDidScroll
方法,并将框架逻辑放在那里(当然,如果你使用autolayout
,你必须在那里管理约束)
实际上动画在 xcode6.3 的模拟器中效果不佳。我为此尝试了 2 天并在这里发布了赏金,但是当我最终在真实设备上测试它并发现 MapView 是正确的 bouncing.If 任何人都需要它..这是逻辑部分。
let kHeaderHeight:CGFloat = 380
class NewBookingVC: UIViewController {
@IBOutlet weak var tblView: UITableView!
let mapView : MKMapView = MKMapView()
var customTableHeaderView:UIView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
tblView.delegate = self
tblView.dataSource = self
mapView.frame = CGRectMake(0, 0, self.view.frame.size.width, 380)
mapView.mapType = MKMapType.Standard
mapView.zoomEnabled=true
mapView.scrollEnabled = true
customTableHeaderView = UIView(frame: CGRectMake(0, 0, self.view.frame.size.width, 380))
customTableHeaderView.addSubview(mapView)
tblView.tableHeaderView = customTableHeaderView
}
func scrollViewDidScroll(scrollView: UIScrollView) {
let yPos: CGFloat = -scrollView.contentOffset.y
if (yPos > 0) {
var mapViewRect: CGRect = self.mapView.frame
mapViewRect.origin.y = scrollView.contentOffset.y
mapViewRect.size.height = kHeaderHeight+yPos
self.mapView.frame = mapViewRect
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
实际上你要做的是为 table 视图实现 scrollview 委托,因为它继承自 scrollview,你可以实现 scrollViewDidScroll
委托,当它向下滚动时,改变 headerview 的框架。
这背后的想法在滚动时你总是必须将 MKMapView
的 y 位置保持在零位置......并且高度应该相应地增加......
func scrollViewDidScroll(scrollView: UIScrollView) {
let yPos: CGFloat = -scrollView.contentOffset.y
if (yPos > 0) {
//adjust your mapview y-pos and height
//adjusting new position is all about real math
}
}
iOS 模拟器中的性能预计不会与设备上的性能相匹配。 iOS 模拟器是一种用于快速原型制作和快速 iteration.In 你的情况的工具,在模拟器中重新绘制 MapView 性能非常慢,因为在每个 Scroll 中你都在计算它的新框架和高度。所以调整新的框架需要一些时间,而且看起来很慢。
然而,它在真实设备上进行调整时效果很好。