在我的collectionview控制器中添加一个UIView标头

时间:2017-01-05 02:30:40

标签: swift swift3

我正在尝试将此标签视图添加到我的集合控制器中,该集合控制器具有单元格和标题。 但是,在我运行之后没有添加任何内容。我可以使用故事板创建这些标签,但我想知道如何在没有故事板的情况下做到这一点。请帮助并非常感谢你!

 var dayLabelContainerView : UIView {

    let v = UIView()
    let formatter : NSDateFormatter = NSDateFormatter()
    for index in 1...7 {

        let day = formatter.weekdaySymbols[index % 7] as NSString
        let weekdayLabel = UILabel()
        weekdayLabel.text = day.substringToIndex(2).uppercaseString
        weekdayLabel.textColor = UIColor.grayColor()
        weekdayLabel.textAlignment = NSTextAlignment.Center   
        v.addSubview(weekdayLabel)

    }

    self.addSubview(v)
    return v       
}

更新: collectionview代码:

// 
//  DaysViewController.swift
//  Calendar
//
//  Created by guiyang Fan on 12/29/16.
//  Copyright © 2016 guiyang Fan. All rights reserved.
//

    import UIKit

    private let reuseIdentifier = "Cell"
    private let headerHeight: CGFloat = 100


    class DaysViewController: UICollectionViewController {



    private let weekdaySymbols = DateFormatter().shortWeekdaySymbols
    private let dateFormatter = DateFormatter()
    private let calendar = NSCalendar.current
    private var currentDate: Date = Date()
    private let specificDate = NSDateComponents()

    fileprivate let sectionInsets = UIEdgeInsets(top: 50.0, left: 0, bottom : 50.0, right: 20.0)
    var monthInfo : [Int:[Int]] = [Int:[Int]]()

    private var weekdayOffset: Int {
        get{
            var components = calendar.dateComponents([.year, .month, .day], from: currentDate)
            components.day = 1
            components.month = 2
            let startOfMonth = calendar.date(from: components)
    return self.calendar.component(.weekday, from: startOfMonth!)

        }

    }



    override func viewDidLoad() {
        super.viewDidLoad()


        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Register cell classes


        // Do any additional setup after loading the view.
        collectionView?.backgroundColor = UIColor.white

        //collectionView?.register(headerView.self, forCellWithReuseIdentifier:"headerId" )
        //collectionView?.register(<#T##nib: UINib?##UINib?#>, forSupplementaryViewOfKind: <#T##String#>, withReuseIdentifier: <#T##String#>)

       // setupMenuBar()
    }

    var dayLabel : UIView {
    let v = UIView()
    let formatter: DateFormatter = DateFormatter()
        for index in 1...7 {
        let day = formatter.shortWeekdaySymbols[index] as NSString
        let weekdayLabel = UILabel()
        weekdayLabel.text = day as String
        weekdayLabel.textAlignment = NSTextAlignment.center
            v.addSubview(weekdayLabel)

        }

    view.addSubview(v)
    return v



    }








/*
    let menu: MenuBar = {
        let mb = MenuBar()
        return mb

    }()

    private func setupMenuBar(){
        view.addSubview(menu)
        let views = ["menu" : menu]

        let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:|-20-[menu]|",options: [], metrics: nil, views: views)

          let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|-20-[menu(50)]",options: [], metrics: nil, views: views)

        view.addConstraints(horizontalConstraints)
        view.addConstraints(verticalConstraints)

    }
 */


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

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */

    // MARK: UICollectionViewDataSource

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }


    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of items

        //let range = calendar.range(of: .day, in: .month, for:currentDate)!


        //return range.count

        return 42
    }

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

        // Configure the cell

        //let currentMonthInfo : [Int] = monthInfo[indexPath.section]!
        /*
        let fdIndex = currentMonthInfo[FIRST_DAY_INDEX]
        let nDays = currentMonthInfo[NUMBER_DAYS_INDEX]
        let fromStartOfMonthIndexPath = NSIndexPath(forItem: IndexPath.item - fdIndex, inSection: indexPath.section)

        if indexPath.item
         */
          var components = calendar.dateComponents([.day, .month, .year], from: currentDate)
        components.month = 2
        let date = calendar.date(from: components)!
        let range = calendar.range(of: .day, in: .month, for:date)!

        //let range = calendar.range(of: .day, in: .month, for:currentDate)!

        print(range.count)

        cell.backgroundColor = UIColor.white

        if isValidDayCell(indexPath: indexPath as NSIndexPath) && indexPath.item < weekdayOffset + range.count
        {

            //print(weekdayOffset)
        //var dayToDisplay = indexPath.row - weekdayOffset
        cell.DaysCell.text = String(indexPath.item + 1 - weekdayOffset)

        }

        else
        {
            cell.DaysCell.text = ""

        }
        return cell
    }


    private let headerIdentifier = "headerId"

 override   func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView
 {
        let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: headerIdentifier, for: indexPath) as! headerView

    //header.title.text = "calendar"

    dateFormatter.locale = NSLocale.current

    dateFormatter.dateStyle = .full

    //var convertedDate = dateFormatter.string(from: currentDate)

    var components = calendar.dateComponents([.day, .month, .year], from: currentDate)
    components.month = 2
    let monthName = DateFormatter().monthSymbols[components.month! - 1]


    //header.updateMonthHeader(text: String(components.month!))

    header.updateMonthHeader(text: monthName)
    //header.backgroundColor = UIColor.black

    return header

}






    func isValidDayCell(indexPath: NSIndexPath) -> Bool {

    return indexPath.row >= weekdayOffset

    }



    fileprivate let itemsPerRow: CGFloat = 10






    // MARK: UICollectionViewDelegate

    /*
    // Uncomment this method to specify if the specified item should be highlighted during tracking
    override func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }
    */

    /*
    // Uncomment this method to specify if the specified item should be selected
    override func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
        return true
    }
    */

    /*
    // Uncomment these methods to specify if an action menu should be displayed for the specified item, and react to actions performed on the item
    override func collectionView(_ collectionView: UICollectionView, shouldShowMenuForItemAt indexPath: IndexPath) -> Bool {
        return false
    }

    override func collectionView(_ collectionView: UICollectionView, canPerformAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
        return false
    }

    override func collectionView(_ collectionView: UICollectionView, performAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) {

    }
    */

}

extension DaysViewController : UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        let widthPerItem = view.frame.width / itemsPerRow

        return CGSize(width: widthPerItem, height: widthPerItem)

    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets{
        return sectionInsets
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 20

    }


    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        if collectionView.dataSource != nil {
        let size = CGSize(width: view.frame.width, height:  headerHeight)
        return size
        }
        else
            {
                return CGSize(dictionaryRepresentation: 0 as! CFDictionary)!
        }



}



}

2 个答案:

答案 0 :(得分:2)

您尚未向C:\Users\sw>D:\workspaces\OpenSceneGraph\runexamples.bat C:\Users\sw>echo osgversion osgversion C:\Users\sw>osgversion OpenSceneGraph Library 3.5.1 C:\Users\sw>echo osgunittests osgunittests C:\Users\sw>osgunittests matrix 'osgunittests' is not recognized as an internal or external command, operable program or batch file. C:\Users\sw>osgunittests qt 'osgunittests' is not recognized as an internal or external command, operable program or batch file. ......

添加任何尺寸
UIView

所以而不是

UIView(frame: CGRect(x:  WHATEVER , y:  WHATEVER, width: WHATEVER , height: WHATEVER))

应该是

let v = UIView()

正如NiravD所说,你还应该定义let v = UIView(frame: CGRect(x: WHATEVER , y: WHATEVER, width: WHATEVER , height: WHATEVER)) 框架

答案 1 :(得分:1)

这可能对您有所帮助:

  func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
 {
let view = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 100))
//Header view
let headerView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 49))
let OrderDate = UILabel(frame: CGRect(x: 10, y: 10, width: 150, height: 30))
OrderDate.textColor = UIColor(red: 24/255, green: 24/255, blue: 24/255, alpha: 1)
OrderDate.font = UIFont(name: "JosefinSans-Regular_0.ttf", size: 23)
OrderDate.text = order_date[section]
headerView.addSubview(OrderDate)
headerView.backgroundColor = UIColor(red: 198/255, green: 198/255, blue: 198/255, alpha: 1)

headerView.addSubview(upDownImageView)


view.addSubview(headerView)

return view
}
  func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return 150
 }