Откуда взялся промежуток между двумя картинками в горизонтальном UIScrollView?


#1

Не могу разобраться, откуда взялся промежуток между двумя картинками в горизонтальном UIScrollView, при его пролистывании?

СкролВью автоматически листает картинки по таймеру, скролвью расположен на всплывающем окне, отображается окно по нажатию на кнопку. Ниже скрол с таймером

_ = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(timerAction), us 
erInfo: nil, repeats: true)

    scrollImage = [UIImage(named: "123")!, UIImage(named: "456")!, UIImage(named: "sharing")!, UIImage(named: "smska")!]
    subView.image.delegate = self

    for i in 0..<scrollImage.count {

        let imageView = UIImageView()
        imageView.image = scrollImage[i]
        let xPosition = self.view.frame.width * CGFloat(i)
        imageView.frame = CGRect(x: xPosition, y: 0, width: self.subView.image.frame.width, height: self.subView.image.frame.height)

        subView.image.contentSize.width = subView.image.frame.width * CGFloat(scrollImage.count)
        subView.image.addSubview(imageView)
    } 

здесь функция вызываемая таймером

@objc func timerAction() {

   self.automaticallyAdjustsScrollViewInsets = true
   let page = subView.image.contentOffset.x / subView.image.frame.size.width
   subView.pageControl.currentPage = Int(page)

   DispatchQueue.main.async {
       UIView.animate(withDuration: 1, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: {
           self.subView.image.contentOffset.x += 300
       }, completion: nil)
    }
 }

#2

Перед for напечатайте print(subView.image.frame) его ширина будет меньше чем ширина view из которой рассчитывается xPosition. Лучше в таком кейсе использовать UICollectionView.


#3

Понял, спасибо большое


#4

Если картинки всего 4 можно и так оставить :slight_smile: и использовать autlayout или autoresizingmask:

_ = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(timerAction), us
    erInfo: nil, repeats: true)

scrollImage = [UIImage(named: "123")!, UIImage(named: "456")!, UIImage(named: "sharing")!, UIImage(named: "smska")!]
subView.image.delegate = self

for i in 0..<scrollImage.count {
    let imageView = UIImageView()
    imageView.image = scrollImage[i]
    let xPosition = self.view.frame.width * CGFloat(i)
    imageView.frame = CGRect(x: xPosition, y: 0, width: self.subView.image.frame.width, height: self.subView.image.frame.height)
    imageView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    subView.image.addSubview(imageView)
}
@objc func timerAction() {
    
    self.automaticallyAdjustsScrollViewInsets = true
    let page = subView.image.contentOffset.x / self.view.frame.width
    subView.pageControl.currentPage = Int(page)
    
    UIView.animate(withDuration: 1, delay: 0, options: .curveLinear, animations: {
        self.scrollView.contentOffset.x += self.view.frame.width
    })
}


#5

Александр, спасибо большое, да картинок всего 4 и теперь работает все как надо. А каким методом в timerAction остановить пролистывание на четвертой картинке, чтобы оно дальше не листало? И кстати, тоже не понятно, при повторных открываниях данного окна, картинки начинают быстрее пролистываться и перелетать через одну…


#6

timer.invalidate()

Видимо нужно останавливать старый таймер.


#7

Александр, по вашему примеру скролвью не дает самому свайпить картинки. Листает только автоматически. А добавляя subView.image.contentSize.width все равно не получается некорректно, при свайпе первая картинка реагирует на свайп, но полностью не дает перелистнуть на вторую картинку и возвращается в начальное положение первой картинки. В чем может быть дело?


#8

#9

Алексадр, все делаю, как у тебя в примере, но видно из-за того, что использую скрол на отдельной вьюхе посредством Xib-файла, то все равно не корректно работает. Извиняюсь, мог бы посмотреть пример моей реализации и сказать что не так…? Заранее спасибо


#10

У вас у UIScrollView зачам то класс UICollectionView выставлен

От этого и глючит.

Вот поправил немного https://yadi.sk/d/_BHT_NnI3WhSz2


#11

Ничего себе немного поправил )) Спасибо большое!