UIScrollView에서 스크롤을 프로그래밍 방식으로 강제 중지하려면 어떻게 해야 합니까?
참고: 여기에 제시된 답변은 제게 맞지 않습니다.
UISscrollView(테이블 보기가 아니라 사용자 지정 작업)가 있으며, 사용자가 특정 작업을 수행할 때 뷰 내부의 스크롤(드래그 또는 감속)을 모두 삭제하고 싶습니다.나는 예를 들어 이것을 시도해 보았습니다.
[scrollView scrollRectToVisible:CGRectInset([scrollView bounds], 10, 10) animated:NO];
이론에 따르면, 이미 알려진 직선이 있으면, 스크롤은 원래 있던 자리에서 멈출 것입니다. 하지만 이것은 아무런 효과가 없는 것으로 드러났습니다. 스크롤 뷰는 주어진 직선이 경계에 있다고 보고 아무런 조치도 취하지 않는 것으로 보입니다.현재 볼 수 있는 범위를 벗어나 뷰의 내용 크기 안에 있는 rect를 지정하면 스크롤을 중지할 수 있습니다.이것은 예상대로 전망을 멈추게 하는 것 같습니다.다른 장소로 뛰어내리게 할 뿐만 아니라이 작업을 합리적으로 정상적으로 수행하기 위해 가장자리에서 약간의 장난을 칠 수 있을 것입니다. 하지만 스크롤 뷰를 중지하는 깨끗한 방법을 아는 사람이 있습니까?
감사해요.
당신의 독창적인 해결책을 조금 가지고 놀았는데, 잘 되는 것 같습니다.거의 다 가신 것 같은데, 너무 많이 쓴 정류장을 그냥 상쇄하고 있었고, 정류장을 원래 정류장으로 바로 스크롤할 수 있다는 것을 잊어버린 것 같습니다.
스크롤 동작에 대한 일반화된 솔루션은 다음과 같습니다.
- (void)killScroll
{
CGPoint offset = scrollView.contentOffset;
offset.x -= 1.0;
offset.y -= 1.0;
[scrollView setContentOffset:offset animated:NO];
offset.x += 1.0;
offset.y += 1.0;
[scrollView setContentOffset:offset animated:NO];
}
[편집] iOS 4.3 (그리고 아마도 그 이전) 시점에서 이것 또한 작동하는 것으로 보입니다.
- (void)killScroll
{
CGPoint offset = scrollView.contentOffset;
[scrollView setContentOffset:offset animated:NO];
}
일반적인 대답은 다음과 같습니다.[scrollView setContentOffset:offset animated:NO]
와 같지 않습니다.[scrollView setContentOffset:offset]
!
[scrollView setContentOffset:offset animated:NO]
실행 중인 애니메이션을 실제로 중지합니다.[scrollView setContentOffset:offset]
실행 중인 애니메이션을 중지하지 않습니다.- 마찬가지.
scrollView.contentOffset = offset
중인 실행 중인 애니메이션을 중지하지 않습니다.
이는 어디에도 기록되어 있지 않지만 iOS 6.1 및 iOS 7.1에서 테스트한 것과 같은 동작입니다.
따라서 실행 중인 애니메이션/감속을 중지하는 방법은 다음과 같이 간단합니다.
// Objective-C
[scrollView setContentOffset:scrollView.contentOffset animated:NO];
// Swift
scrollView.setContentOffset(scrollView.contentOffset, animated:false)
기본적으로 데이비드 류가 그의 편집된 답변에서 한 말입니다.하지만 저는 이 두 API가 동일하지 않다는 것을 분명히 하고 싶었습니다.
위의 데이비드 루이의 대답은 저에게는 통하지 않았습니다.이게 제가 한 일입니다.
- (void)killScroll {
self.scrollView.scrollEnabled = NO;
self.scrollView.scrollEnabled = YES;
}
그럴만한 가치가 있어서, 저는 iOS 6.0 아이폰 시뮬레이터를 사용하고 있습니다.
스크롤 뷰 및 기타 모든 관련 하위 클래스에 대해 수행하는 작업입니다.
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
*targetContentOffset = scrollView.contentOffset;
}
이것은 다음을 설정합니다.targetContentOffset
scrollView
의 현재 오프셋이므로 목표에 도달했기 때문에 스크롤을 중지합니다.사용자가 목표를 설정할 수 있도록 하는 것이 목적인 방법을 사용하는 것이 방법은contentOffset
.
스위프트
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
targetContentOffset.pointee = scrollView.contentOffset
}
스크롤을 신속하게 중지합니다.
scrollView.setContentOffset(scrollView.contentOffset, animated: false)
사실...가장 "현대적인" 방법은 -->
scrollview.panGestureRecognizer.enabled = false;
scrollview.panGestureRecognizer.enabled = true;
그러면 현재 터치가 중단되는 순간 스크롤을 담당하는 제스처 인식기가 비활성화됩니다.사용자가 다시 스크롤을 시작하려면 손가락을 들었다 놨다 해야 합니다.
편집: 실제로는 사용자의 현재 드래그를 종료할 뿐 스크롤 뷰가 현재 이 상태일 경우 감속을 즉시 중지하지는 않습니다.이를 위해서는 허용된 답변 편집이 거의 최선의 방법입니다.
[scrollview setContentOffset: scrollview.contentOffset animated:false];
가장 깨끗한 방법은 UIScrollView를 서브클래스하고 자신만의 setContentOffset 메서드를 제공하는 것입니다.이것은 메시지를 전달할 것입니다, 단지 당신이 당신의 컴퓨터를 켜지 않은 경우에만.freeze
부울 속성
이와 같습니다.
BOOL freeze; // and the @property, @synthesize lines..
-(void)setContentOffset:(CGPoint)offset
{
if ( !freeze ) [super setContentOffset:offset];
}
그런 다음 동결하려면:
scrollView.freeze = YES;
UIScrollView 감속 중에 UIScrollView 비활성화라는 답변이 효과적이었습니다.
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
[scrollView setContentOffset:scrollView.contentOffset animated:YES];
}
스크롤 사용자 상호 작용만 비활성화합니다.(swift)
scrollView.isScrollEnabled = false
드래그 후 스크롤 애니메이션 중에는 비활성화합니다.(swift)
var scrollingByVelocity = false
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
if !scrollingByVelocity {
scrollView.setContentOffset(scrollView.contentOffset, animated: false)
}
}
스위프트 5+
Extension을 사용하여
extension UIScrollView {
func stopDecelerating() {
let contentOffset = self.contentOffset
self.setContentOffset(contentOffset, animated: false)
}
}
사용하다
myScrollView.stopDecelerating()
// your stuff
Swift 4.2에서는 이 기능을 사용할 수 있습니다.
func killScroll() {
self.scrollView.isScrollEnabled = false;
self.scrollView.isScrollEnabled = true;
}
... 내선으로:
extension UIScrollView {
func killScroll() {
self.isScrollEnabled = false;
self.isScrollEnabled = true;
}
}
컬렉션 뷰에서 이 메서드를 사용해 보았습니다.
self.collectionView.collectionViewLayout.finalizeCollectionViewUpdates()
스크롤 뷰 내의 특정 UIView가 스와이프 중에 터치의 소스인 경우에만 스크롤을 비활성화하고 싶었습니다.UIView를 UIScrollView 밖으로 이동하려면 상당한 리팩토링이 필요했을 것입니다. 복잡한 뷰 계층 구조를 가지고 있었기 때문입니다.
이를 해결하기 위해 스크롤 방지를 원하는 하위 보기에 UIP PanGesture Recognizer를 하나 추가했습니다.이 Recognizer는 UI PanGesture Recognizer를.cancelsTouchesInView
그러면 UIScrollView의 panGesture가 활성화되지 않습니다.
약간의 '핵'이지만, 아주 쉬운 변화이며, XIB나 스토리보드를 사용하는 경우에는 팬 제스처를 문제의 서브뷰로 끌어오기만 하면 됩니다.
스위프트 5, Xcode 13
예를 들어, 사용자가 내부에 스크롤 뷰와 이미지를 가지고 있고, 사용자가 내부의 프리 스크롤 방지 이미지를 줌하기 시작하면 스크롤 뷰와 컨텐츠 오프셋의 위임 기능을 사용합니다.scrollView.delegate = self를 잊지 마십시오. 전체 코드가 필요한 경우 My code:
private var contentOffsetHolder: CGPoint = CGPoint(x: 0, y: 0)
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
contentOffsetHolder = scrollView.contentOffset
}
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
scrollView.setContentOffset(contentOffsetHolder, animated:false)
}
언급URL : https://stackoverflow.com/questions/3410777/how-can-i-programmatically-force-stop-scrolling-in-a-uiscrollview
'programing' 카테고리의 다른 글
docker- compose mysql 컨테이너에서 워드프레스 컨테이너에 대한 액세스를 거부함 (0) | 2023.10.27 |
---|---|
phpMyAdmin에서 저장 프로시저를 작성하는 방법은? (0) | 2023.10.22 |
MySQL WITH RECURIC을 사용하여 계정의 계층도를 어떻게 수행합니까? (0) | 2023.10.22 |
WebKitFormBoundary는 무엇을 의미합니까? (0) | 2023.10.22 |
그룹화되지 않은 Oracle 결과: (0) | 2023.10.22 |