Usando UIScrollView e UIPageControl em RubyMotion

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 ):

Cenário

Coloquei os elementos UIScollViewe UIPageControlem 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 scrollViewDidScrollmétodo delegado para definir o currentPageatributo.

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 clickPageControlfosse 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 scrollViewDidEndDeceleratingdelegado, que só é chamado quando termina de desacelerar como o nome indica, em vez de scrollViewDidScroll.

Referências):