2011-11-03 3 views
2

UIScrollview에서 UIImageview를 드래그해야하는 앱을 개발 중입니다. 내 주요 UIView의 맨 아래 부분에 UIImageViews가있는 UIScrollView가 있습니다. 내 PuzzleViewController에서 CustomScroll 객체를 포함하고 인터페이스 빌더의있는 ScrollView에 연결 한 여기에서iphone-UIScrollview 대각선 스 와이프 예상치 못한 동작

@interface CustomScroll : UIScrollView { 

}@end 


@implementation CustomScroll 


- (id)initWithFrame:(CGRect)frame { 
return [super initWithFrame:frame]; 

} 

- (void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event { 
// If not dragging, send event to next responder 
if (!self.dragging) { 
    self.scrollEnabled=NO; 
    [self.nextResponder touchesMoved:touches withEvent:event]; 

} 
else{ 
    [super touchesMoved: touches withEvent: event]; 
} 

}

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event { 
// If not dragging, send event to next responder 
if (!self.dragging) 
    [self.nextResponder touchesEnded: touches withEvent:event]; 
else 
    [super touchesEnded: touches withEvent: event]; 
} 
@end 

:

나는 다음과 같은 코드를 사용하여 사용자 정의있는 UIScrollView을 만든
@interface PuzzleViewController : UIViewController <UIScrollViewDelegate> { 
    IBOutlet CustomScroll *segmentScrollview; 

}

프로그래밍 방식으로 모든 UIImageviews를 추가했습니다.

이 코드는 예상대로 작동합니다. UIImageview 터치 감지 및 UIView UIScrollview UIImageview 끌 수 있습니다.

하지만 UIImageview를 대각선으로 끌면 문제가 발생합니다.

UIImageview를 scrollview에서 세로로 드래그하면 UIIcageView를 UIView로 옮길 수 있습니다. 그러나 UIImageview를 scrollview에서 대각선으로 드래그하면 UIImageview를 이동할 수 없습니다. 대각선 스 와이프 스크롤 UIScrollview [UIImageview는 변경되지 않았습니다.] 이는 예상치 못한 것입니다. 내가 UIImageview UIScrollview에서 대각선으로 드래그해야합니다.

도움을 주시면 감사하겠습니다.

미리 도움을 청하십시오.

답변

1

이것은 단지 생각 일 뿐이므로 시도해보고 어떻게 진행되는지 알려주세요. 만약에 작동하지 않으면 나는 너를 더 멀리 시도하고 도울 것이다. directionalLockEnabled을 NO로 설정하십시오. YES로 설정하면 움직임이 수평/수직으로 만 제한됩니다. 아니오로 설정하면 대각선으로 이동할 수 있습니다. 그것을 시도하고 그것이 어떻게되는지 알려주세요. 이 속성이 NO, 스크롤 모두 수평 및 수직 방향으로 허용되면

UIScrollView directionLockEnabled Docs

. 이 속성이 YES이고 사용자가 을 하나의 일반 방향 (가로 또는 세로)으로 드래그하기 시작하면 스크롤 뷰는 다른 방향으로의 스크롤을 비활성화합니다. 방향이 대각선이면 스크롤이 잠기지 않고 사용자 은 끌기가 완료 될 때까지 아무 방향으로나 끌 수 있습니다. 오히려 : 기본값 난 당신이 후입니다 것은 아니라고 생각하고 NO

+0

답장을 보내 주신 Sam과 PTBG에게 감사드립니다. 그러나 directionalLockEnabled가 작동하지 않습니다. 문제는 그대로 남습니다. scrollview에서 UIImageview를 대각선으로 끌 수 없습니다. – user392406

0

없습니다 ... 슈퍼가있는 touchesMoved] [self.superview가있는 touchesMoved : ...] ... 당신이있는 가정 이 문제를 해결하기 위해 CustomScroll과 다른 뷰를 포함하는 수퍼 뷰를 설정하십시오.

0

이 질문은 오래된 질문이지만,이 문제도 만났습니다. 기본적으로 나는 위, 아래, 왼쪽 또는 오른쪽으로 이동하는 페이징 가능 스크롤보기를 원했습니다. pagingEnabled 및 directionalLockEnabled 변수를 사용하면 대각선 끌기를 제외하고 기본적으로 작동합니다.내 솔루션은 아래 있습니다. 유일한 방법은 위로 스크롤 아래로 정확히 위 또는 아래로 스 와이프하는 것, 그래서

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (self.scrollView.contentOffset.x >= self.previousScrollOffset.x && 
     self.scrollView.contentOffset.y == self.scrollView.contentSize.height/3){ 

     self.currentScrollDirection = SW_DIRECTION_LEFT; 

    } else if (self.scrollView.contentOffset.x < self.previousScrollOffset.x && 
       self.scrollView.contentOffset.y == self.scrollView.contentSize.height/3){ 

     self.currentScrollDirection = SW_DIRECTION_RIGHT; 

    } else if (self.scrollView.contentOffset.x == self.scrollView.contentSize.width/3 && 
     self.scrollView.contentOffset.y >= self.previousScrollOffset.y){ 

     self.currentScrollDirection = SW_DIRECTION_UP; 

    } else if (self.scrollView.contentOffset.x == self.scrollView.contentSize.width/3 && 
     self.scrollView.contentOffset.y <= self.previousScrollOffset.y){ 

     self.currentScrollDirection = SW_DIRECTION_DOWN; 

    } else { 

     self.currentScrollDirection = SW_DIRECTION_NONE; 

    } 

    //lock to either horizontal or vertical if we are dragging (prevent the diagonal drag) 
    if (self.scrollView.isTracking && self.currentScrollDirection == SW_DIRECTION_NONE){ 
     self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentSize.height/3); 
    } 

    self.previousScrollOffset = scrollView.contentOffset; 
} 

이 수평 드래그가 우선 순위를했기 때문에 나를 위해 잘 작동 수평면에 스크롤을 잠글 수있는 대각선 와이프를 강제로 . 이를 위해

@property (readwrite, nonatomic) SW_SCROLL_DIRECTION currentScrollDirection; 
@property (readwrite, nonatomic) CGPoint previousScrollOffset; 

typedef enum { 
SW_DIRECTION_NONE, 
SW_DIRECTION_LEFT, 
SW_DIRECTION_RIGHT, 
SW_DIRECTION_UP, 
SW_DIRECTION_DOWN 

} SW_SCROLL_DIRECTION를 선언해야합니다 작동합니다;

참고. 당신이 3 페이지의 값을 하드 코드하는 것을 보았을 때 이것은 아마 상자 밖에서 작동하지 않을 것입니다. 이는 항상 내용이 가운데에 배치되어 있기 때문에 어떤 방향 으로든 한 페이지를 스크롤 할 수 있고 다시 가운데로 움직일 수 있습니다. 여러 페이지로 작업하기 위해 수정하기가 어렵지 않아야합니다.

관련 문제