Измените вид в UIScrollView с помощью NSTimer

#ios #uiview #uiscrollview #nstimer

#iOS #uiview #uiscrollview #nstimer

Вопрос:

Я использую следующий код для того, чтобы создать UIScrollView :

 UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
scroll.pagingEnabled = YES;
NSInteger numberOfViews = 3;
for (int i = 0; i < numberOfViews; i  ) {

    CGFloat yOrigin = i * self.view.frame.size.width;
    UIView *awesomeView = [[UIView alloc] initWithFrame:CGRectMake(yOrigin, 0, self.view.frame.size.width, self.view.frame.size.height)];
    awesomeView.backgroundColor = [UIColor colorWithRed:0.5/i green:0.5 blue:0.5 alpha:1];
    [scroll addSubview:awesomeView];

}

scroll.contentSize = CGSizeMake(self.view.frame.size.width * numberOfViews, self.view.frame.size.height);

[self.view addSubview:scroll];
 

Вопрос в следующем: как мне реализовать NSTimer , чтобы менять страницу каждые 4 секунды?

     [NSTimer scheduledTimerWithTimeInterval:4.0f
                                 target:self
                               selector:@selector(updateCounter:)
                               userInfo:nil
                                repeats:YES];
 

Я изо всех сил пытаюсь написать метод updateCounter. Пожалуйста, помогите

 - (void)updateCounter:(NSTimer *)theTimer {
 NSInteger numberOfViews = 3;
     int i = 0; i  ;
     if (i < numberOfViews) {

    yOrigin = i * self.view.frame.size.width;
    [scroll scrollRectToVisible:CGRectMake(yOrigin, 0, self.view.frame.size.width,      self.view.frame.size.height) animated:YES];
}

return; }
 

Хорошо, итак, с помощью этого кода NSTimer изменяется с просмотра 1 на просмотр 2, но он останавливается, он не меняется через следующие 4 секунды на просмотр 3. Что я хочу сделать, это перейти с просмотра 1 на просмотр 2 через 4 секунды, затем на просмотр 3 через 4 секундыи так далее. Я хочу иметь столько просмотров, сколько мне нужно.

Комментарии:

1. Я думаю, это потому, что вы повторно инициализируете i (i=0) каждый раз, когда вызывается updateCounter. Попробуйте сделать счетчик переменной экземпляра и сбросить его / обратный отсчет, когда я превысил количество страниц.

2. Упс, у вас не должно быть цикла внутри updateCount. Таймер, запускаемый каждые 4 секунды, является своего рода вашим циклом.

Ответ №1:

вы все делаете правильно. Теперь вам нужно реализовать updateCounter так, чтобы прокрутка ScrollView происходила автоматически. поддерживайте глобальный счетчик ширины. Продолжайте обновлять этот счетчик при каждом вызове updateCounter . Вы могли бы сделать это следующим образом —

 int global_width  = self.view.frame.size.width;
int global_height = self.view.frame.size.height;
- (void) updateCounter
{
    int width = (global_width%self.view.frame.size.width)*self.view.frame.size.width;
    [yourScrollView scrollRectToVisible:CGRectMake(0, 0, width, global_height) animated:YES];

    global_width   = self.view.frame.size.width;
    return;
}
 

Таким образом, вы продолжаете автоматически переключаться между страницами. Если это работает, все это вводится от руки. Но концепция верна.

Комментарии:

1. Хорошо, поэтому я изменил свой вопрос. КАК вы можете видеть в последней части, я изменил метод updateCounter, и он меняется с просмотра 1 на просмотр 2, но затем он останавливается, как я могу перейти на просмотр 3 через следующие 4 секунды? Спасибо

Ответ №2:

Если вы хотите обновлять счетчик каждые четыре секунды, вызовите свой метод updateCounter следующим образом:

 [NSTimer scheduledTimerWithTimeInterval:4.0f
                                 target:self
                               selector:@selector(updateCounter)
                               userInfo:nil
                                repeats:YES];
 

В том, что вы сделали, есть два отличия. #1, временной интервал составляет 4 секунды. # 2, если у вас нет никаких параметров, входящих в метод updateCounter, не добавляйте двоеточие к селектору.

А затем ваш метод updateCounter:

 - (void) updateCounter
{
    // what view are you modifying?
    // the content view or a subview within the ScrollView's contentView ?   
}
 

Комментарии:

1. В настоящее время у меня есть 3 представления, поэтому я хочу изменить каждое представление с помощью updateCounter. Поэтому, если я добавлю следующее в метод updateCounter: static int count = 0; count ; switch (count amp; 3) { случай 1: перерыв; случай 2: перерыв; случай 3: перерыв; }} Я хочу добавить в каждом случае изображение и звук. Тогда возникает вопрос: как мне написать, что в каждом случае я хочу, чтобы счетчик обновлял текущее представление каждого из моих 3 представлений.