回答:
UIScrollViewのsetContentOffset:animated:
関数を使用して、コンテンツビューの任意の部分にスクロールできます。scrollViewがself.scrollView
次のようであると想定して、下にスクロールするコードをいくつか示します。
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
お役に立てば幸いです。
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
contentSize
未満の場合、正常に動作しませんbounds
。したがって、次のようになります。scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
let bottomOffsetY = max(collectionView.contentSize.height - collectionView.bounds.height + collectionView.contentInset.bottom, 0)
コピーを簡単に貼り付けるための承認済み回答のSwiftバージョン:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
scrollView.setContentOffset(bottomOffset, animated: true)
最も簡単なソリューション:
[scrollview scrollRectToVisible:CGRectMake(scrollview.contentSize.width - 1,scrollview.contentSize.height - 1, 1, 1) animated:YES];
既存の回答を拡張しただけです。
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
下部のインセットも処理します(キーボードが表示されているときにスクロールビューを調整するためにそれを使用している場合)
迅速な実装:
extension UIScrollView {
func scrollToBottom(animated: Bool) {
if self.contentSize.height < self.bounds.size.height { return }
let bottomOffset = CGPoint(x: 0, y: self.contentSize.height - self.bounds.size.height)
self.setContentOffset(bottomOffset, animated: animated)
}
}
これを使って:
yourScrollview.scrollToBottom(animated: true)
コンテンツのオフセットをコンテンツサイズの高さに設定するのは誤りです。コンテンツの下部をスクロールビューの上部にスクロールするため、見えなくなります。
正しい解決策は、次のようにコンテンツの下部をスクロールビューの下部にスクロールすることです(sv
UIScrollViewです)。
CGSize csz = sv.contentSize;
CGSize bsz = sv.bounds.size;
if (sv.contentOffset.y + bsz.height > csz.height) {
[sv setContentOffset:CGPointMake(sv.contentOffset.x,
csz.height - bsz.height)
animated:YES];
}
if (sv.contentOffset.y + csz.height > bsz.height) {
?
setContentOffset:
重要なのはコマンドです。
contentInset
考慮に入れられたSwift 2.2ソリューション
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
これは拡張機能である必要があります
extension UIScrollView {
func scrollToBottom() {
let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom)
setContentOffset(bottomOffset, animated: true)
}
}
bottomOffset.y > 0
スクロールする前に、
contentSize
より低い場合はどうなりbounds
ますか?
Swiftの場合:
scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
トップにスクロールします
- CGPoint topOffset = CGPointMake(0, 0);
- [scrollView setContentOffset:topOffset animated:YES];
下にスクロール
- CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - self.scrollView.bounds.size.height);
- [scrollView setContentOffset:bottomOffset animated:YES];
ここでのすべての回答では、安全な領域が考慮されていなかったようです。iOS 11以降、iPhone Xには安全領域が導入されました。これはscrollViewのに影響を与える可能性がありcontentInset
ます。
iOS 11以降の場合、コンテンツのインセットが含まれている状態で適切に一番下までスクロールします。のadjustedContentInset
代わりに使用する必要がありますcontentInset
。このコードを確認してください:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.adjustedContentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.adjustedContentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
contentOffset.x
):extension UIScrollView {
func scrollsToBottom(animated: Bool) {
let bottomOffset = CGPoint(x: contentOffset.x,
y: contentSize.height - bounds.height + adjustedContentInset.bottom)
setContentOffset(bottomOffset, animated: animated)
}
}
参照:
救助へのカテゴリー!
これを共有ユーティリティのヘッダーのどこかに追加します。
@interface UIScrollView (ScrollToBottom)
- (void)scrollToBottomAnimated:(BOOL)animated;
@end
そして、そのユーティリティ実装に:
@implementation UIScrollView(ScrollToBottom)
- (void)scrollToBottomAnimated:(BOOL)animated
{
CGPoint bottomOffset = CGPointMake(0, self.contentSize.height - self.bounds.size.height);
[self setContentOffset:bottomOffset animated:animated];
}
@end
次に、好きな場所に実装します。例えば:
[[myWebView scrollView] scrollToBottomAnimated:YES];
水平スクロールビューの場合
私のようなHorizontal ScrollViewがあり、それの最後までスクロールしたい場合(私の場合は、最も右側)、受け入れられた回答の一部を変更する必要があります。
Objective-C
CGPoint rightOffset = CGPointMake(self.scrollView.contentSize.width - self.scrollView.bounds.size.width + self.scrollView.contentInset.right, 0 );
[self.scrollView setContentOffset:rightOffset animated:YES];
迅速
let rightOffset: CGPoint = CGPoint(x: self.scrollView.contentSize.width - self.scrollView.bounds.size.width + self.scrollView.contentInset.right, y: 0)
self.scrollView.setContentOffset(rightOffset, animated: true)
どういうわけかscrollView contentSizeを変更する場合(たとえば、scrollView内にあるstackViewに何かを追加する場合)scrollView.layoutIfNeeded()
スクロールする前に呼び出す必要があります。それ以外の場合は何もしません。
例:
scrollView.layoutIfNeeded()
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
if(bottomOffset.y > 0) {
scrollView.setContentOffset(bottomOffset, animated: true)
}
コンテンツの下部が見えるようにするための良い方法は、次の式を使用することです。
contentOffsetY = MIN(0, contentHeight - boundsHeight)
これにより、コンテンツの下端が常にビューの下端以上になるようになります。これMIN(0, ...)
は、ユーザーが目に見えるスナップでスクロールしようとしたときにUITableView
(おそらくUIScrollView
)確実contentOffsetY >= 0
になるためですcontentOffsetY = 0
。これはユーザーにとってかなり奇妙に見えます。
これを実装するコードは次のとおりです。
UIScrollView scrollView = ...;
CGSize contentSize = scrollView.contentSize;
CGSize boundsSize = scrollView.bounds.size;
if (contentSize.height > boundsSize.height)
{
CGPoint contentOffset = scrollView.contentOffset;
contentOffset.y = contentSize.height - boundsSize.height;
[scrollView setContentOffset:contentOffset animated:YES];
}
アニメーションが必要ない場合、これは機能します:
[self.scrollView setContentOffset:CGPointMake(0, CGFLOAT_MAX) animated:NO];
ながらMatt
解決策は私には正しいようだあなたはセット・アップされたものがある場合も、アカウントにコレクションビューのインセットを取る必要があります。
適合コードは次のとおりです。
CGSize csz = sv.contentSize;
CGSize bsz = sv.bounds.size;
NSInteger bottomInset = sv.contentInset.bottom;
if (sv.contentOffset.y + bsz.height + bottomInset > csz.height) {
[sv setContentOffset:CGPointMake(sv.contentOffset.x,
csz.height - bsz.height + bottomInset)
animated:YES];
}
追加後、UITableViewController
で使用しようとしたところ、うまくいきませんでした。枠の外にスクロールして、黒い画面を表示します。self.tableView
(iOS 4.1)
footerView
代替ソリューション:
CGFloat height = self.tableView.contentSize.height;
[self.tableView setTableFooterView: myFooterView];
[self.tableView reloadData];
CGFloat delta = self.tableView.contentSize.height - height;
CGPoint offset = [self.tableView contentOffset];
offset.y += delta;
[self.tableView setContentOffset: offset animated: YES];
CGFloat yOffset = scrollView.contentOffset.y;
CGFloat height = scrollView.frame.size.height;
CGFloat contentHeight = scrollView.contentSize.height;
CGFloat distance = (contentHeight - height) - yOffset;
if(distance < 0)
{
return ;
}
CGPoint offset = scrollView.contentOffset;
offset.y += distance;
[scrollView setContentOffset:offset animated:YES];
contentSize
テキストの実際のサイズを実際には反映していないことがわかったので、下にスクロールしようとすると、少しずれます。実際のコンテンツサイズを決定する最良の方法は、実際にはNSLayoutManager
のusedRectForTextContainer:
メソッドを使用することです。
UITextView *textView;
CGSize textSize = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size;
に実際に表示されるテキストの量を決定するにはUITextView
、フレームの高さからテキストコンテナーのインセットを差し引いて計算します。
UITextView *textView;
UIEdgeInsets textInsets = textView.textContainerInset;
CGFloat textViewHeight = textView.frame.size.height - textInsets.top - textInsets.bottom;
その後、スクロールしやすくなります。
// if you want scroll animation, use contentOffset
UITextView *textView;
textView.contentOffset = CGPointMake(textView.contentOffset.x, textSize - textViewHeight);
// if you don't want scroll animation
CGRect scrollBounds = textView.bounds;
scrollBounds.origin = CGPointMake(textView.contentOffset.x, textSize - textViewHeight);
textView.bounds = scrollBounds;
空のさまざまなサイズの意味を参照するためのいくつかの数値UITextView
。
textView.frame.size = (width=246, height=50)
textSize = (width=10, height=16.701999999999998)
textView.contentSize = (width=246, height=33)
textView.textContainerInset = (top=8, left=0, bottom=8, right=0)
UIScrollViewを拡張して、scrollToBottomメソッドを追加します。
extension UIScrollView {
func scrollToBottom(animated:Bool) {
let offset = self.contentSize.height - self.visibleSize.height
if offset > self.contentOffset.y {
self.setContentOffset(CGPoint(x: 0, y: offset), animated: animated)
}
}
}