UIScrollView с UIImageView в качестве подпредставлений, нажав UIImageView - PullRequest
1 голос
/ 07 декабря 2010

Мне нужно сделать что-то вроде этого:

UISCrollView с UIImageViews в качестве его подпредставлений.Когда пользователь нажимает на UIImageViews, происходит действие.Но когда пользователь хочет прокрутить, UIScrollView следует прокручивать, даже если прокрутка началась в UIImageView (в месте, где отображается UIImage UIImageView).

В основном я могу получить один из двух сценариев:

  1. Я могу получить это, если пользователь нажимает на UIImageView (который является подпредставлением UIScrollView), действие происходит, но когда выпопробуйте прокрутить, перетаскивая палец из UIImageView, действие также происходит (и я хочу, чтобы прокрутка произошла).

  2. Я могу сделать это относительно того, где пользователь нажимает на представление, прокручивается, но если пользователь касаетсяUIImageView действие НЕ произойдет.

Я не могу получить какой-либо свой код, потому что я тестирую много апрошей тут и там, и это немного грязно, так что это не будетиспользовать вообще (без тонны комментариев).

Есть ли чистое и простое решение для этого?

Хорошо, вот некоторый код:

-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event
{


if(isDragging == NO)
{


    return [super hitTest:point withEvent:event];
}
NSLog(@"dragging ><><><><><>>><><><><>");
        return nil;

}

Теперь, если я верну ноль, тогда я могу прокрутить, но я могуне могу коснуться моего UIImageView для действия.Если я возвращаю [super hitTest: point withEvent: event], я не могу прокрутить свой UIIMageView.

isDragging - тестовый код, чтобы определить, пытаюсь ли я прокрутить или просто нажать.Но проверка попадания происходит до того, как я могу установить свойство isDragging в соответствии с происходящим событием.

Вот мой init

-(id) initWithCoder:(NSCoder *)aDecoder
{

if(self = [super initWithCoder:aDecoder])
{
    [self setUserInteractionEnabled:YES];
    UISwipeGestureRecognizer *swipeRecLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe)];
    swipeRecLeft.direction = UISwipeGestureRecognizerDirectionDown;

    UISwipeGestureRecognizer *swipeRecRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe)];
    swipeRecRight.direction = UISwipeGestureRecognizerDirectionUp;

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapSingle)];    

    [self addGestureRecognizer:swipeRecRight]; 
    [self addGestureRecognizer:swipeRecLeft];
    [self addGestureRecognizer:singleTap];


    [swipeRecLeft release]; 
    [swipeRecRight release]; 
    [singleTap release];

    isDragging = NO;
}
else {
    self = nil;
}

return self;

}

Вот остальные действия

-(void) tapSingle

{[self.delegate hitOccur];}

-(void) swipe
{
    isDragging = YES;
}

И поверх этого в моем UIScrollView я установил делегат, и когда прокрутка заканчивается, я устанавливаю свойство isDragging вручную в NO для каждого подпредставления моего UIScrollView.

Это работает... но это не идеально.Чтобы на самом деле прокручивать контент, я должен провести ДВАЖДЫ в UIImageView (сначала нужно установить isDragging на YES, а затем мы можем прокрутить ...).Как правильно и правильно?

ПОСЛЕДНИЕ ОБНОВЛЕНИЯ:

Хорошо, мне удалось решить эту проблему.Однако я абсолютно уверен, что мой путь не чистый или хороший (но считает, что он работает).

В моем подклассе UIScrollView я переопределил метод hitTest с этим:

-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event
{

    if(!self.dragging)
    {
        if([[super hitTest:point withEvent:event] class] == [ResponsiveBookView class])
        {
            container = [super hitTest:point withEvent:event];
        }
    }
    return self;

}

Где контейнер - это идентификатор контейнера, и он содержит мой подкласс UIView.Таким образом, я могу узнать, было ли касание на моем изображении или на самом просмотре прокрутки.Теперь мне нужно определить, прокручивается ли он или просто касается, и я делаю это здесь:

-(void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event 
{   

    if (!self.dragging) {
        NSLog(@"touch touch touch");
        [container tapSingle];
        [self.nextResponder touchesEnded: touches withEvent:event]; 
    }       


    [super touchesEnded: touches withEvent: event];
}

Как вы видите, будет ли применяться self.dragging (scrolling) поведение по умолчанию.Если! Self.dragging, я вручную вызову tapSingle для моего контейнера (что затем заставит действие «произойти»).Это работает!

1 Ответ

0 голосов
/ 07 декабря 2010

Да - использовать распознаватели жестов.Если вы добавите UITapGestureRecognizer к каждому UIImageView (используя метод UIVIew -addGestureRecognizer:), вы получите как распознавание касаний, так и режим прокрутки по умолчанию.

...