[iphone] UIScrollView에서 스크롤 방향을 찾으십니까?
나는이 UIScrollView
허용 된 경우에만 가로 스크롤로, 나는 어느 방향 (왼쪽, 오른쪽) 사용자가 스크롤을 알고 싶습니다. 내가 한 것은 서브 클래스를 작성 UIScrollView
하고 touchesMoved
메소드를 재정의하는 것이 었습니다 .
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
float now = [touch locationInView:self].x;
float before = [touch previousLocationInView:self].x;
NSLog(@"%f %f", before, now);
if (now > before){
right = NO;
NSLog(@"LEFT");
}
else{
right = YES;
NSLog(@"RIGHT");
}
}
그러나이 방법은 때로는 움직일 때 전혀 호출되지 않습니다. 어떻게 생각해?
답변
방향을 결정하는 것은 매우 간단하지만 제스처 과정에서 방향이 여러 번 변경 될 수 있습니다. 예를 들어, 페이징이 켜져있는 상태에서 스크롤보기가 있고 사용자가 다음 페이지로 넘어 가기 위해 스 와이프하면 초기 방향이 오른쪽 일 수 있지만 바운스가 설정된 경우 잠시 방향으로 진행되지 않습니다. 잠시 왼쪽으로 가십시오.
방향을 결정하려면 UIScrollView scrollViewDidScroll
대리인 을 사용해야합니다 . 이 샘플에서는 lastContentOffset
현재 콘텐츠 오프셋을 이전 콘텐츠와 비교하는 데 사용되는 변수를 만들었습니다 . 더 크면 scrollView가 오른쪽으로 스크롤됩니다. 이보다 작 으면 scrollView가 왼쪽으로 스크롤됩니다.
// somewhere in the private class extension
@property (nonatomic, assign) CGFloat lastContentOffset;
// somewhere in the class implementation
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
ScrollDirection scrollDirection;
if (self.lastContentOffset > scrollView.contentOffset.x) {
scrollDirection = ScrollDirectionRight;
} else if (self.lastContentOffset < scrollView.contentOffset.x) {
scrollDirection = ScrollDirectionLeft;
}
self.lastContentOffset = scrollView.contentOffset.x;
// do whatever you need to with scrollDirection here.
}
방향을 정의하기 위해 다음 열거 형을 사용하고 있습니다. 첫 번째 값을 ScrollDirectionNone으로 설정하면 변수를 초기화 할 때 해당 방향을 기본값으로 설정하는 이점이 있습니다.
typedef NS_ENUM(NSInteger, ScrollDirection) {
ScrollDirectionNone,
ScrollDirectionRight,
ScrollDirectionLeft,
ScrollDirectionUp,
ScrollDirectionDown,
ScrollDirectionCrazy,
};
답변
… 사용자가 어느 방향 (왼쪽, 오른쪽)으로 스크롤하는지 알고 싶습니다.
이 경우 iOS 5 이상에서를 사용 UIScrollViewDelegate
하여 사용자의 팬 동작 방향을 결정하십시오.
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x > 0) {
// handle dragging to the right
} else {
// handle dragging to the left
}
}
답변
사용 scrollViewDidScroll:
은 현재 방향을 찾는 좋은 방법입니다.
사용자가 스크롤을 마친 후 방향을 알고 싶다면 다음을 사용하십시오.
@property (nonatomic) CGFloat lastContentOffset;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
self.lastContentOffset = scrollView.contentOffset.x;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if (self.lastContentOffset < scrollView.contentOffset.x) {
// moved right
} else if (self.lastContentOffset > scrollView.contentOffset.x) {
// moved left
} else {
// didn't move
}
}
답변
이를 추적하기 위해 추가 변수를 추가 할 필요가 없습니다. 그냥 사용 UIScrollView
의 panGestureRecognizer
이 같은 속성을. 불행히도 속도가 0이 아닌 경우에만 작동합니다.
CGFloat yVelocity = [scrollView.panGestureRecognizer velocityInView:scrollView].y;
if (yVelocity < 0) {
NSLog(@"Up");
} else if (yVelocity > 0) {
NSLog(@"Down");
} else {
NSLog(@"Can't determine direction as velocity is 0");
}
x와 y 구성 요소를 조합하여 위, 아래, 왼쪽 및 오른쪽을 감지 할 수 있습니다.
답변
해결책
func scrollViewDidScroll(scrollView: UIScrollView) {
if(scrollView.panGestureRecognizer.translationInView(scrollView.superview).y > 0)
{
print("up")
}
else
{
print("down")
}
}
답변
스위프트 4 :
가로 스크롤의 경우 다음과 같이 간단하게 수행 할 수 있습니다.
if scrollView.panGestureRecognizer.translation(in: scrollView.superview).x > 0 {
print("left")
} else {
print("right")
}
수직 스크롤 변경의 .x
경우.y
답변
iOS8 Swift에서는이 방법을 사용했습니다.
override func scrollViewDidScroll(scrollView: UIScrollView){
var frame: CGRect = self.photoButton.frame
var currentLocation = scrollView.contentOffset.y
if frame.origin.y > currentLocation{
println("Going up!")
}else if frame.origin.y < currentLocation{
println("Going down!")
}
frame.origin.y = scrollView.contentOffset.y + scrollHeight
photoButton.frame = frame
view.bringSubviewToFront(photoButton)
}
사용자가 스크롤 할 때 위치를 변경하는 동적보기가있어보기가 화면의 동일한 위치에있는 것처럼 보일 수 있습니다. 사용자가 올라가거나 내려갈 때도 추적하고 있습니다.
다른 방법도 있습니다 :
func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
if targetContentOffset.memory.y < scrollView.contentOffset.y {
println("Going up!")
} else {
println("Going down!")
}
}