web-dev-qa-db-ja.com

Swift=

UIScrollViewには、垂直方向にのみスクロールするコンテンツに相当するコンテンツがいくつかあります。

プログラムで階層のどこかに含まれるビューにスクロールしたい。

UIScrollViewは、子ビューがUIScrollViewの上部にあるように移動します(アニメーション化されているかどうかにかかわらず)

29
dyson returns

これが私が書いた拡張機能です。

使用法:

私のviewControllerから呼び出されたself.scrollViewはUIScrollViewへのアウトレットであり、self.commentsHeaderはその内部の下部近くのビューです。

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

コード:

必要なのはscrollToViewメソッドだけですが、scrollToBottom/scrollToTopメソッドも必要になるので、そのままにしておきますが、削除しても構いませんそれら。

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(CGRect(x:0, y:childStartPoint.y,width: 1,height: 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)
        }
    }

}
76
dyson returns
 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];
5
Amr Angry
scrollView.setContentOffset(CGPoint, animated: Bool)

ここで、ポイントのy座標は、表示するビューのフレームのy座標ですscrollViewのコンテンツビューに対して

4
Max Pevsner

私にとっては、scrollViewコンテンツのごく一部に重なっているナビゲーションバーでした。だから私は2つのことを作りました:

  • サイズインスペクター-スクロールビュー-コンテンツインセット->自動からネバーへの変更
  • サイズインスペクター-制約-「上に揃える」(上部の整列の制約)-2番目の項目->Superview.TopからSafe Area.Topへの変更0に設定された値(定数フィールド)

Content insets - NeverAlign ScrolView.Top to Safe Area.Top

2
Vitya Shurapov

これが私の答えです、これはSwiftにあります。これにより、スクロールビューでページが無限にスクロールされます。

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()
})
}
1
Rahul K Rajan

アニメーションの完了時に上下にスクロールする場合

// 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?() }
        })
    }
}
0
YannSteph