Я разрабатываю приложение, в котором мне нужно перетащить UIImageview из UIScrollview. В нижней части моего основного UIView у меня есть UIScrollView с UIImageViews внутри. Я создал собственный 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
Отсюда я включил объект CustomScroll в свой PuzzleViewController и подключил его к scrollview конструктора интерфейсов:
@interface PuzzleViewController : UIViewController <UIScrollViewDelegate> {
IBOutlet CustomScroll *segmentScrollview;
}
Я добавил программно все UIImageviews.
Этот код работает должным образом. UIImageview обнаруживает прикосновение, и я могу перетащить UIImageview из UIScrollview в UIView.
Но проблема возникает, когда я перетаскиваю UIImageview по диагонали.
В моем приложении, когда я перетаскиваю UIImageview вертикально из scrollview, я могу переместить свой UIImageView из UIScrollView в UIView. Но когда я перетаскиваю UIImageview по диагонали из scrollview, я не могу переместить UIImageview. Прокрутка по диагонали UIScrollview [UIImageview остается нетронутой], что является неожиданным. Я хочу, чтобы UIImageview перетаскивался по диагонали из UIScrollview.
Любая помощь будет принята с благодарностью.
Заранее благодарю за любую помощь.
Ответ 1 · рейтинг 1 · PTBG
Это просто мысль ... так что попробуй и расскажи мне, как дела. Если не сработает, я постараюсь помочь вам в дальнейшем. Попробуйте установить _ 1_ на НЕТ. Если установлено ДА, то ваше движение будет ограничено только горизонтальным / вертикальным. Если установлено NO, вы сможете двигаться по диагонали. Попробуйте и дайте мне знать, как это происходит.
_ 2_
Если это свойство NO, прокрутка разрешена как в горизонтальном, так и в вертикальном направлениях. Если для этого свойства установлено значение ДА, и пользователь начинает перетаскивание в одном общем направлении (горизонтальном или вертикальном), вид прокрутки отключает прокрутку в другом направлении. Если направление перетаскивания диагональное, прокрутка не будет заблокирована и пользователь может перетаскивать в любом направлении, пока перетаскивание не завершится. Значение по умолчанию - НЕТ.
Ответ 2 · john.k.doe
Я думаю, что вам нужно не [super touchMoved: ...], а скорее [self.superview touchesMoved: ...] ... при условии, что у вас есть супервизор, содержащий как CustomScroll, так и другое представление, которым вы являетесь пытаюсь втянуться в настройку, чтобы справиться с этим.
Ответ 3 · user3225651
Я знаю, что это старый вопрос, но я тоже столкнулся с этой проблемой. В основном я хотел прокрутку с возможностью разбиения по страницам, которая двигалась бы вверх, вниз, влево или вправо. Использование переменных 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 страницы. Это потому, что у меня контент всегда по центру, поэтому вы можете прокрутить одну страницу в любом направлении, а затем она вернется в центр. Его не должно быть сложно изменить для работы с несколькими страницами.