2 votes

<UITableview> et <UICollectionView> à l'intérieur de <UIScrollView> - Swift

Est-ce que quelqu'un peut me suggérer une idée pour créer une UI comme la capture d'écran ci-dessous

https://drive.google.com/open?id=0B2JNfyRRcL0Gb2huQ3ZTV2N6Q1E

J'ai utilisé

ScrollView

  • imageView
  • Label
  • TableView
    • Label
    • Bouton
  • UiView
  • CollectionView
    • ImageView
    • Bouton
    • labels…

avec cela, quand j'essaie de faire défiler vers le bas, seul le UIScrollView défiler, pas le UICollectionView. J'ai également essayé de donner la hauteur de UiCollectionView à sa hauteur de contenu et de rendre la hauteur de la scrollview adaptable à cela. Une fois que j'ai fait cela, les méthodes de datasource et delegate de la collection view ne sont pas appelées lorsque je fais défiler (c'est-à-dire la première fois lorsque viewDidLoad - il charge la cellule UICollectionView) avec le scénario ci-dessous, les méthodes de datasource et delegate ne sont appelées que pour les deux premières cellules, car elles sont visibles sur l'écran sans défiler, tandis que les autres ne le sont pas.

Je pense essayer avec un tableview mais je ne sais pas comment... parce que

  1. le premier contenu qui est l'image de la bannière peut ne pas être dans toutes les catégories (il peut être dans la réponse JSon ou non)
  2. Le label " Explorer plus" est un label statique
  3. La troisième chose " Vêtements, sacs, ceintures et portefeuilles" sont les cellules de TableView (le nombre de cellules peut varier en fonction des catégories)
  4. le quatrième est une Uiview qui a les boutons de filtre et de tri et c'est un élément statique
  5. le dernier est des cellules CollectionView (le nombre de cellules peut varier en fonction des catégories)

Alors, veuillez me suggérer une idée ou un exemple ou un code d'exemple sont très bien accueillis... merci d'avance... !

3voto

Abirami Bala Points 339

Enfin j'ai trouvé une idée,

J'ai tout gardé dans un TableView,

  1. Les deux premiers (l'image de la bannière et l'étiquette d'exploration sont la première cellule de ma tableview)

  2. La deuxième PrototypeCell est celle des titres de catégorie (où se trouvent les vêtements, sacs et ceintures)

  3. La troisième cellule Prototype est une avec les boutons de filtre et de tri que j'ai utilisée comme vue d'en-tête de section

  4. Enfin, la dernière cellule prototype est celle qui contient la Collection View et sa cellule (je l'ai juste conçue et ajoutée dans une cellule)

Et le code d'exemple est le suivant,

Ma CollectionViewCell

import UIKit

class CollectionViewCell: UICollectionViewCell {

@IBOutlet weak var imgFav: UIImageView!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var pinImage: UIImageView!
@IBOutlet weak var priceLbl: UILabel!
@IBOutlet var splPriceLbl: UILabel!

@IBOutlet weak var addToFav: UIButton!

override func awakeFromNib()
{
    super.awakeFromNib()
    self.contentView.autoresizingMask = [UIViewAutoresizing.flexibleRightMargin, UIViewAutoresizing.flexibleLeftMargin, UIViewAutoresizing.flexibleBottomMargin, UIViewAutoresizing.flexibleTopMargin]
    self.contentView.translatesAutoresizingMaskIntoConstraints = true
}

}

Ma TableViewCell

import UIKit

class SubCategoryTableViewCell: UITableViewCell {

@IBOutlet weak var productListCollectVw: UICollectionView!
@IBOutlet weak var btnSort: UIButton!
@IBOutlet weak var btnFilter: UIButton!
@IBOutlet weak var subCategryTitle: UILabel!
@IBOutlet weak var lblExplore: UILabel!
@IBOutlet weak var imgBanner: UIImageView!
override func awakeFromNib() {
    super.awakeFromNib()
    // Code d'initialisation
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configurez la vue pour la cellule sélectionnée
}

}

Et enfin mon ViewController

@IBOutlet weak var mainTableView: UITableView!
var subCategoryAry2 = NSMutableArray()
var imageUrl:URL!
var imageUrlStr:String = ""
var productListAry:NSMutableArray = []

func numberOfSections(in tableView: UITableView) -> Int
{
return 2
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    if section == 0
    {
        return subCategoryAry2.count + 1
    }
else
{
    return 1
}

}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
{
if section == 0
{
    return nil
}
else
{
    let CellIdentifier: String = "section2Cell"
    let headerView: SubCategoryTableViewCell? = tableView.dequeueReusableCell(withIdentifier: CellIdentifier) as! SubCategoryTableViewCell?

    headerView?.btnFilter.addTarget(self, action: #selector(self.filterAction(_:)), for: .touchUpInside)

    headerView?.btnSort.addTarget(self, action: #selector(self.sortAction(_:)), for: .touchUpInside)

    if headerView == nil
    {
        print("Aucune cellule avec CellIdentifier correspondant chargée depuis votre storyboard")
    }
    return headerView!
}
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
if indexPath.section == 0
{
    if indexPath.row == 0
    {
        let cell:SubCategoryTableViewCell = self.mainTableView.dequeueReusableCell(withIdentifier: "bannerCell") as! SubCategoryTableViewCell!

        if self.imageUrlStr == "no_image.png" || self.imageUrlStr == ""
        {
            cell.imgBanner.isHidden = true
            cell.imgBanner.frame.size.height = 0
            cell.lblExplore.frame.origin.y = 0
        }
        else
        {
            cell.imgBanner.isHidden = false

            let imageUrl1 = "\(self.imageUrl!)"

            let trimmedUrl = imageUrl1.trimmingCharacters(in: CharacterSet(charactersIn: "")).replacingOccurrences(of: " ", with: "%20") as String

            cell.imgBanner.sd_setImage(with: URL(string: trimmedUrl), completed: { (image, error, imageCacheType, imageUrl) in

                if image != nil
                {

                }
                else
                {
                    cell.imgBanner.isHidden = true
                    cell.imgBanner.frame.size.height = 0
                    cell.lblExplore.frame.origin.y = 0
                }
            })
        }

        return cell
    }
    else //if indexPath.row == 1
    {
        let cell:SubCategoryTableViewCell = self.mainTableView.dequeueReusableCell(withIdentifier: "listCell") as! SubCategoryTableViewCell!

        cell.subCategryTitle.text = (subCategoryAry2.object(at: (indexPath as NSIndexPath).row - 1) as AnyObject).value(forKey: "name") as? String

        return cell
    }
}
else
{
    let cell:SubCategoryTableViewCell = (self.mainTableView.dequeueReusableCell(withIdentifier: "collectionCell") as? SubCategoryTableViewCell!)!

    // Chargez votre CollectionView

    cell.productListCollectVw.dataSource = self
    cell.productListCollectVw.delegate = self
    cell.productListCollectVw.reloadData()

    return cell
}
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
if indexPath.section == 0
{
    if indexPath.row != 0
    {
        //***************** Faites ce que vous devez faire si l'utilisateur a sélectionné la ligne mais reste sur indexPath.row ou indexPath.row - 1 *****************//

        subCategoryID = ((subCategoryAry2.object(at: (indexPath as NSIndexPath).row - 1) as! NSObject).value(forKey: "category_id") as? String)! as NSString

        print("tableView - didSelectRowAt \(indexPath.row)")

    }
}
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
if indexPath.section == 0
{
    var height = CGFloat()

    if indexPath.row == 0
    {
        if self.imageUrlStr == "no_image.png" || self.imageUrlStr == ""
        {
             //***************** Réduire la hauteur de l'image de la bannière si elle est nulle *****************//
            height = 38
        }
        else
        {
            height = 175 + 38
        }
    }
    else
    {
        height = 44
    }
    return height
}
else
{
    let height = (255 * self.productListAry.count/2) + (2 * (self.productListAry.count) + 4)
    //***************** Augmentez la hauteur selon vos besoins *****************//

    return CGFloat(height)
}
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
if section == 0
{
    return 0
}
else
{
    return 44
}
}

 func collectionView(_ collectionView: UICollectionView, 
numberOfItemsInSection section: Int) -> Int
{
return self.productListAry.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.reuseIdentifier, for: indexPath) as! CollectionViewCell
cell.title.text = (self.productListAry.object(at: (indexPath as NSIndexPath).row) as! NSDictionary).value(forKey: "name") as? String

//***************** Chargez votre cellule selon vos besoins *****************//

return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{

print("didSelectItemAt \(indexPath.row)")
}

Mon storyboard ressemblera à la capture d'écran ajoutée https://drive.google.com/file/d/0B2JNfyRRcL0GYjJsckpyaGpoMkE/view?usp=sharing

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X