UIScrollView内に垂直方向にのみスクロールするコンテンツがいくつかあります。SwiftのUIView(サブビュー)の上にUIScrollViewをプログラムでスクロール
階層のどこかに含まれるビューにプログラムでスクロールしたいと思っています。
UIScrollViewの移動子ビューはUIScrollViewのの上になるように(アニメーションかのどちらか)
UIScrollView内に垂直方向にのみスクロールするコンテンツがいくつかあります。SwiftのUIView(サブビュー)の上にUIScrollViewをプログラムでスクロール
階層のどこかに含まれるビューにプログラムでスクロールしたいと思っています。
UIScrollViewの移動子ビューはUIScrollViewのの上になるように(アニメーションかのどちらか)
ここで私が執筆を終わった拡張です。
使用法:私の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)
}
}
}
scrollView.setContentOffset(CGPoint, animated: Bool)
yはあなたが比較的scrollViewのコンテンツビューにを表示するビューのフレームの座標です。
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];
のようなアニメーションでそれを行いますアニメーション
// 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?() }
})
}
}
これは私の答えです。これは迅速です。これは、スクロールビューのページを無限にスクロールします。
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()
})
}
キーボードが画面上にある場合、これはうまく機能しません。 私が使っているscrollRectToVisibleの代わりに: setContentOffset(CGPoint(x:0、y:childStartPoint.y)、アニメーション:アニメーション) – Nati