tableView的动画标题时,在Swift中拉下UitableView时



我正在尝试在UITableView上创建一个增长的UITableViewHeader。我有一个UitableView的tableheaderview中的uitaiteView和一个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
}

但是,如果不弹跳,它不会像预期的那样增长。有帮助吗?

我正在遵循这些教程,以创建一个不断增长的uitableviewheaderuitaiteView标头不弹跳而不会弹跳,拉动时,将UitableView标头视图展开到弹跳区域

这是项目的链接: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

我建议您使用本教程。

其中最重要的部分:

  • 创建scrollView(或UIScrollView的子类)和单独的视图(将作为头听图起作用,所以如果Headerview,请致电)
  • 添加头词和卷轴作为视图的子视图
  • 实现scrollViewDidScroll方法,然后将框架逻辑放在那里(当然,如果您使用的是autolayout,则必须在那里管理约束)

实际上,动画在Xcode6.3的模拟器中效果不佳。我为此尝试了2天,并在这里发布了一个赏金,但是当我最终在真实设备上测试并发现MapView正确弹跳时。

 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.
        }
    }

实际上您要做的就是实现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模拟器是快速原型和快速迭代的工具。在您的情况下,对MapView性能的重绘也很慢,因为在每个滚动下,您都在计算其新框架和高度。因此,需要一些时间调整新框架,并且看起来很慢。

但是,在调整真实设备时它可以很好地工作。

最新更新