iphone - неожиданное поведение при прокрутке по диагонали UIScrollview

Я разрабатываю приложение, в котором мне нужно перетащить 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.

Любая помощь будет принята с благодарностью.

Заранее благодарю за любую помощь.


person user392406    schedule 03.11.2011    source источник


Ответы (3)


Это просто мысль ... так что попробуй и расскажи мне, как дела. Если не сработает, я постараюсь помочь вам в дальнейшем. Попробуйте установить _ 1_ на НЕТ. Если установлено ДА, то ваше движение будет ограничено только горизонтальным / вертикальным. Если установлено NO, вы сможете двигаться по диагонали. Попробуйте и дайте мне знать, как это происходит.

_ 2_

Если это свойство NO, прокрутка разрешена как в горизонтальном, так и в вертикальном направлениях. Если для этого свойства установлено значение ДА, и пользователь начинает перетаскивание в одном общем направлении (горизонтальном или вертикальном), вид прокрутки отключает прокрутку в другом направлении. Если направление перетаскивания диагональное, прокрутка не будет заблокирована и пользователь может перетаскивать в любом направлении, пока перетаскивание не завершится. Значение по умолчанию - НЕТ.

person PTBG    schedule 03.11.2011
comment
Спасибо, Сэм, и PTBG за ваш ответ. Но directionalLockEnabled не работает. Проблема остается как есть. Я не могу перетащить UIImageview по диагонали из scrollview. - person user392406; 04.11.2011

Я думаю, что вам нужно не [super touchMoved: ...], а скорее [self.superview touchesMoved: ...] ... при условии, что у вас есть супервизор, содержащий как CustomScroll, так и другое представление, которым вы являетесь пытаюсь втянуться в настройку, чтобы справиться с этим.

person john.k.doe    schedule 13.04.2012

Я знаю, что это старый вопрос, но я тоже столкнулся с этой проблемой. В основном я хотел прокрутку с возможностью разбиения по страницам, которая двигалась бы вверх, вниз, влево или вправо. Использование переменных 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 страницы. Это потому, что у меня контент всегда по центру, поэтому вы можете прокрутить одну страницу в любом направлении, а затем она вернется в центр. Его не должно быть сложно изменить для работы с несколькими страницами.

person user3225651    schedule 27.10.2014