UIScroll View를 가져와 맨 위로 스크롤합니다.
UIScroll View를 맨 위로 스크롤하려면 어떻게 해야 합니까?
iOS 7용 업데이트
[self.scrollView setContentOffset:
CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
원래의
[self.scrollView setContentOffset:CGPointZero animated:YES];
또는 수평 스크롤 위치를 유지하고 수직 위치만 재설정하려면 다음과 같이 하십시오.
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
animated:YES];
Swift 확장 기능을 사용하면 다음과 같이 쉽게 사용할 수 있습니다.
extension UIScrollView {
func scrollToTop() {
let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
setContentOffset(desiredOffset, animated: true)
}
}
사용방법:
myScrollView.scrollToTop()
Swift 4의 경우
scrollView.setContentOffset(.zero, animated: true)
iOS 11 이상
새로운 것을 만지작거려 하다adjustedContentInset
(또,prefersLargeTitles
,safe area
등)
예를 들어(맨 위로 스크롤):
var offset = CGPoint(
x: -scrollView.contentInset.left,
y: -scrollView.contentInset.top)
if #available(iOS 11.0, *) {
offset = CGPoint(
x: -scrollView.adjustedContentInset.left,
y: -scrollView.adjustedContentInset.top)
}
scrollView.setContentOffset(offset, animated: true)
사용하다setContentOffset:animated:
[scrollView setContentOffset:CGPointZero animated:YES];
Swift 2.0/3.0/4.0 및 iOS 7+에 대한 답변:
let desiredOffset = CGPoint(x: 0, y: -self.scrollView.contentInset.top)
self.scrollView.setContentOffset(desiredOffset, animated: true)
iOS7에서는 iOS6에서 동작하는 특정 스크롤뷰를 맨 위로 이동시키는 데 문제가 있어 스크롤뷰를 맨 위로 이동시키는 데 사용했습니다.
[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
SWIFT 5에서 내용 오프셋을 0으로 설정합니다.
scrollView.setContentOffset(CGPoint.zero, animated: true)
Swift 3.0.1 버전의 rob mayoff 답변:
self.scrollView.setContentOffset(
CGPoint(x: 0,y: -self.scrollView.contentInset.top),
animated: true)
iOS 11 및 이전 버전(수직 스크롤용)과 완전히 호환되는 답변이 있다고 생각합니다.
여기에는 새로운 adjusted Content가 고려됩니다.기본값이 무엇이든 간에 추가 52px 오프셋이 필요한 것으로 보이는 네비게이션바에서 prefer LargeTitles가 활성화되어 있을 때 필요한 추가 오프셋을 삽입하고 설명합니다.
이것은 조금 까다로웠습니다.왜냐하면 adjusted Content가삽입은 titleBar 상태(큰 제목과 작은 제목)에 따라 달라지기 때문에 titleBar 높이를 확인하고 52px 오프셋이 이미 큰 상태일 경우 적용하지 않아야 했습니다.네비게이션 바의 상태를 체크하는 다른 방법을 찾을 수 없었습니다.그래서 높이가 44.0 이상인지 확인하는 것보다 더 좋은 옵션이 있다면 듣고 싶습니다.
func scrollToTop(_ scrollView: UIScrollView, animated: Bool = true) {
if #available(iOS 11.0, *) {
let expandedBar = (navigationController?.navigationBar.frame.height ?? 64.0 > 44.0)
let largeTitles = (navigationController?.navigationBar.prefersLargeTitles) ?? false
let offset: CGFloat = (largeTitles && !expandedBar) ? 52: 0
scrollView.setContentOffset(CGPoint(x: 0, y: -(scrollView.adjustedContentInset.top + offset)), animated: animated)
} else {
scrollView.setContentOffset(CGPoint(x: 0, y: -scrollView.contentInset.top), animated: animated)
}
}
Jakub의 솔루션에서 영감을 얻은
이는 탐색 막대가 스크롤 보기 컨텐츠의 작은 부분과 겹쳐서 컨텐츠가 위에서부터 시작되지 않는 것처럼 보이는 경우 매우 일반적입니다.수리를 위해 두 가지 작업을 수행했습니다.
- [ Size Inspector ]- [ Scroll View ]- [ Content Insets ]-> [ Automatic ]에서 [Never]로 변경합니다.
- Size Inspector - 구속조건 - "Align Top" (상단 정렬 구속조건)- 두 번째 항목 --> 슈퍼뷰에서 변경.맨 위는 안전 구역입니다.맨 위 및 값(상수 필드)이 0으로 설정됨
상태 표시줄의 스크롤 투 탑 동작을 완전히 복제하려면 contentOffset을 설정해야 할 뿐만 아니라 스크롤인디케이터가 표시되는지 확인해야 합니다.그렇지 않으면 사용자가 빠르게 길을 잃을 수 있습니다.
하기 위한 유일한 은 " " 입니다.flashScrollIndicators
아쉽게도 contentOffset 설정 후 한 번 호출해도 즉시 리셋되므로 효과가 없습니다.할 때 을 알게 .scrollViewDidScroll:
.
// define arbitrary tag number in a global constants or in the .pch file
#define SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG 19291
- (void)scrollContentToTop {
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];
self.scrollView.tag = SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.scrollView.tag = 0;
});
}
UIScrollViewDelegate(또는 UITable/UICollectionViewDelegate)에서 다음을 수행합니다.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
[scrollView flashScrollIndicators];
}
}
숨김 지연은 상태 표시줄 스크롤 ToTop 동작에 비해 조금 짧지만 여전히 양호합니다.
뷰 태그를 사용하여 "isScrollingToTop" 상태를 전달하고 있습니다. 뷰 태그는 뷰 컨트롤러 간에 필요합니다.태그를 다른 용도로 사용하는 경우 iVar 또는 속성으로 대체할 수 있습니다.
뷰의 합니다.adjustedContentInset
:
let point = CGPoint(x: -scrollView.adjustedContentInset.left,
y: -scrollView.adjustedContentInset.top)
scrollView.setContentOffset(point, animated: true)
iOS 16
테이블 및 컬렉션 뷰의 경우 항상 다음 사항이 적용됩니다.
let top = CGRect(x: 0, y: 0, width: 1, height: 1)
tableView.scrollRectToVisible(top, animated: true)
collectionView.scrollRectToVisible(top, animated: true)
스크롤 뷰의 경우:
let top = CGPoint(x: 0, y: -adjustedContentInset.top)
scrollView.setContentOffset(top, animated: animated)
adjustedContentInset
는, 세이프 에리어(있는 경우)에 의해서 적용되는 인스톨과 인스턴스화 후에 적용되는 커스텀인스톨을 반환합니다. custom 중 맨 0이 음이 이.safe custom inset custom inset을 .이 때문에 이 속성을 사용해야 합니다.
다음 시간 동안 맨 위로 스크롤:UITableViewController
,UICollectionViewController
임의의 「」를 참조해 주세요.UIViewController
있다UIScrollView
extension UIViewController {
func scrollToTop(animated: Bool) {
if let tv = self as? UITableViewController {
tv.tableView.setContentOffset(CGPoint.zero, animated: animated)
} else if let cv = self as? UICollectionViewController{
cv.collectionView?.setContentOffset(CGPoint.zero, animated: animated)
} else {
for v in view.subviews {
if let sv = v as? UIScrollView {
sv.setContentOffset(CGPoint.zero, animated: animated)
}
}
}
}
}
iOS 2.0+Mac Catalyst 13.0+
도 한번 해보세요.scrollView.scrollsToTop = true
developer.apple.com 의 메뉴얼로부터 참조할 수 있습니다.
나는 모든 방법을 다 써봤다.하지만 난 아무 것도 안 통했어.드디어 이렇게 했어요.
는 ㅇㅇㅇㅇㅇㅇㅇㅇ다를 넣었습니다.self.view .addSubview(self.scroll)
view Did Load 。스크롤 뷰용 프레임 설정을 시작하고 스크롤 뷰에 컴포넌트를 추가했습니다.
그것은 나에게 효과가 있었다.
넣으세요.self.view .addSubview(self.scroll)
UI 요소를 추가할 수 .UI를 사용합니다.
언급URL : https://stackoverflow.com/questions/9450302/get-uiscrollview-to-scroll-to-the-top
'programing' 카테고리의 다른 글
WPF 드롭섀도 (0) | 2023.04.17 |
---|---|
Git을 사용하여 원격 저장소에 태그를 푸시하려면 어떻게 해야 합니까? (0) | 2023.04.17 |
Swift에서 XIB 파일을 사용하여 커스텀 UIView 클래스를 초기화/인스턴스하는 방법 (0) | 2023.04.17 |
(Excel) 인접 셀 값에 따른 조건부 포맷 (0) | 2023.04.17 |
셸 스크립트 - 변수에서 첫 번째와 마지막 따옴표(")를 제거합니다. (0) | 2023.04.17 |