Показать и скрыть UIView на пролистывание без заявления IF? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть следующий код для прокрутки UIViews на пролистывание.

Мой вопрос заключается в том, есть ли лучший способ прохождения каждого из представлений вместо использования оператора if? Поскольку я чувствую, что станет еще больше, если я добавлю больше слоев просмотра.

Или есть способ получить текущие представления id / model / IBOutlet, так как я чувствую, что могу решить проблему с этим.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var WalkthroughScreen1: UIView!
    @IBOutlet weak var WalkthroughScreen2: UIView!
    @IBOutlet weak var WalkthroughScreen3: UIView!
    @IBOutlet weak var WalkthroughScreen4: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        WalkthroughScreen1.isHidden = false
        WalkthroughScreen2.isHidden = true
        WalkthroughScreen3.isHidden = true
        WalkthroughScreen4.isHidden = true
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func SwipeLeft(_ sender: UISwipeGestureRecognizer) {
        if WalkthroughScreen1.isHidden == false {
            WalkthroughScreen1.isHidden = true
            WalkthroughScreen2.isHidden = false
        } else {
            if WalkthroughScreen2.isHidden == false {
                WalkthroughScreen2.isHidden = true
                WalkthroughScreen3.isHidden = false
            } else {
                if WalkthroughScreen3.isHidden == false {
                    WalkthroughScreen3.isHidden = true
                    WalkthroughScreen4.isHidden = false
                }
            }
        }
    }

    @IBAction func SwipeRight(_ sender: UISwipeGestureRecognizer) {
        if WalkthroughScreen4.isHidden == false {
            WalkthroughScreen4.isHidden = true
            WalkthroughScreen3.isHidden = false
        } else {
            if WalkthroughScreen3.isHidden == false {
                WalkthroughScreen3.isHidden = true
                WalkthroughScreen2.isHidden = false
            } else {
                if WalkthroughScreen2.isHidden == false {
                    WalkthroughScreen2.isHidden = true
                    WalkthroughScreen1.isHidden = false
                }
            }
        }
    }
}

Заранее благодарю за помощь.

Ответы [ 4 ]

0 голосов
/ 03 мая 2018

Не удается найти решение в Интернете, но приведенный ниже код может дать вам представление о том, как его реализовать, используя UICollectionView:

Создать UIViewcontroller с UICollectionView как подпредставление со всеми четырьмя ограничениями с нулевым значением.

В вашем UIViewcontroller добавьте следующие коды:

import UIKit

class ViewController: UIViewController {

    let arrayTitle = ["Hi", "Hello", "Ok", "Got it"]

    let arrayColors = [UIColor.red,UIColor.blue,UIColor.black,UIColor.gray]

    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.collectionView!.register(UINib(nibName: "CustomCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "cellReuseIdentifier")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: collectionView.frame.size.width, height: collectionView.frame.size.height)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 4
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellReuseIdentifier", for: indexPath) as! CustomCollectionViewCell

        cell.labelTitle.text = arrayTitle[indexPath.row]
        cell.backgroundColor = arrayColors[indexPath.row]

        return cell
    } 
}

Создайте CustomCollectionViewCell и добавьте следующие строки кода:

class CustomCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var labelTitle: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

}

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

0 голосов
/ 03 мая 2018

Попробуйте это (может содержать небольшие синтаксические ошибки, в настоящее время Xcode недоступен):

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var WalkthroughScreen1: UIView!
    @IBOutlet weak var WalkthroughScreen2: UIView!
    @IBOutlet weak var WalkthroughScreen3: UIView!
    @IBOutlet weak var WalkthroughScreen4: UIView!
    weak var screens:[UIView]!

    override func viewDidLoad() {
        super.viewDidLoad()
        screens = [WalkthroughScreen1, WalkthroughScreen2, WalkthroughScreen3, WalkthroughScreen4]
        WalkthroughScreen1.isHidden = false
        WalkthroughScreen2.isHidden = true
        WalkthroughScreen3.isHidden = true
        WalkthroughScreen4.isHidden = true
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func SwipeLeft(_ sender: UISwipeGestureRecognizer) {
        if let nextInx = screens.index(of: sender.view)+1 {
            if (nextInx) < screens.count {
                sender.view.isHidden = true
                screens[nextInx].isHidden = false
            }
        }
    }

    @IBAction func SwipeRight(_ sender: UISwipeGestureRecognizer) {
        if let nextInx = screens.index(of: sender.view)-1 {
            if (nextInx) > 0 {
                sender.view.isHidden = true
                screens[nextInx].isHidden = false
            }
        }
    }
}
0 голосов
/ 03 мая 2018
Use design widgets, controllers etc to make an interactive UI so for your question better solution would be use UIPageControl.

@IBOutlet weak var pageControl: UIPageControl!
@IBOutlet weak var mainScrl: UIScrollView!
let arrImages = [“1.png”, "2.png", "3.png”]// No. of images or you can use your views with  

func loadScrollView() {
let pageCount : CGFloat = CGFloat(arrImages.count)

mainScrl.backgroundColor = UIColor.clearColor()
mainScrl.delegate = self
mainScrl.pagingEnabled = true
mainScrl.contentSize = CGSizeMake(mainScrl.frame.size.width * pageCount, mainScrl.frame.size.height)
mainScrl.showsHorizontalScrollIndicator = false

pageControl.numberOfPages = Int(pageCount)
pageControl.addTarget(self, action: #selector(self.pageChanged), forControlEvents: .ValueChanged)

for i in 0..<Int(pageCount) {
print(self. mainScrl.frame.size.width)
let image = UIImageView(frame: CGRectMake(self. mainScrl.frame.size.width * CGFloat(i), 0, self.mainScrl.frame.size.width, self.mainScrl.frame.size.height))
image.image = UIImage(named: arrImages[i])!
image.contentMode = UIViewContentMode.ScaleAspectFit
self.mainScrl.addSubview(image)
}
}

//MARK: UIScrollView Delegate
func scrollViewDidScroll(scrollView: UIScrollView) {
let viewWidth: CGFloat = scrollView.frame.size.width
// content offset - tells by how much the scroll view has scrolled.
let pageNumber = floor((scrollView.contentOffset.x - viewWidth / 50) / viewWidth) + 1
pageControl.currentPage = Int(pageNumber)
}


//MARK: Page tap action
func pageChanged() {
let pageNumber = pageControl.currentPage
var frame = scrMain.frame
frame.origin.x = frame.size.width * CGFloat(pageNumber)
frame.origin.y = 0
scrMain.scrollRectToVisible(frame, animated: true)
}
0 голосов
/ 03 мая 2018

При создании компонентов и нумерации их с номером, чтобы указать различия, вы должны использовать массив. Вот что я должен сделать:

  1. Удалить все розетки
  2. Создайте коллекцию IBOutletCollection с вашими представлениями и пометьте свои представления, чтобы указать иерархию
  3. Сортируйте эту IBOutletCollection в вашем viewDidLoad, чтобы тег с наименьшим значением стал первым, а тег с наибольшим значением стал последним. Это необходимо, потому что порядок IBOutletCollection НЕ сортируется и может измениться, несмотря на то, что говорят другие люди.
  4. Измените свой метод swipeLeft на что-то вроде этого (у меня нет компилятора здесь, поэтому я могу сделать несколько ошибок):

Код:

guard let index = walkthroughScreens.index { !$0.hidden } else { return } // This gets the non-hidden walkthroughScreen
walkthroughScreens[index].isHidden = true
walkthroughScreens[index + 1].isHidden = false // <- make sure index isn't out of bounds.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...