Как автоматически прокрутить UIScrollView с помощью таймера - PullRequest
17 голосов
/ 12 сентября 2010

У меня есть прокрутка для показа изображений. Мне нужен таймер, чтобы показывать изображения один за другим каждые 5 секунд. Как инициировать событие UIScrollView для перемещения через 5 секунд с помощью таймера?

Ответы [ 5 ]

30 голосов
/ 12 сентября 2010

Добавьте переменную int h в свой интерфейс и yourScrollView в качестве свойства. Тогда:

[NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];

- (void) onTimer {

    // Updates the variable h, adding 100 (put your own value here!)
    h += 100; 

    //This makes the scrollView scroll to the desired position  
    yourScrollView.contentOffset = CGPointMake(0, h);  

}
10 голосов
/ 06 июня 2013

изменение вышеуказанного кода

 [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(onTimer)   userInfo:nil repeats:YES];

-(void) onTimer {
  // NSLog(@"content offset %f",scrollVw.contentOffset.y);
  if (scrollVw.contentOffset.y<MAX_ALLOWED_OFFSET) {
   //scroll to desire position
    scrollVw.contentOffset = CGPointMake(0, scrollVw.contentOffset.y+1);
  }


  }
3 голосов
/ 13 сентября 2012

, чтобы получить текущее значение как w (значение x) или h (значение y) содержимого.Это помогает при ручной / полуавтоматической прокрутке с текущей контрольной точкой в ​​вашем контенте вашего UIScollView.

CGFloat w = scroller.contentOffset.x;

или

CGFloat h = scroller.contentOffset.y;

, а затем, конечно:

h += 100; // h-=100 for decrement
yourScrollView.contentOffset = CGPointMake(0, h);  
2 голосов
/ 18 ноября 2017

Swift версия

Добавить следующие свойства

var offSet: CGFloat = 0

@IBOutlet weak var imagePageControl: UIPageControl!
@IBOutlet weak var imageScrollView: UIScrollView!

let imageArray = [your images]

Изменить viewDidLoad()

    override func viewDidLoad() {
    super.viewDidLoad()
    self.offSet = 0
    let timer = Timer.scheduledTimer(timeInterval: 8, target: self, selector: #selector(autoScroll), userInfo: nil, repeats: true)

    imagePageControl.numberOfPages = bannerArray.count
    imageScrollView.isPagingEnabled = true
    imageScrollView.contentSize.height = 200
    imageScrollView.contentSize.width = self.view.bounds.width * CGFloat(bannerArray.count)
    imageScrollView.showsHorizontalScrollIndicator = false

    imageScrollView.delegate = self

    for (index, image) in imageArray.enumerated() {
        let image = image
        let imageView = UIImageView(image: image)
        imageView.contentMode = .scaleAspectFill
        imageView.frame.size.width = self.view.bounds.size.width
        imageView.frame.size.height = 200
        imageView.frame.origin.x = CGFloat(index) * self.view.bounds.size.width
        imageScrollView.addSubview(imageView)
    }
}

создать эту функцию для автоматической прокрутки

    func autoScroll() {
    let totalPossibleOffset = CGFloat(imageArray.count - 1) * self.view.bounds.size.width
    if offSet == totalPossibleOffset {
        offSet = 0 // come back to the first image after the last image
    }
    else {
    offSet += self.view.bounds.size.width
    }
    DispatchQueue.main.async() {
        UIView.animate(withDuration: 0.3, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: {
            self.imageScrollView.contentOffset.x = CGFloat(self.offSet)
        }, completion: nil)
    }
}

Добавить эту функцию для ручной прокрутки

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let page = scrollView.contentOffset.x / scrollView.frame.size.width
    imagePageControl.currentPage = Int(page)
    self.offSet = page * scrollView.frame.size.width // this updates offset value so that automatic scroll begins from the image you arrived at manually
}

Примечание. Хотя этот вопрос относится к автоматической прокрутке, я также добавил ручную прокрутку. Так что автоматическая и ручная прокрутка работают в тандеме. Также я добавил UIPageControl. Пожалуйста, удалите imagePageControl, если вам это не нужно.

0 голосов
/ 31 июля 2014

Возможно, [scroll scrollRectToVisibile: animated:] лучше, чем [scroll setContentOffset]. Потому что setContentOffset приведет к прокрутке из края. Просто попробуйте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...