• 我们使用Storyboard布局的时候,很多子单元页面会独立到xib布局,那么这个xib如何添加到storyboard呢?下面我们看看Swift下怎么操作。一、准备工作 新建Xcode工程 新建一个UIView:MyView.swift 集成自UIView ...

    猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!
    原文地址: http://blog.csdn.net/cocos2der/article/details/51657154

    我们使用Storyboard布局的时候,很多子单元页面会独立到xib布局中,那么这个xib如何添加到storyboard中呢?下面我们看看Swift下怎么操作。


    一、准备工作

    1. 新建Xcode工程
    2. 新建一个UIView:MyView.swift 集成自UIView
    3. 新建一个UIView的xib布局文件:MyView.xib
      这个是我MyView.xib内容:
      这里写图片描述

    二、互相关联MyView.xib与MyView.swift

    xib关联到MyView.swift

    1. 设置MyView.xib的File’s Owner 的Custom Class为MyView
    2. 注意:不要修改MyView.xib下View的Custom Class,保存其为默认的UIView。
      这里写图片描述

    MyView.swift设置

    1. 将MyView.xib下的View拖拽到MyView.swift中关联IBOutlet属性变量:view
        @IBOutlet var view: UIView!
    1. 添加初始化代码在MyView.swift中:
        override init(frame: CGRect) {
            super.init(frame: frame)
            initViewFromNib()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            initViewFromNib()
        }
    
        private func initViewFromNib(){
            // 需要这句代码,不能直接写UINib(nibName: "MyView", bundle: nil),不然不能在storyboard中显示
            let bundle = Bundle(for: type(of: self))
            let nib = UINib(nibName: "MyView", bundle: bundle)
            self.view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
            self.view.frame = bounds
            self.addSubview(view)
    
            // Do any additional setup after loading the view.
    
        }

    三、添加MyView.xib到Main.storyboard

    1. 拖拽一个UIView到Main.storyboard中,设置该UIView的Custom Class为MyView, 添加一下布局约束。
      这里写图片描述

    OK, 现在运行Xcode,是不是看到app运行后,自己的xib已经出来了。


    四、让Xcode下Main.storyboard中预览xib

    细心的朋友注意到了,Main.storyboard中没有刷新xib视图,只能运行后才能看到,下面我们让Main.storyboard中也能预览xib。
    1. 添加@IBDesignable属性
    2. 添加Main.storyboard下xib初始化方法
    3. 注意:
    - Xcode非运行状态下storyboard加载xib使用NSBundle.mainBundle().loadNibNamed会出现找不到xib文件的错误。
    - xib加载后,需要设置其frame大小,不然frame会是xib中的大小。
    - 每次选中storyboard,都会自动Build一次来刷新其中xib视图,如果过程中出现错误信息可以直接Xcode下查看,如果出现Crash错误,Xcode下不会显示,此时去查看下面的crash文件来帮助你定位问题。

    ~/Library/Logs/DiagnosticReports/IBDesignablesxxxxxxx.crash

    下面是完整MyView.swift

    import UIKit
    
    @IBDesignable class MyView: UIView {
    
        @IBOutlet var view: UIView!
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            initViewFromNib()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            initViewFromNib()
        }
    
        private func initViewFromNib(){
            // 需要这句代码,不能直接写UINib(nibName: "MyView", bundle: nil),不然不能在storyboard中显示
            let bundle = Bundle(for: type(of: self))
            let nib = UINib(nibName: "MyView", bundle: bundle)
            self.view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
            self.view.frame = bounds
            self.addSubview(view)
    
            // Do any additional setup after loading the view.
    
        }
    
        @IBAction func tapped(sender: AnyObject) {
            print("tappd")
        }
    }

    效果图:
    这里写图片描述

    展开全文
  • 进行xib作业的时候常常会出现xib嵌套不显示的问题,如下面草图所示: MyView是Xib拖出来的,SubView也同样是,MyView的左侧Class:输入SubView,在SubView左侧输入SubView,这符合一贯的思路,但是运行起来不会...

    进行xib作业的时候常常会出现xib嵌套不显示的问题,如下面草图所示: MyView是Xib拖出来的,SubView也同样是,MyView中的左侧Class:输入SubView,在SubView中左侧输入SubView,这符合一贯的思路,但是运行起来不会显示你的SubView,这就出现了嵌套Xib不显示的问题,解决思路:

    1.在SubView.Xib文件中,右侧导航栏Class:不填,保持原来的类型,在Placeholder--File's Owner下修改Class:SubView
    2.在SubView.Swift文件中 ,SubView遵守一个自己封装的协议XibNestableView,如下:class SubView: XibNestableView {},  初始化方法为:
    
    required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    

    XibNestableView.Swift 拖入到工程文件中,文件内容为:

    import UIKit
    /// Xib 嵌套 Nib 所需继承的 View
    class XibNestableView : UIView , NibLoadable {    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            if let view = UINib(nibName: String(describing: type(of: self)), bundle: nil).instantiate(withOwner: nil, options: nil)[0] as? UIView {
                view.equal(to: self)
            }
        }
    }
    

    NibLoadable.Swift文件拖入工程中,内容为:

    import UIKit
    
    /// 标志符协议
    protocol NameIdentifierable {}
    
    extension NameIdentifierable {
        /// 将类型名称作为标识符字符串
        static var identifier: String {
            return String(describing: self)
        }
    }
    
    /// 加载 Xib 协议
    protocol NibLoadable: NameIdentifierable {}
    
    extension NibLoadable where Self : AnyObject {
        /// 加载 Xib 中的 Nib 文件,Xib文件名称需与类型名称相同
        static var nib: UINib {
            return UINib(nibName: identifier, bundle: Bundle(for: self))
        }
    }
    
    extension NibLoadable where Self: UIView {
        
        /// 从 Nib 文件中加载 View
        ///
        /// - Returns: 实现 NibLoadable 的 UIView
        /// 例子: let view = UIView.loadFromNib()
        static func loadFromNib() -> Self {
            guard let view = nib.instantiate(withOwner: nil, options: nil).first as? Self else {
                fatalError("\(nib) Nib 文件的根视图需为 \(self) 类型")
            }
            return view
        }
    }
    
    protocol NibOwnerLoadable : NameIdentifierable {}
    
    extension NibOwnerLoadable where Self : AnyObject {
        
        /// 加载 Xib 中的 Nib 文件,Xib文件名称需与类型名称相同
        static var nib: UINib {
            return UINib(nibName: identifier, bundle: Bundle(for: self))
        }
    }
    
    extension NibOwnerLoadable where Self: UIView {
        
        
        /// 加载 File’s Owner 中的内容
        /// 例子: required init?(coder aDecoder: NSCoder) {
        ///         super.init(coder: aDecoder)
        ///         self.loadNibContent()
        ///       }
        func loadNibContent() {
            let layoutAttributes: [NSLayoutConstraint.Attribute] = [.top, .leading, .bottom, .trailing]
            for case let view as UIView in Self.nib.instantiate(withOwner: self, options: nil) {
                view.translatesAutoresizingMaskIntoConstraints = false
                self.addSubview(view)
                NSLayoutConstraint.activate(layoutAttributes.map { attribute in
                    NSLayoutConstraint(
                        item: view, attribute: attribute,
                        relatedBy: .equal,
                        toItem: self, attribute: attribute,
                        multiplier: 1, constant: 0.0
                    )
                })
            }
        }
    }
    
    /// 加载 Storyboard 协议
    protocol StoryboardLoadable {
        
        /// 需要加在的 Storyboard 的名字
        static var storyboardName: String? { get }
    }
    
    extension StoryboardLoadable where Self : AnyObject, Self : NameIdentifierable {
        
        /// 创建与 storyboardName 相同的 Storyboard, 若 storyboardName 为空则创建与当前类型名字相同的 Storyboard
        static var storyboard: UIStoryboard {
            return UIStoryboard(name: storyboardName ?? identifier, bundle: Bundle(for: self))
        }
    }
    
    /// Storyboard 中的控制器加载协议
    protocol StoryboardSceneLoadable : NameIdentifierable {
       
        /// 需要提供目标 Storyboard, 可通过 StoryboardLoadable 协议创建
        static var storyboard: UIStoryboard { get }
    }
    
    extension StoryboardSceneLoadable {
        
        /// ViewController 的标志符
        static var sceneIdentifier: String {
            return identifier
        }
    }
    
    extension StoryboardSceneLoadable where Self: UIViewController {
        //
        /// 从 storyboard 中加载标志为 sceneIdentifier 的 ViewController
        ///
        /// - Returns: 标志为 sceneIdentifier 的 ViewController
        static func instantiate() -> Self {
            let storyboard = Self.storyboard
            let viewController = storyboard.instantiateViewController(withIdentifier: self.sceneIdentifier)
            guard let typedViewController = viewController as? Self else {
                fatalError("\(storyboard) 中的 '\(self.sceneIdentifier)'控制器不是 '\(self)' 类型")
            }
            return typedViewController
        }
    }
    

    NibLoadable.Swift 协议的作用是将创建View由原来的方式:

    let alertView = Bundle.main.loadNibNamed("BatchCloseAlertView", owner: vc, options: nil)?.first as! BatchCloseAlertView
    

    修改为:

    let alertView = BatchCloseAlertView.loadFromNib()
    

    在这里插入图片描述

    展开全文
  • 有时候我们创建一个Cell或者View,在使用Xib创建时,可能会引入另外一个Xib文件,这时需要设置autoresizingMask 属性值,对页面整体进行适配。 _footerView.autoresizingMask = UIViewAutoresizingFlexibleWidth; ...

    有时候我们创建一个Cell或者View,在使用Xib创建时,可能会引入另外一个Xib文件,这时需要设置autoresizingMask 属性值,对页面整体进行适配。

    _footerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;

     

    属性值具体解释如下:

    UIViewAutoresizingNone

    不会随父视图的改变而改变

    UIViewAutoresizingFlexibleLeftMargin

    自动调整view与父视图左边距,以保证右边距不变

    UIViewAutoresizingFlexibleWidth

    自动调整view的宽度,保证左边距和右边距不变

    UIViewAutoresizingFlexibleRightMargin

    自动调整view与父视图右边距,以保证左边距不变

    UIViewAutoresizingFlexibleTopMargin

    自动调整view与父视图上边距,以保证下边距不变

    UIViewAutoresizingFlexibleHeight

    自动调整view的高度,以保证上边距和下边距不变

    UIViewAutoresizingFlexibleBottomMargin

    自动调整view与父视图的下边距,以保证上边距不变

     

    展开全文
  • 有时要实现一个复杂的页面布局,单单使用 UITableView 实现不了,需要通过 UITableView 和 UICollectionView 结合实现,即每个单元格 tableViewCell 中都嵌套一个 collectionView。下面通过样例演示如何...
    有时要实现一个复杂的页面布局,单单使用 UITableView 实现不了,需要通过 UITableView 和 UICollectionView 结合实现,即每个单元格 tableViewCell 中都嵌套一个 collectionView。下面通过样例演示如何实现。


    1,效果图

    (1)表格中每一个单元格对应一个月份的图书列表。
    (2)单元格中头部显示月份标题。内部通过 collectionView 显示当月所有书籍封面图片,数量不定。整个单元格高度自适应。
    (3)这个样例其实只用多 section 的 collectionView 也能实现(点击查看)。本文使用 UITableView UICollectionView 演示如何实现同样的功能,
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    2,如何实现单元格高度自适应

    (1)我们要对 collectionView 设置个高度约束。当在单元格中更新 collectionView 的数据时,要获取这个 collectionView 的真实的内容高度(contentSize.height),然后用 contentSize.height 来更新 collectionView 的高度约束。这样就实现了单元格内部 collectionView 的高度自适应。
    (2)而对于单元格 tableViewCell 的高度自适应,是通过 AutoLayout 特性实现的。利用内容将 cell 撑起来。
    1
    2
    3
    4
    //设置estimatedRowHeight属性默认值
    self.tableView!.estimatedRowHeight = 44.0
    //rowHeight属性设置为UITableViewAutomaticDimension
    self.tableView!.rowHeight = UITableViewAutomaticDimension

    3,实现步骤

    (1)新建一个自定义的 collectionView 单元格类:MyCollectionViewCell,同时勾选“Also create XIB file
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (2)在 MyCollectionViewCell.xib 中添加一个 ImageView,并设置好约束。同时在对应的类中作关联
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (3)MyCollectionViewCell.swift 代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import UIKit
     
    class MyCollectionViewCellUICollectionViewCell {
     
        //用于显示封面缩略图
        @IBOutlet weak var imageView: UIImageView!
         
        override func awakeFromNib() {
            super.awakeFromNib()
        }
    }

    (4)新建一个自定义的 tableView 单元格类:MyTableViewCell,同时勾选“Also create XIB file
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (5)在 MyTableViewCell.xib 中添加一个 Label 和一个 CollectionView,并设置好约束。同时在对应的类中作关联。
    其中 Label 设置的是上、下、左、右4个约束:
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    CollectionView 设置的是左、右、下以及高度这个4个约束:
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    同时调整下 CollectionView 的 Cell Size 和 Min Spacing
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (6)MyTableViewCell.swift 代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    import UIKit
     
    class MyTableViewCellUITableViewCellUICollectionViewDelegateUICollectionViewDataSource
    {
         
        //单元格标题
        @IBOutlet weak var titleLabel: UILabel!
         
        //封面图片集合列表
        @IBOutlet weak var collectionView: UICollectionView!
         
        //collectionView的高度约束
        @IBOutlet weak var collectionViewHeight: NSLayoutConstraint!
         
        //封面数据
        var images:[String] = []
         
        override func awakeFromNib() {
            super.awakeFromNib()
             
            //设置collectionView的代理
            self.collectionView.delegate = self
            self.collectionView.dataSource = self
             
            // 注册CollectionViewCell
            self.collectionView!.register(UINib(nibName:"MyCollectionViewCell", bundle:nil),
                                          forCellWithReuseIdentifier: "myCell")
        }
         
        //加载数据
        func reloadData(title:String, images:[String]) {
            //设置标题
            self.titleLabel.text = title
            //保存图片数据
            self.images = images
             
            //collectionView重新加载数据
            self.collectionView.reloadData()
             
            //更新collectionView的高度约束
            let contentSize = self.collectionView.collectionViewLayout.collectionViewContentSize
            collectionViewHeight.constant = contentSize.height
             
            self.collectionView.collectionViewLayout.invalidateLayout()
        }
         
        //返回collectionView的单元格数量
        func collectionView(_ collectionView: UICollectionView,
                            numberOfItemsInSection section: Int) -> Int {
            return images.count
        }
         
        //返回对应的单元格
        func collectionView(_ collectionView: UICollectionView,
                            cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell  = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell",
                                                    for: indexPath) asMyCollectionViewCell
            cell.imageView.image = UIImage(named: images[indexPath.item])
            return cell
        }
         
        //绘制单元格底部横线
        override func draw(_ rect: CGRect) {
            //线宽
            let lineWidth = 1 / UIScreen.main.scale
            //线偏移量
            let lineAdjustOffset = 1 / UIScreen.main.scale / 2
            //线条颜色
            let lineColor = UIColor(red: 0xe0/255, green: 0xe0/255, blue: 0xe0/255, alpha: 1)
             
            //获取绘图上下文
            guard let context = UIGraphicsGetCurrentContext() else {
                return
            }
             
            //创建一个矩形,它的所有边都内缩固定的偏移量
            let drawingRect = self.bounds.insetBy(dx: lineAdjustOffset, dy: lineAdjustOffset)
             
            //创建并设置路径
            let path = CGMutablePath()
            path.move(to: CGPoint(x: drawingRect.minX, y: drawingRect.maxY))
            path.addLine(to: CGPoint(x: drawingRect.maxX, y: drawingRect.maxY))
             
            //添加路径到图形上下文
            context.addPath(path)
             
            //设置笔触颜色
            context.setStrokeColor(lineColor.cgColor)
            //设置笔触宽度
            context.setLineWidth(lineWidth)
             
            //绘制路径
            context.strokePath()
        }
         
        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
        }
    }

    (7)在 StoryBoard 主视图中添加一个 TableView,并设置好约束。同时在对应的类中作关联。
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (8)ViewController.swift 代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    import UIKit
     
    //每月书籍
    struct BookPreview {
        var title:String
        var images:[String]
    }
     
    class ViewControllerUIViewControllerUITableViewDelegateUITableViewDataSource {
         
        //所有书籍数据
        let books = [
            BookPreview(title: "五月新书", images: ["0.jpg""1.jpg","2.jpg""3.jpg",
                                                        "4.jpg","5.jpg","6.jpg"]),
            BookPreview(title: "六月新书", images: ["7.jpg""8.jpg""9.jpg"]),
            BookPreview(title: "七月新书", images: ["10.jpg""11.jpg""12.jpg""13.jpg"])
        ]
         
        //显示内容的tableView
        @IBOutlet weak var tableView: UITableView!
         
        override func loadView() {
            super.loadView()
        }
         
        override func viewDidLoad() {
            super.viewDidLoad()
             
            //设置tableView代理
            self.tableView!.delegate = self
            self.tableView!.dataSource = self
             
            //去除单元格分隔线
            self.tableView!.separatorStyle = .none
             
            //创建一个重用的单元格
            self.tableView!.register(UINib(nibName:"MyTableViewCell", bundle:nil),
                                     forCellReuseIdentifier:"myCell")
             
            //设置estimatedRowHeight属性默认值
            self.tableView!.estimatedRowHeight = 44.0
            //rowHeight属性设置为UITableViewAutomaticDimension
            self.tableView!.rowHeight = UITableViewAutomaticDimension
        }
         
        //在本例中,只有一个分区
        func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return 1;
        }
         
        //返回表格行数
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.books.count
        }
         
         
        //创建各单元显示内容(创建参数indexPath指定的单元)
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
            -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "myCell")
                asMyTableViewCell
             
            //下面这两个语句一定要添加,否则第一屏显示的collection view尺寸,以及里面的单元格位置会不正确
            cell.frame = tableView.bounds
            cell.layoutIfNeeded()
             
            //重新加载单元格数据
            cell.reloadData(title:books[indexPath.row].title,
                            images: books[indexPath.row].images)
            return cell
        }
         
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
    源码下载hangge_1591.zip

    功能修改:每个单元格只显示一行封面图片

    上面的样例中,每个单元格内的图片是全部显示出来,有多少显示多少,高度自适应。
    我们还可以换种展示方法,每个单元格,即每个 collectionView 只显示一行数据,图片如果多的话可以通过左右滑动查看。

    1,效果图

       原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)      原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    2,实现原理

    我们只需要把 collectionView 的滚动方向改成水平方向即可。
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    如果不需要显示横向的滚动条,可以去掉“Shows Horizontal Indicator”的勾选。
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    原文链接:http://www.hangge.com/blog/cache/detail_1591.html
    展开全文
  • 有时要实现一个复杂的页面布局,单单使用 UITableView 实现不了,需要通过 UITableView 和 UICollectionView 结合实现,即每个单元格 tableViewCell 中都嵌套一个 collectionView。下面通过样例演示如何...
    有时要实现一个复杂的页面布局,单单使用 UITableView 实现不了,需要通过 UITableView 和 UICollectionView 结合实现,即每个单元格 tableViewCell 中都嵌套一个 collectionView。下面通过样例演示如何实现。


    1,效果图

    (1)表格中每一个单元格对应一个月份的图书列表。
    (2)单元格中头部显示月份标题。内部通过 collectionView 显示当月所有书籍封面图片,数量不定。整个单元格高度自适应。
    (3)这个样例其实只用多 section 的 collectionView 也能实现(点击查看)。本文使用 UITableView UICollectionView 演示如何实现同样的功能,
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    2,如何实现单元格高度自适应

    (1)我们要对 collectionView 设置个高度约束。当在单元格中更新 collectionView 的数据时,要获取这个 collectionView 的真实的内容高度(contentSize.height),然后用 contentSize.height 来更新 collectionView 的高度约束。这样就实现了单元格内部 collectionView 的高度自适应。
    (2)而对于单元格 tableViewCell 的高度自适应,是通过 AutoLayout 特性实现的。利用内容将 cell 撑起来。
    1
    2
    3
    4
    //设置estimatedRowHeight属性默认值
    self.tableView!.estimatedRowHeight = 44.0
    //rowHeight属性设置为UITableViewAutomaticDimension
    self.tableView!.rowHeight = UITableViewAutomaticDimension

    3,实现步骤

    (1)新建一个自定义的 collectionView 单元格类:MyCollectionViewCell,同时勾选“Also create XIB file
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (2)在 MyCollectionViewCell.xib 中添加一个 ImageView,并设置好约束。同时在对应的类中作关联
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (3)MyCollectionViewCell.swift 代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import UIKit
     
    class MyCollectionViewCellUICollectionViewCell {
     
        //用于显示封面缩略图
        @IBOutlet weak var imageView: UIImageView!
         
        override func awakeFromNib() {
            super.awakeFromNib()
        }
    }

    (4)新建一个自定义的 tableView 单元格类:MyTableViewCell,同时勾选“Also create XIB file
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (5)在 MyTableViewCell.xib 中添加一个 Label 和一个 CollectionView,并设置好约束。同时在对应的类中作关联。
    其中 Label 设置的是上、下、左、右4个约束:
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    CollectionView 设置的是左、右、下以及高度这个4个约束:
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (6)MyTableViewCell.swift 代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    import UIKit
     
    class MyTableViewCellUITableViewCellUICollectionViewDelegateUICollectionViewDataSource
    {
         
        //单元格标题
        @IBOutlet weak var titleLabel: UILabel!
         
        //封面图片集合列表
        @IBOutlet weak var collectionView: UICollectionView!
         
        //collectionView的高度约束
        @IBOutlet weak var collectionViewHeight: NSLayoutConstraint!
         
        //封面数据
        var images:[String] = []
         
        override func awakeFromNib() {
            super.awakeFromNib()
             
            //设置collectionView的代理
            self.collectionView.delegate = self
            self.collectionView.dataSource = self
             
            // 注册CollectionViewCell
            self.collectionView!.register(UINib(nibName:"MyCollectionViewCell", bundle:nil),
                                          forCellWithReuseIdentifier: "myCell")
        }
         
        //加载数据
        func reloadData(title:String, images:[String]) {
            //设置标题
            self.titleLabel.text = title
            //保存图片数据
            self.images = images
             
            //collectionView重新加载数据
            self.collectionView.reloadData()
             
            //更新collectionView的高度约束
            let contentSize = self.collectionView.collectionViewLayout.collectionViewContentSize
            collectionViewHeight.constant = contentSize.height
        }
         
        //返回collectionView的单元格数量
        func collectionView(_ collectionView: UICollectionView,
                            numberOfItemsInSection section: Int) -> Int {
            return images.count
        }
         
        //返回对应的单元格
        func collectionView(_ collectionView: UICollectionView,
                            cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell  = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell",
                                                    for: indexPath) asMyCollectionViewCell
            cell.imageView.image = UIImage(named: images[indexPath.item])
            return cell
        }
         
        //绘制单元格底部横线
        override func draw(_ rect: CGRect) {
            //线宽
            let lineWidth = 1 / UIScreen.main.scale
            //线偏移量
            let lineAdjustOffset = 1 / UIScreen.main.scale / 2
            //线条颜色
            let lineColor = UIColor(red: 0xe0/255, green: 0xe0/255, blue: 0xe0/255, alpha: 1)
             
            //获取绘图上下文
            guard let context = UIGraphicsGetCurrentContext() else {
                return
            }
             
            //创建一个矩形,它的所有边都内缩固定的偏移量
            let drawingRect = self.bounds.insetBy(dx: lineAdjustOffset, dy: lineAdjustOffset)
             
            //创建并设置路径
            let path = CGMutablePath()
            path.move(to: CGPoint(x: drawingRect.minX, y: drawingRect.maxY))
            path.addLine(to: CGPoint(x: drawingRect.maxX, y: drawingRect.maxY))
             
            //添加路径到图形上下文
            context.addPath(path)
             
            //设置笔触颜色
            context.setStrokeColor(lineColor.cgColor)
            //设置笔触宽度
            context.setLineWidth(lineWidth)
             
            //绘制路径
            context.strokePath()
        }
         
        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
        }
    }

    (7)在 StoryBoard 主视图中添加一个 TableView,并设置好约束。同时在对应的类中作关联。
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    (8)ViewController.swift 代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    import UIKit
     
    //每月书籍
    struct BookPreview {
        var title:String
        var images:[String]
    }
     
    class ViewControllerUIViewControllerUITableViewDelegateUITableViewDataSource {
         
        //所有书籍数据
        let books = [
            BookPreview(title: "五月新书", images: ["0.jpg""1.jpg","2.jpg""3.jpg",
                                                        "4.jpg","5.jpg","6.jpg"]),
            BookPreview(title: "六月新书", images: ["7.jpg""8.jpg""9.jpg"]),
            BookPreview(title: "七月新书", images: ["10.jpg""11.jpg""12.jpg""13.jpg"])
        ]
         
        //显示内容的tableView
        @IBOutlet weak var tableView: UITableView!
         
        override func loadView() {
            super.loadView()
        }
         
        override func viewDidLoad() {
            super.viewDidLoad()
             
            //设置tableView代理
            self.tableView!.delegate = self
            self.tableView!.dataSource = self
             
            //去除单元格分隔线
            self.tableView!.separatorStyle = .none
             
            //创建一个重用的单元格
            self.tableView!.register(UINib(nibName:"MyTableViewCell", bundle:nil),
                                     forCellReuseIdentifier:"myCell")
             
            //设置estimatedRowHeight属性默认值
            self.tableView!.estimatedRowHeight = 44.0
            //rowHeight属性设置为UITableViewAutomaticDimension
            self.tableView!.rowHeight = UITableViewAutomaticDimension
        }
         
        //在本例中,只有一个分区
        func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return 1;
        }
         
        //返回表格行数
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.books.count
        }
         
         
        //创建各单元显示内容(创建参数indexPath指定的单元)
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
            -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "myCell")
                asMyTableViewCell
             
            //下面这两个语句一定要添加,否则第一屏显示的collection view尺寸,以及里面的单元格位置会不正确
            cell.frame = tableView.bounds
            cell.layoutIfNeeded()
             
            //重新加载单元格数据
            cell.reloadData(title:books[indexPath.row].title,
                            images: books[indexPath.row].images)
            return cell
        }
         
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
    源码下载hangge_1591.zip

    功能修改:每个单元格只显示一行封面图片

    上面的样例中,每个单元格内的图片是全部显示出来,有多少显示多少,高度自适应。
    我们还可以换种展示方法,每个单元格,即每个 collectionView 只显示一行数据,图片如果多的话可以通过左右滑动查看。

    1,效果图

       原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)      原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    2,实现原理

    我们只需要把 collectionView 的滚动方向改成水平方向即可。
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    如果不需要显示横向的滚动条,可以去掉“Shows Horizontal Indicator”的勾选。
    原文:Swift - 实现表格tableViewCell里嵌套collectionView(附样例)

    原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_1591.html
    展开全文
  • Swift 优雅的适配大小

    2018-12-07 10:42:09
    在日常开发常常会对设备进行一定的适配,为了方便在多个项目里统一管理和使用,所以封装并开源了SwiftyFitsize这个库,可用于适配视图及字体大小,同时也支持xib和故事板 GitHub:SwiftyFitsize 最终的效果如下...
  • 不同于国外,StoryBoard从面世到如今饱受国内开发者的质疑,质疑的理由...StoryBoard 和 Xib 都是用来分离UI样式代码,改善视图代码重用率,增加所见即所得,降低视图测试繁复度的视图系列化工具, 其中Xib以视图V...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 自定义一个子控制器类,可以使用代码、XIB或者StoryBoard等方式在父控制器类,添加一个子控制器属性,注意:添加strong属性 #import "SubViewController.h" @interface ViewController () @property (nonatomic...
  • 我从2009年开始做Android开发,开始接触Swift是在2014年底,当时组里曾经做过一个Demo App,感觉技术还不够成熟没有正式发布。2016年初我们正式使用swift开发上线了销售助手App产品,积累了比较丰富的swift项目实战...
  • DNSPageView一个纯Swift的轻量级、灵活且易于使用的pageView框架,titleView和contentView可以布局在任意地方,可以纯代码初始化,也可以使用xib或者storyboard初始化,并且提供了常见样式属性进行设置。 ...
  • 本文旨在帮助开发者快速从OC开发过渡到Swift开发,挑选了一些比较浅显的但是比较常用的Swift语法特性,在介绍的过程,通常会拿OC的语言特性作比较,让大家更好的注意到Swift的不同。 另外需要说明的是,笔者也...
  • 本文来源于 https://github.com/hpique/SwiftSingleton 开源项目 个人li
  • Swift 开源项目汇总

    2019-09-16 16:07:05
    Swift 开源项目汇总
  • 实习离职在宿舍,当然也不能闲着,把一些常用的、... y, width, height),还需要在storyboard确定其ContentSize的大小。 通常来讲 1.ScrollView没有固定的高度、宽度。一般都是与SuperView发生联系(eg:距离父
  • - (void)webViewDidFinishLoad:(UIWebView *)webView {   NSString * js = @"var script = document.createElement('script');"   "script.type = 'text/javascript';..."script.text = \
  • Swift学习资料@SwiftGuide很赞 的Swift学习资料leetcode一个练习、评估自己水平的代码平台,跟ACM有点类似完整App@Swift 30 Projects- 最新 Swift 3.0 的30个小App,更注重代码规范和架构设计(故胤道长)V2ex-Swift- ...
  • 要是我下面的代码能够帮到到家希望你们关注一下我的bog哦。。 以前实现过这个功能。后来项目需求去掉,,后来又要做到这一步,,好久没有搞了,刚刚一会就是不可以实现,后来就用block来解决了这个问题,做完需求...
  • iOS精选源码 ...多个UIScrollView、UITableView嵌套 Swift仿QQ空间可拉伸头部控件 iOS 传感器集锦 基于UICollectionView封装高性能轮播图 应用间跳转传值和强更设置 iOS优质博客 iOS实现网易云音乐右...
  • iOS精选源码 ...多个UIScrollView、UITableView嵌套 Swift仿QQ空间可拉伸头部控件 iOS 传感器集锦 基于UICollectionView封装高性能轮播图 应用间跳转传值和强更设置 iOS优质博客 iOS实现网易云音...
1 2 3 4 5 ... 17
收藏数 325
精华内容 130
热门标签