UIScrollView с слайдшоу изображений и таймерами - PullRequest
0 голосов
/ 25 мая 2011

Я пытаюсь реализовать слайд-шоу изображений с предварительным просмотром по горизонтали и вертикали, и я хочу иметь возможность делать некоторые вещи, когда пользователь перестает прокручивать и через 5 секунд делает это. Я использую 2 таймера, чтобы справиться с этим, но мне нужна некоторая синхронизация или, возможно, я не в том направлении! Почему я использую 2 таймера: потому что я хочу обрабатывать прокрутку на главном экране (-(void)touchesBegan и -(void)touchesEnded) и прокрутку на scrollView (UIScrollView delegate). мой код ниже, и я надеюсь, что кто-то может помочь :). Спасибо.

// This is the slideShow view controller
// It display all the images with preview (right, left, up and down)
@interface ImageSlideShowViewController : UIViewController<UIScrollViewDelegate>
{

    UIScrollView *scrollViewForSlideShow;    
    // Timers
    NSTimer *autoscrollTimer;
    NSTimer *mainViewTimer;
}

@end

@implementation ImageSlideShowViewController

#pragma mark Touch handling

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{
    ....
    // Invalidate all timers
   [autoscrollTimer invalidate];
   autoscrollTimer = nil;
   [mainViewTimer invalidate];
   mainViewTimer = nil;
}

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

    ....

    assert(mainViewTimer == nil);

    mainViewTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
                                                       target:self
                                                     selector:@selector(allViewTimerFireMethod:)
                                                     userInfo:nil
                                                      repeats:NO];   


    // prev image horizontal
        ...

    // next image horizontal
        ....    

    // prev image vertical
            ...

    // next image vertical
            ....
}   


#pragma mark -
#pragma mark UIScrollView delegate

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    // Invalidate all timers
    [autoscrollTimer invalidate];
    autoscrollTimer = nil;
    [mainViewTimer invalidate];
    mainViewTimer = nil;
}

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
{
    //Doing some management stuff here
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    if (!scrollView.dragging)
    {
        //Doing some management stuff here

        assert(autoscrollTimer == nil);


        autoscrollTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
                                                           target:self
                                                         selector:@selector(timerFireMethod:)
                                                         userInfo:nil
                                                          repeats:NO];

    }
}

#pragma mark -
#pragma mark Timers methods

- (void)timerFireMethod:(NSTimer*)theTimer
{
    autoscrollTimer = nil;
    // Call a method that dispaly the image
}

- (void)allViewTimerFireMethod:(NSTimer *)theTimer
{
    mainViewTimer = nil;
    // Call a method that dispaly the image (same as the method called above)
}

@end

1 Ответ

0 голосов
/ 25 мая 2011

Я думаю, что вы могли бы избавиться от двух таймеров и определить промежуточную функцию, скажем enableTimerFor:, которую вы могли бы вызывать из -scrollViewDidEndDecelerating: и -touchesEnded:withEvent: вместо создания там 2 таймеров.

enableTimerFor: в основном создаст таймер и запланирует его:

-(void)enableTimerFor:(NSUInteger)callerId {
    viewTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
                                                   target:self
                                                 selector:@selector(timerFired:)
                                                 userInfo:nil
                                                  repeats:NO];   
}

-(void)timerFired {
   // do whatever you need to
}

И он будет называться так:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    ....
    [self enableTimerFor:kTouchesEnded];
    ....
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    if (!scrollView.dragging) {
        //Doing some management stuff here
        [self enableTimerFor:kScrollEnded];
    }
    ....
}

Таким образом, у вас не будет проблем с синхронизацией.Также обратите внимание, что я думал о enableTimerFor: как о параметре, который позволяет вам определить, был ли он вызван из одной или другой функции, но вы можете легко решить избавиться от него в случае, если вам не нужно различать дваслучаи.

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

...