Como um novo usuário de UIKit e RubyMotion, eu escolhi a coisa mais simples de implementar em um projeto no qual tenho que trabalhar (hooray para aprender no trabalho), que se parece com isto (desculpe, não consegui animar no CoderWall ):
Coloquei os elementos UIScollView
e UIPageControl
em um controlador de visualização e vamos lá:
class SlideshowController < UIViewController
def viewDidLoad
super
numberOfPages = 3
@scrollView = UIScrollView.alloc.init
@scrollView.frame = CGRectMake(0, 0, App.window.frame.size.width, App.window.frame.size.height)
@scrollView.pagingEnabled = true
@scrollView.backgroundColor = UIColor.blackColor
@scrollView.contentSize = CGSizeMake(@scrollView.frame.size.width * numberOfPages, @scrollView.frame.size.height)
@scrollView.showsHorizontalScrollIndicator = false
@scrollView.showsVerticalScrollIndicator = false
numberOfPages.times do |i|
view = UIView.alloc.initWithFrame(CGRectMake(@scrollView.frame.size.width * i, 0, @scrollView.frame.size.width, @scrollView.frame.size.height))
view.backgroundColor = UIColor.alloc.initWithPatternImage(UIImage.imageNamed("slideshow-#{i + 1}"))
@scrollView.addSubview(view)
end
@scrollView.delegate = self
self.view.addSubview @scrollView
@pageControl = UIPageControl.alloc.init
@pageControl.frame = CGRectMake(0, 0, App.window.frame.size.width, 80)
@pageControl.numberOfPages = numberOfPages
@pageControl.currentPage = 0
self.view.addSubview @pageControl
end
def scrollViewDidScroll(scrollView)
@pageControl.currentPage = @scrollView.contentOffset.x / @scrollView.frame.size.width
end
end
Basicamente, você deve criar uma visualização de rolagem com um tamanho de conteúdo que mapeie toda a sua apresentação de slides. Em seguida, você cria visualizações que posiciona na visualização de rolagem e permite que a biblioteca faça sua mágica.
Para vinculá-lo ao controle de página, basta manipular o scrollViewDidScroll
método delegado para definir o currentPage
atributo.
Eu também estava tentando permitir que os usuários tocassem no elemento de controle da página para pular para páginas específicas, mas tive alguns problemas com isso, adicionei outro método delegado aqui:
def clickPageControl(sender)
frame = @scrollView.frame
frame.origin.x = frame.size.width * @pageControl.currentPage
@scrollView.scrollRectToVisible(frame, animated: true)
end
E eu o conectei ao controle de página como em viewDidLoad
:
@pageControl.addTarget(self, action: "clickPageControl:", forControlEvents: UIControlEventAllEvents)
O problema com isso era que, quando clickPageControl
fosse chamado, ele começaria a rolar a visualização de rolagem, que por sua vez scrollViewDidScroll
, dispararia , e o controle de página faria algumas coisas para frente e para trás que não pareciam tão boas.
Alguma idéia de consertar isso?
ATUALIZAÇÃO : eu consertei isso usando o scrollViewDidEndDecelerating
delegado, que só é chamado quando termina de desacelerar como o nome indica, em vez de scrollViewDidScroll
.
Referências):
- https://coderwall.com/p/zfe8da
- http://stackoverflow.com/questions/993280/how-to-detect-when-a-uiscrollview-has-finished-scrolling