【问题标题】:Issue in blocking Vertical scroll on UIScrollView in Swift 4.0在 Swift 4.0 中阻止 UIScrollView 上的垂直滚动的问题
【发布时间】:2018-12-31 09:29:20
【问题描述】:

我的应用中有一个图像轮播,我使用 UIScrollView 来显示里面的图像。一切正常,只是我想知道如何阻止 UIScrollView 中的移动

我正在尝试通过以下方式阻止垂直滚动:

scrollView.showsVerticalScrollIndicator = false
scrollView.contentSize  = CGSize(width: scrollView.contentSize.width, height: 0) //disable vertical

一切都很好,它确实阻挡了垂直滚动

问题是, 我还有一个计时器,可以通过以下方式以编程方式移动UIScrollView

var frame: CGRect = scrollView.frame
frame.origin.x = frame.size.width * CGFloat(pageToMove)
frame.origin.y = -35
scrollView.scrollRectToVisible(frame, animated: true)

一旦我阻止了垂直滚动, scrollReactToVisible 的这个函数没有任何作用。 我没有得到任何错误。

目前有没有办法同时阻止垂直滚动(并允许像往常一样左右滚动)并以编程方式移动滚动视图?

我正在附加我的完整视图控制器:

class CaruselleScreenViewController: UIViewController, CaruselleScreenViewProtocol, UIScrollViewDelegate {

    var myPresenter: CaruselleScreenPresenterProtocol?

    @IBOutlet weak var pageControl: UIPageControl!
    @IBOutlet weak var scrollView: UIScrollView!

    var slides:[CaruselleTipsCard] = [];

    var timer:Timer?
    var currentPageMultiplayer = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        myPresenter = CaruselleScreenPresenter(controller: self)

        //initlizes view
        pageControl.numberOfPages = slides.count
        pageControl.currentPage = 0
        view.bringSubview(toFront: pageControl)

        //delegates
        scrollView.delegate = self

        ////blocks vertical movement
        scrollView.showsVerticalScrollIndicator = false
        //scrollView.contentSize  = CGSize(width: scrollView.contentSize.width, height: 0) //disable vertical
    }

    func scheduleTimer(_ timeInterval: TimeInterval){
        timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(timerCall), userInfo: nil, repeats: false)
    }

    @objc func timerCall(){
        print("Timer executed")

        currentPageMultiplayer = currentPageMultiplayer + 1

        if (currentPageMultiplayer == 5) {
            currentPageMultiplayer = 0
        }
        pageControl.currentPage = currentPageMultiplayer
        scrollToPage(pageToMove: currentPageMultiplayer)

        scheduleTimer(5)
    }

    func scrollToPage(pageToMove: Int) {
        print ("new one")
        var frame: CGRect = scrollView.frame
        frame.origin.x = frame.size.width * CGFloat(pageToMove)
        frame.origin.y = -35
        scrollView.scrollRectToVisible(frame, animated: true)
    }

    func createSlides() -> [CaruselleTipsCard] {

        let slide1:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
        slide1.mainPic.image = UIImage(named: "backlightingIllo")

        //
        let slide2:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
        slide2.mainPic.image = UIImage(named: "comfortableIllo")

        //
        let slide3:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
        slide3.mainPic.image = UIImage(named: "pharmacyIllo")

        //
        let slide4:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
        slide4.mainPic.image = UIImage(named: "batteryIllo")

        //
        let slide5:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
        slide5.mainPic.image = UIImage(named: "wiFiIllo")

        return [slide1, slide2, slide3, slide4, slide5]
    }

    func setupSlideScrollView(slides : [CaruselleTipsCard]) {
        scrollView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)
        scrollView.contentSize = CGSize(width: view.frame.width * CGFloat(slides.count), height: view.frame.height)
        scrollView.isPagingEnabled = true

        for i in 0 ..< slides.count {
            slides[i].frame = CGRect(x: view.frame.width * CGFloat(i), y: 0, width: view.frame.width, height: view.frame.height)
            scrollView.addSubview(slides[i])
        }
    }


    //////

    /*
     * default function called when view is scrolled. In order to enable callback
     * when scrollview is scrolled, the below code needs to be called:
     * slideScrollView.delegate = self or
     */
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let pageIndex = round(scrollView.contentOffset.x/view.frame.width)
        pageControl.currentPage = Int(pageIndex)

        let maximumHorizontalOffset: CGFloat = scrollView.contentSize.width - scrollView.frame.width
        let currentHorizontalOffset: CGFloat = scrollView.contentOffset.x

        // vertical
        let maximumVerticalOffset: CGFloat = scrollView.contentSize.height - scrollView.frame.height
        let currentVerticalOffset: CGFloat = scrollView.contentOffset.y

        let percentageHorizontalOffset: CGFloat = currentHorizontalOffset / maximumHorizontalOffset
        let percentageVerticalOffset: CGFloat = currentVerticalOffset / maximumVerticalOffset


        /*
         * below code changes the background color of view on paging the scrollview
         */
        //        self.scrollView(scrollView, didScrollToPercentageOffset: percentageHorizontalOffset)


        /*
         * below code scales the imageview on paging the scrollview
         */
        let percentOffset: CGPoint = CGPoint(x: percentageHorizontalOffset, y: percentageVerticalOffset)

        if(percentOffset.x > 0 && percentOffset.x <= 0.25) {

            slides[0].mainPic.transform = CGAffineTransform(scaleX: (0.25-percentOffset.x)/0.25, y: (0.25-percentOffset.x)/0.25)
            slides[1].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x/0.25, y: percentOffset.x/0.25)

        } else if(percentOffset.x > 0.25 && percentOffset.x <= 0.50) {
            slides[1].mainPic.transform = CGAffineTransform(scaleX: (0.50-percentOffset.x)/0.25, y: (0.50-percentOffset.x)/0.25)
            slides[2].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x/0.50, y: percentOffset.x/0.50)

        } else if(percentOffset.x > 0.50 && percentOffset.x <= 0.75) {
            slides[2].mainPic.transform = CGAffineTransform(scaleX: (0.75-percentOffset.x)/0.25, y: (0.75-percentOffset.x)/0.25)
            slides[3].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x/0.75, y: percentOffset.x/0.75)

        } else if(percentOffset.x > 0.75 && percentOffset.x <= 1) {
            slides[3].mainPic.transform = CGAffineTransform(scaleX: (1-percentOffset.x)/0.25, y: (1-percentOffset.x)/0.25)
            slides[4].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x, y: percentOffset.x)
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "findingClinitionSugue" {
            let destination = segue.destination as! FirstAvailableSearchViewController
            //destination.consumer = consumer
        }

        if (timer != nil) {
            timer?.invalidate()
        }
    }

    // protocol functions

    func initlizeSlides() {
        slides = createSlides()
        setupSlideScrollView(slides: slides)
    }

    func initlizeTimer() {
        scheduleTimer(5)
    }
}

【问题讨论】:

    标签: swift xcode uiscrollview


    【解决方案1】:

    问题可能是最初将 contentSize 高度值设置为 0,所以即使计时器希望 scrollView 移动,它也不能这样做。

    您可以尝试替换此行吗:

    scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: 0)
    

    与:

    scrollView.contentInsetAdjustmentBehavior = .never
    

    【讨论】:

    • 这个不妨碍垂直移动,我试了一下,还能向上滑动
    【解决方案2】:

    根据滚动视图中所需的应用程序和功能 - 您是否可以禁用滚动视图的用户交互,以便仍然可以通过编程方式移动它?

    那就是

    scrollView.isUserInteractionEnabled = false
    

    这当然取决于您是否需要滚动视图中的项目进行交互

    【讨论】:

    • 这只是阻止一起滑动,我需要的是启用滑动,并且还以编程方式移动,只是垂直被阻止
    • 冒着成为一种变通方法而不是解决方案的风险;您可以尝试在调用计时器时取消阻止垂直移动,然后在以编程方式完成滚动时再次阻止垂直滚动。您可以通过在移除垂直块的同时暂时禁用用户交互(并在以编程方式完成滚动后重新启用)来避免任何不需要的行为
    【解决方案3】:

    也许您可以继承您的 UIScrollView,并覆盖 touchesBegan

    class CustomScrollView: UIScrollView {
    
        var touchesDisabled = false
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            if touchesDisabled {
                // here parse the touches, if they go in the horizontal direction, allow scrolling
                // set tolerance for vertical movement
                let tolerance: CGFloat = 5.0
                let variance = touches.reduce(0, { Yvariation, touch in
                    Yvariation + abs(touch.location(in: view).y - touch.previousLocation(in: view).y)
                })
                if variance <= tolerance * CGFloat(touches.count) {
                    let Xtravelled = touches.reduce(0, { Xstep, touch in
                        Xstep + (touch.location(in: view).x - touch.previousLocation(in: view).x)
                    })
                    // scroll horizontally by the x component of hand gesture
                    var newFrame: CGRect = scrollView.frame
                    newFrame.origin.x += Xtravelled
                    self.scrollRectToVisible(frame, animated: true)
                }
            }
    
            else {
                super.touchesBegan(touches: touches, withEvent: event)
            }
        }
    }
    

    这样,当touchesDisabled 设置为true 时,您可以手动水平移动滚动视图,同时禁用垂直移动。

    【讨论】:

      【解决方案4】:

      如果我很好地理解了你的问题,你可以随时停止滚动

      scrollView.isScrollEnabled = false
      

      【讨论】:

        【解决方案5】:

        使用 UIScrollViewDelegate(或 scrollView 的 contentOffset 上的 KVO),您可以抵消轮播中的任何垂直移动。像这样的:

        var oldYOffset: CGFloat ....
        
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            let deltaY = oldYOffset - scrollView.contentOffset.y
            oldYOffset = scrollView.contentOffset.y
            scrollView.contentOffset.y -= deltaY
        }
        

        此偏移更改对用户不可见。您甚至可以使用它来提高滚动速度、反转滚动(向左平移和向右滚动)或完全锁定 scrollView 的运动而不触摸 isScrollEnabled、contentSize 等。

        【讨论】:

          【解决方案6】:

          结果证明这是一个非常有趣的问题......

          虽然只使用UIScrollViewDelegate 很容易将UIScrollView 滚动锁定到一个轴,但同时以编程方式更改滚动(就像使用Timer 一样)是不可能提供平滑滚动的。

          您会在下面找到我刚刚编写的 DirectionLockingScrollView 类,它应该会让您的事情变得更容易。这是一个UIScrollView,您可以通过编程方式或通过Interface Builder 进行初始化。

          它具有isHorizontalScrollingEnabledisVerticalScrollingEnabled 属性。

          内部运作方式

          它添加了第二个“控件”UIScrollView,它与主 DirectionLockingScrollView 相同,并将所有用于主滚动视图的平移事件传播给它。每次“控制”滚动视图的边界发生变化时,更改都会传播到主滚动视图 xy 被更改(基于 isHorizontalScrollingEnabledisVerticalScrollingEnabled)以禁用在请求的轴上滚动。

          DirectionLockingScrollView.swift

          /// `UIScrollView` subclass that supports disabling scrolling on any direction
          /// while allowing the other direction to be changed programmatically (via
          /// `setContentOffset(_:animated)` or `scrollRectToVisible(_:animated)` or changing the 
          /// bounds etc.
          ///
          /// Can be initialized programmatically or via the Interface Builder.
          class DirectionLockingScrollView: UIScrollView {
              var isHorizontalScrollingEnabled = true
              var isVerticalScrollingEnabled = true
          
              /// The control scrollview is added below the `DirectionLockingScrollView`
              /// and is used to implement all native scrollview behaviours (such as bouncing)
              /// based on user input.
              ///
              /// It is required to be able to change the bounds of the `DirectionLockingScrollView`
              /// while maintaining scrolling in only one direction and allowing for setting the contentOffset
              /// (changing scrolling for any axis - even the disabled ones) programmatically.
              private let _controlScrollView = UIScrollView(frame: .zero)
          
              required init?(coder aDecoder: NSCoder) {
                  super.init(coder: aDecoder)
                  installCustomScrollView()
              }
          
              override init(frame: CGRect) {
                  super.init(frame: frame)
                  installCustomScrollView()
              }
          
              override func layoutSubviews() {
                  super.layoutSubviews()
                  updateCustomScrollViewFrame()
              }
          
              override func didMoveToSuperview() {
                  super.didMoveToSuperview()
                  guard let superview = superview else {
                      _controlScrollView.removeFromSuperview()
                      return
                  }
          
                  superview.insertSubview(_controlScrollView, belowSubview: self)
                  updateCustomScrollViewFrame()
              }
          
              // MARK: - UIEvent propagation
          
              func viewIgnoresEvents(_ view: UIView?) -> Bool {
                  let viewIgnoresEvents =
                      view == nil ||
                      view == self ||
                      !view!.isUserInteractionEnabled ||
                      !(view is UIControl && (view!.gestureRecognizers ?? []).count == 0)
          
                  return viewIgnoresEvents
              }
          
              override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
                  let view = super.hitTest(point, with: event)
                  if viewIgnoresEvents(view) {
                      return _controlScrollView
                  }
          
                  return view
              }
          
              // MARK: - Main scrollview settings propagation to `controlScrollView`
          
              override var contentInset: UIEdgeInsets {
                  didSet {
                      _controlScrollView.contentInset = contentInset
                  }
              }
          
              override var contentScaleFactor: CGFloat {
                  didSet {
                      _controlScrollView.contentScaleFactor = contentScaleFactor
                  }
              }
          
              override var contentSize: CGSize {
                  didSet {
                      _controlScrollView.contentSize = contentSize
                  }
              }
          
              override var bounces: Bool {
                  didSet {
                      _controlScrollView.bounces = bounces
                  }
              }
          
              override var bouncesZoom: Bool {
                  didSet {
                      _controlScrollView.bouncesZoom = bouncesZoom
                  }
              }
          }
          
          extension DirectionLockingScrollView: UIScrollViewDelegate {
              func scrollViewDidScroll(_ scrollView: UIScrollView) {
                  updateBoundsFromCustomScrollView(scrollView)
              }
          }
          
          private extension DirectionLockingScrollView {
              /// Propagates `controlScrollView` bounds to the actual scrollview.
              /// - Parameter scrollView: If the scrollview provided is not the `controlScrollView`
              //                          the main scrollview bounds are not updated.
              func updateBoundsFromCustomScrollView(_ scrollView: UIScrollView) {
                  if scrollView != _controlScrollView {
                      return
                  }
          
                  var newBounds = scrollView.bounds.origin
                  if !isHorizontalScrollingEnabled {
                      newBounds.x = self.contentOffset.x
                  }
          
                  if !isVerticalScrollingEnabled {
                      newBounds.y = self.contentOffset.y
                  }
          
                  bounds.origin = newBounds
              }
          
              func installCustomScrollView() {
                  _controlScrollView.delegate = self
                  _controlScrollView.contentSize = contentSize
                  _controlScrollView.showsVerticalScrollIndicator = false
                  _controlScrollView.showsHorizontalScrollIndicator = false
          
                  // The panGestureRecognizer is removed because pan gestures might be triggered
                  // on subviews of the scrollview which do not ignore touch events (determined
                  // by `viewIgnoresEvents(_ view: UIView?)`). This can happen for example
                  // if you tap and drag on a button inside the scroll view.    
                  removeGestureRecognizer(panGestureRecognizer)
              }
          
              func updateCustomScrollViewFrame() {
                  if _controlScrollView.frame == frame { return }
                  _controlScrollView.frame = frame
              }
          }
          

          用法

          在您的应用中包含上述类后,不要忘记在 .xib.storyboard 中将滚动视图的类更改为 DirectionLockingScrollView .

          然后更新您的代码如下(仅更改了两行,标记为// *****)。

          class CaruselleScreenViewController: UIViewController, CaruselleScreenViewProtocol, UIScrollViewDelegate {
              var myPresenter: CaruselleScreenPresenterProtocol?
          
              @IBOutlet weak var pageControl: UIPageControl! 
              @IBOutlet weak var scrollView: DirectionLockingScrollView! // *****
          
              var slides:[CaruselleTipsCard] = [];
          
          
              var timer:Timer?
              var currentPageMultiplayer = 0
          
              override func viewDidLoad() {
                  super.viewDidLoad()
          
                  myPresenter = CaruselleScreenPresenter(controller: self)
          
                  //initlizes view
                  pageControl.numberOfPages = slides.count
                  pageControl.currentPage = 0
                  view.bringSubview(toFront: pageControl)
          
                  scrollView.isHorizontalScrollingEnabled = false // *****
          
                  //delegates
                  scrollView.delegate = self
          
                  ////blocks vertical movement
                  scrollView.showsVerticalScrollIndicator = false
                  //scrollView.contentSize  = CGSize(width: scrollView.contentSize.width, height: 0) //disable vertical
              }
          
              func scheduleTimer(_ timeInterval: TimeInterval){
                  timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(timerCall), userInfo: nil, repeats: false)
              }
          
              @objc func timerCall(){
                  print("Timer executed")
          
                  currentPageMultiplayer = currentPageMultiplayer + 1
          
                  if (currentPageMultiplayer == 5) {
                      currentPageMultiplayer = 0
                  }
                  pageControl.currentPage = currentPageMultiplayer
                  scrollToPage(pageToMove: currentPageMultiplayer)
          
                  scheduleTimer(5)
              }
          
              func scrollToPage(pageToMove: Int) {
                  print ("new one")
                  var frame: CGRect = scrollView.frame
                  frame.origin.x = frame.size.width * CGFloat(pageToMove)
                  frame.origin.y = -35
                  scrollView.scrollRectToVisible(frame, animated: true)
              }
          
          
              func createSlides() -> [CaruselleTipsCard] {
          
                  let slide1:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
                  slide1.mainPic.image = UIImage(named: "backlightingIllo")
          
                  //
                  let slide2:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
                  slide2.mainPic.image = UIImage(named: "comfortableIllo")
          
                  //
                  let slide3:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
                  slide3.mainPic.image = UIImage(named: "pharmacyIllo")
          
                  //
                  let slide4:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
                  slide4.mainPic.image = UIImage(named: "batteryIllo")
          
                  //
                  let slide5:CaruselleTipsCard = Bundle.main.loadNibNamed("CaruselleTipsCard", owner: self, options: nil)?.first as! CaruselleTipsCard
                  slide5.mainPic.image = UIImage(named: "wiFiIllo")
          
                  return [slide1, slide2, slide3, slide4, slide5]
              }
          
              func setupSlideScrollView(slides : [CaruselleTipsCard]) {
                  scrollView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)
                  scrollView.contentSize = CGSize(width: view.frame.width * CGFloat(slides.count), height: view.frame.height)
                  scrollView.isPagingEnabled = true
          
                  for i in 0 ..< slides.count {
                      slides[i].frame = CGRect(x: view.frame.width * CGFloat(i), y: 0, width: view.frame.width, height: view.frame.height)
                      scrollView.addSubview(slides[i])
                  }
              }
          
          
              //////
          
              /*
               * default function called when view is scrolled. In order to enable callback
               * when scrollview is scrolled, the below code needs to be called:
               * slideScrollView.delegate = self or
               */
              func scrollViewDidScroll(_ scrollView: UIScrollView) {
                  let pageIndex = round(scrollView.contentOffset.x/view.frame.width)
                  pageControl.currentPage = Int(pageIndex)
          
                  let maximumHorizontalOffset: CGFloat = scrollView.contentSize.width - scrollView.frame.width
                  let currentHorizontalOffset: CGFloat = scrollView.contentOffset.x
          
                  // vertical
                  let maximumVerticalOffset: CGFloat = scrollView.contentSize.height - scrollView.frame.height
                  let currentVerticalOffset: CGFloat = scrollView.contentOffset.y
          
                  let percentageHorizontalOffset: CGFloat = currentHorizontalOffset / maximumHorizontalOffset
                  let percentageVerticalOffset: CGFloat = currentVerticalOffset / maximumVerticalOffset
          
          
                  /*
                   * below code changes the background color of view on paging the scrollview
                   */
                  //        self.scrollView(scrollView, didScrollToPercentageOffset: percentageHorizontalOffset)
          
          
                  /*
                   * below code scales the imageview on paging the scrollview
                   */
                  let percentOffset: CGPoint = CGPoint(x: percentageHorizontalOffset, y: percentageVerticalOffset)
          
                  if(percentOffset.x > 0 && percentOffset.x <= 0.25) {
          
                      slides[0].mainPic.transform = CGAffineTransform(scaleX: (0.25-percentOffset.x)/0.25, y: (0.25-percentOffset.x)/0.25)
                      slides[1].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x/0.25, y: percentOffset.x/0.25)
          
                  } else if(percentOffset.x > 0.25 && percentOffset.x <= 0.50) {
                      slides[1].mainPic.transform = CGAffineTransform(scaleX: (0.50-percentOffset.x)/0.25, y: (0.50-percentOffset.x)/0.25)
                      slides[2].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x/0.50, y: percentOffset.x/0.50)
          
                  } else if(percentOffset.x > 0.50 && percentOffset.x <= 0.75) {
                      slides[2].mainPic.transform = CGAffineTransform(scaleX: (0.75-percentOffset.x)/0.25, y: (0.75-percentOffset.x)/0.25)
                      slides[3].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x/0.75, y: percentOffset.x/0.75)
          
                  } else if(percentOffset.x > 0.75 && percentOffset.x <= 1) {
                      slides[3].mainPic.transform = CGAffineTransform(scaleX: (1-percentOffset.x)/0.25, y: (1-percentOffset.x)/0.25)
                      slides[4].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x, y: percentOffset.x)
                  }
              }
          
              override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                  if segue.identifier == "findingClinitionSugue" {
                      let destination = segue.destination as! FirstAvailableSearchViewController
                      //destination.consumer = consumer
                  }
          
                  if (timer != nil) {
                      timer?.invalidate()
                  }
              }
          
              // protocol functions
          
              func initlizeSlides() {
                  slides = createSlides()
                  setupSlideScrollView(slides: slides)
              }
          
              func initlizeTimer() {
                  scheduleTimer(5)
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-03
            相关资源
            最近更新 更多