UIScrollView
コード内で一番下までスクロールするにはどうすればよいですか? または、より一般的な方法で、サブビューの任意のポイントに?
30 に答える
UIScrollView のsetContentOffset:animated:
関数を使用して、コンテンツ ビューの任意の部分にスクロールできます。scrollView が であると仮定して、下にスクロールするコードを次に示しますself.scrollView
。
目的 C:
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
迅速:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
それが役立つことを願っています!
簡単にコピーして貼り付けるための受け入れられた回答の迅速なバージョン:
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];
下部のインセットも処理します (キーボードが表示されているときにスクロール ビューを調整するためにそれを使用している場合)。
コンテンツ オフセットをコンテンツ サイズの高さに設定するのは正しくありません。コンテンツの下部がスクロール ビューの上部にスクロールされるため、見えなくなります。
正しい解決策は、次のように、コンテンツの下部をスクロール ビューの下部にスクロールすることです (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];
}
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];
UITableview (UIScrollView のサブクラス) を使用している場合に、これを行う別の便利な方法も見つけました。
[(UITableView *)self.view scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
UIScrollView のsetContentOffset:animated:
関数を使用して、Swift で一番下までスクロールします。
let bottomOffset : CGPoint = CGPointMake(0, scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
(オプション)footerView
とを使用するとcontentInset
、解決策は次のようになります。
CGPoint bottomOffset = CGPointMake(0, _tableView.contentSize.height - tableView.frame.size.height + _tableView.contentInset.bottom);
if (bottomOffset.y > 0) [_tableView setContentOffset: bottomOffset animated: YES];
何らかの方法で 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)
}
迅速:
次のような拡張機能を使用できます。
extension UIScrollView {
func scrollsToBottom(animated: Bool) {
let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height)
setContentOffset(bottomOffset, animated: animated)
}
}
使用する:
scrollView.scrollsToBottom(animated: true)
救助へのカテゴリー!
これを共有ユーティリティヘッダーのどこかに追加します。
@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];
valdyr、これがお役に立てば幸いです:
CGPoint bottomOffset = CGPointMake(0, [textView contentSize].height - textView.frame.size.height);
if (bottomOffset.y > 0)
[textView setContentOffset: bottomOffset animated: YES];
解決策は私には正しいように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];
}
コンテンツの下部が表示されるようにする良い方法は、次の式を使用することです。
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];
を追加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];
テキストの実際のサイズを実際には反映していないことがわかったcontentSize
ので、一番下までスクロールしようとすると、少しずれます。実際のコンテンツ サイズを決定する最善の方法は、実際にはNSLayoutManager
'susedRectForTextContainer:
メソッドを使用することです。
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)
下端までスクロールするには、ターゲット ビューの最大高さを操作する必要があります。
import UIKit
extension UIScrollView {
func scrollToBottomOf(targetView: UIView, animated: Bool) {
setContentOffset(CGPoint(x:targetView.frame.minX, y:targetView.frame.maxY), animated: animated)
}
}
//func invocation example
optionScrollView.scrollToBottomOf(targetView: self.optionsStackView, animated: false)
UICollectionView
コピーと貼り付けを容易にするための受け入れられた回答のXamarin.iOSバージョン
var bottomOffset = new CGPoint (0, CollectionView.ContentSize.Height - CollectionView.Frame.Size.Height + CollectionView.ContentInset.Bottom);
CollectionView.SetContentOffset (bottomOffset, false);