2016-08-18 10 views

答えて

37

ここで私が執筆を終わった拡張です。

使用法:私のViewControllerから呼び出され

、self.scrollViewは底部近く、UIScrollViewのとself.commentsHeaderへの出口はそれ内のビューです:

self.scrollView.scrollToView(self.commentsHeader, animated: true) 

コード:

scrollToViewメソッドが必要ですが、に残ってくださいscrollToBottom/scrollToTopメソッドもあまりにも必要になりますが、削除してもかまいません。ポイントのy座標

extension UIScrollView { 

    // Scroll to a specific view so that it's top is at the top our scrollview 
    func scrollToView(view:UIView, animated: Bool) { 
     if let origin = view.superview { 
      // Get the Y position of your child view 
      let childStartPoint = origin.convertPoint(view.frame.origin, toView: self) 
      // Scroll to a rectangle starting at the Y of your subview, with a height of the scrollview 
      self.scrollRectToVisible(CGRectMake(0, childStartPoint.y, 1, self.frame.height), animated: animated) 
     } 
    } 

    // Bonus: Scroll to top 
    func scrollToTop(animated: Bool) { 
     let topOffset = CGPoint(x: 0, y: -contentInset.top) 
     setContentOffset(topOffset, animated: animated) 
    } 

    // Bonus: Scroll to bottom 
    func scrollToBottom() { 
     let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom) 
     if(bottomOffset.y > 0) { 
      setContentOffset(bottomOffset, animated: true) 
     } 
    } 

} 
+9

キーボードが画面上にある場合、これはうまく機能しません。 私が使っているscrollRectToVisibleの代わりに: setContentOffset(CGPoint(x:0、y:childStartPoint.y)、アニメーション:アニメーション) – Nati

2
scrollView.setContentOffset(CGPoint, animated: Bool) 

yはあなたが比較的scrollViewのコンテンツビューにを表示するビューのフレームの座標です。

4
scrollView.scrollRectToVisible(CGRect(x: x, y: y, width: 1, height: 
1), animated: true) 

または

scrollView.setContentOffset(CGPoint(x: x, y: y), animated: true) 

もう一つの方法は、

scrollView.contentOffset = CGPointMake(x,y); 

であると私は完了して上へスクロールまたは下の場合、この

[UIView animateWithDuration:2.0f delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ 
scrollView.contentOffset = CGPointMake(x, y); } 
completion:NULL]; 
0

のようなアニメーションでそれを行いますアニメーション

// MARK: - UIScrollView extensions 

extension UIScrollView { 
    /// Animate scroll to bottom with completion 
    /// 
    /// - Parameters: 
    /// - duration: TimeInterval 
    /// - completion: Completion block 
    func animateScrollToBottom(withDuration duration: TimeInterval, 
          completion:    (()->())? = nil) { 

     UIView.animate(withDuration: duration, animations: { [weak self] in 
      self?.setContentOffset(CGPoint.zero, animated: false) 
      }, completion: { finish in 
       if finish { completion?() } 
     }) 
    } 

    /// Animate scroll to top with completion 
    /// 
    /// - Parameters: 
    /// - duration: TimeInterval 
    /// - completion: Completion block 
    func animateScrollToBottomTop(withDuration duration: TimeInterval, 
            completion:    (()->())? = nil) { 
     UIView.animate(withDuration: duration, animations: { [weak self] in 
      guard let `self` = self else { 
       return 
      } 
      let desiredOffset = CGPoint(x: 0, y: -self.contentInset.top) 
      self.setContentOffset(desiredOffset, animated: false) 

      }, completion: { finish in 
       if finish { completion?() } 
     }) 
    } 
} 
1

これは私の答えです。これは迅速です。これは、スクロールビューのページを無限にスクロールします。

private func startBannerSlideShow() 
{ 
UIView.animate(withDuration: 6, delay: 0.1, options: .allowUserInteraction, animations: { 
    scrollviewOutlt.contentOffset.x = (scrollviewOutlt.contentOffset.x == scrollviewOutlt.bounds.width*2) ? 0 : scrollviewOutlt.contentOffset.x+scrollviewOutlt.bounds.width 
}, completion: { (status) in 
    self.startBannerSlideShow() 
}) 
} 
関連する問題