UIScrollView에서 프로그래밍 방식으로 스크롤을 강제 중지해야합니까?
참고 : 여기에 대답 은 저에게 적합하지 않습니다.
UIScrollView (테이블 뷰가 아니라 사용자 지정 항목)는 사용자가 특정 작업을 수행 할 때 뷰 내에서 스크롤 (끌기 또는 감속)을 종료하고 싶습니다. 예를 들어 다음과 같이 시도했습니다.
[scrollView scrollRectToVisible:CGRectInset([scrollView bounds], 10, 10) animated:NO];
이미 보이는 rect가 주어지면 스크롤은 그 위치에서 멈출 것이지만 이것이 효과가 있습니다. 조치 없음. 내가 할 수 확실히하는 RECT 주면, 스크롤을 얻을 정지 수 밖에 현재 눈에 보이는 경계를하지만,보기의 contentSize 내부. 이로 인해 예상대로보기가 중단되는 것 같지만 다른 위치로 이동합니다. 나는 아마 여백에서 약간의 놀랍게 놀랍게 작동하도록 할 수 있다고 합리적으로 작동하도록 할 수 있습니다.
감사합니다.
나는 당신의 해결책을 조금 가지고 놀았고 이것이 잘 작동하는 것입니다. 나는 거의 가지고있는 것이 생각하지만, 많이 사용되는 rect를 의미하고 rect를 원래 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에서 테스트 한 동작입니다.
따라서 실행 중인 애니메이션 / 감속을 중지하는 솔루션 은 다음과 같이 간단합니다.
[scrollView setContentOffset:scrollView.contentOffset animated:NO];
글쎄, 기본적으로 David Liu가 편집 한 답변에서 말한 것. 하지만이 두 API가 동일 하지 않다는 점을 분명히하고 싶었습니다 .
스위프트 3 :
scrollView.setContentOffset(scrollView.contentOffset, animated: false)
나를 위해 David Lui의 수락 된 대답 은 나를 위해 작동하지 않습니다. 이것이 내가 한 일입니다.
- (void)killScroll {
self.scrollView.scrollEnabled = NO;
self.scrollView.scrollEnabled = YES;
}
그만한 가치를 위해 iOS 6.0 iPhone Simulator를 사용하고 있습니다.
이것은 스크롤 뷰 및 기타 모든 관련 하위 클래스에 대해 수행하는 작업입니다.
- (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가 현재이 상태에 있으면 감속을 즉시 중지하지 않습니다. 이를 위해 허용되는 답변 편집은 xD가 가장 좋은 방법입니다.
[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;
이 대답은 나를 위해 일했습니다 : Deactivate UIScrollView decelerating
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
[scrollView setContentOffset:scrollView.contentOffset animated:YES];
}
collectionview에서이 방법을 시도했습니다.
self.collectionView.collectionViewLayout.finalizeCollectionViewUpdates()
이것은 Swift 4.2 에서 저에게 효과적입니다 .
func killScroll() {
self.scrollView.isScrollEnabled = false;
self.scrollView.isScrollEnabled = true;
}
... 확장자 :
extension UIScrollView {
func killScroll() {
self.isScrollEnabled = false;
self.isScrollEnabled = true;
}
}
스크롤 뷰 내의 특정 UIView가 스 와이프하는 동안 터치의 소스 인 경우에만 스크롤을 비활성화하고 싶었습니다. 복잡한 뷰 계층 구조를 가지고 있었기 때문에 UIView를 UIScrollView 외부로 이동하려면 상당한 리팩토링이 필요했습니다.
해결 방법으로 스크롤을 방지하려는 하위보기에 단일 UIPanGestureRecognizer를 추가했습니다. 이 UIPanGestureRecognizer는 cancelsTouchesInView
UIScrollView의 panGesture가 활성화되는 것을 방지합니다.
약간의 '해킹'이지만 매우 쉬운 변경이며 XIB 또는 스토리 보드를 사용하는 경우 팬 제스처를 문제의 하위보기로 드래그하기 만하면됩니다.
'ProgramingTip' 카테고리의 다른 글
TabControl 내에서 탭을 선택해야합니까? (0) | 2020.10.22 |
---|---|
활성 페이지의 현재 카테고리 ID 가져 오기 (0) | 2020.10.22 |
여러 배열 키가 있는지 확인하는 방법 (0) | 2020.10.22 |
매트 테이블 도장가 작동하지 발생 (0) | 2020.10.22 |
이메일을 맹목적으로 받아들이지 않도록 확인하는 가장 간단한 임시 임시는 무엇입니까? (0) | 2020.10.22 |