具有自定义视图的UITableViewCell

时间:2016-06-04 17:55:02

标签: swift uitableview user-interface

我正在拼命尝试将自定义视图添加到UITableViewCell。我在Storyboard中有一个UITableViewController,它链接到一个TestTableViewController类,原型单元格的标识符为“Cell2”。

所以这是UITableViewController中的代码:

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return dataArray.count
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 190
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell2", forIndexPath: indexPath)
    let data = dataArray[indexPath.row]

    let ticket = YellowTackleTicketComplete()
    ticket.frame = CGRect(x: 20, y: 20, width: 335, height: 150)

    cell.addSubview(ticket)

    //        cell.textLabel!.text = tackl!.valueForKey("title") as? String
    cell.backgroundColor = UIColor.clearColor()
    print(cell.subviews)


    return cell
}

dataArray仅用于测试目的,其中包含一个项目。所以我得到的是一个带有一个空单元格的表视图。在Xcode UI Debugger中,我可以看到自定义视图。但它没有在模拟器或设备上显示。

enter image description here

如果有人可以提供帮助,那么非常感谢你!

这是视图的代码:

class YellowTackleTicketComplete: UIView {


    var containerView: UIView!
    var ticket: TacklTicket!
    var dropDownMenu: YellowDrawer!
    var dropDownBackground: YellowDrawerBackground!
    var ticketShadowLine: UIView!


    var lowAlphaView: UIView!
    var outbackButton: UIButton!
    var arrowView: UIView!

    var bounceHeight: CGFloat?
    var dropdownHeight: CGFloat?
    var topBorder: CGFloat?
    var bottomBorder: CGFloat?
    //let arrowLayer = CALayer()
    //let layerDelegate = LayerDelegate()
    var dropDownElements = [String]()
    var dropped = false
    var animating = false
    var delegate: YellowTackleTicketCompleteDelegate?

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.addObserver(self, forKeyPath: "highlighted", options: NSKeyValueObservingOptions.New, context: nil)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.addObserver(self, forKeyPath: "highlighted", options: NSKeyValueObservingOptions.New, context: nil)
    }

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        self.setNeedsDisplay()
        if keyPath == "frame" {
            // Set up DropdownMenu
            self.dropDownBackground.frame.size.height = self.dropDownMenu.frame.maxY
        }

    }

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
        if(!self.clipsToBounds && !self.hidden && self.alpha > 0.0){
            let subviews = self.subviews.reverse()
            for member in subviews {
                let subPoint = member.convertPoint(point, fromView: self)
                if let result:UIView = member.hitTest(subPoint, withEvent:event) {
                    return result;
                }
            }
        }
        return nil
    }

    func ticketTapped() {
                //if !animating {
        if !dropped {
            showDropdown()
            NSLog("#")
//            NSLog("Scrolling to \((dropDownMenu.indexPathForSelectedRow?.row)!)(the index of the tableview selection)")
//            dropDownMenu.scrollToRowAtIndexPath((dropDownMenu.indexPathForSelectedRow)!, atScrollPosition: .Middle, animated: false)
        } else {
            hideDropdown()
        }
        //        }
    }

    func showDropdown() {
        dropDownMenu.hidden = false
        self.ticket.drawShadowBeneathTicket()
        print("showing")
        if !animating {
            animating = true
            UIView.animateWithDuration(
                1.0,
                delay: 0,
                usingSpringWithDamping: 0.7,
                initialSpringVelocity: 0.5,
                options: [],
                animations: {
                    self.dropDownMenu.frame.origin.y  = self.bottomBorder!

                }, completion: { _ in
                    //self.delegate?.menuOpen?()
                    self.animating = false
                    print(self.dropDownBackground.frame.size.height)
                    print(self.dropDownMenu.frame.maxY)
                }
            )
        }
        self.setNeedsDisplay()
        self.dropDownMenu!.setNeedsDisplay()
        dropped = true
    }

    func hideDropdown() {
        if !animating {
            animating = true
            UIView.animateWithDuration(
                0.7,
                delay: 0,
                usingSpringWithDamping: 0.7,
                initialSpringVelocity: 0.5,
                options: [],
                animations: {
                    self.dropDownMenu.frame.origin.y  = self.topBorder! + self.bounceHeight!
                }, completion: nil
            )
        }
        UIView.animateWithDuration(
            0.5,
            delay: 0,
            options: UIViewAnimationOptions.TransitionNone,
            animations: {
                self.dropDownMenu.frame.origin.y  = self.topBorder! - self.dropdownHeight!
            }, completion: { _ in
                //self.delegate?.menuClosed?()
                self.animating = false
                self.dropDownMenu.hidden = true
                self.ticket.setNeedsDisplay()
                self.setNeedsDisplay()
            }
        )
        dropped = false
    }

    func initSubViews() {
        self.topBorder = self.frame.height*6/150
        self.bottomBorder = self.frame.height - self.topBorder!

        self.bounceHeight = 250
        self.dropdownHeight = 350

        containerView = UIView()
        containerView.frame = CGRect(x: 0, y: topBorder!, width: self.bounds.width, height: dropdownHeight!+bounceHeight!)
        containerView.clipsToBounds = true

        ticket = TacklTicket()
        ticket.frame = self.bounds
        ticket.addTarget(self, action: #selector(YellowTackleTicketComplete.ticketTapped), forControlEvents: .TouchDown)

        dropDownMenu = YellowDrawer()
        dropDownMenu.frame =  CGRect(x: 0, y: topBorder! - dropdownHeight!, width: containerView.bounds.width, height: dropdownHeight!)
        dropDownMenu.hidden = true
        dropDownMenu.backgroundColor = UIColor.clearColor()

        dropDownMenu.addObserver(self, forKeyPath: "frame", options: .New, context: nil)

        dropDownBackground = YellowDrawerBackground()
        dropDownBackground.frame = CGRectMake(0,0,self.bounds.width,self.dropDownMenu.frame.maxY)

        self.addSubview(containerView)
        containerView.addSubview(dropDownBackground)
        containerView.addSubview(dropDownMenu)
        self.addSubview(ticket)
    }

}

3 个答案:

答案 0 :(得分:1)

您应该为UIView子视图使用指定的初始值设定项。这可以是init(frame:CGRect),也可以在Interface Builder中添加。你也没有将let data = dataArray[indexPath.row]传递给你的手机,也不确定你是否意识到这一点。您也永远不会致电initSubViews(),这似乎是您自定义视图的重要组成部分。

答案 1 :(得分:0)

而不是

cell.addSubview(ticket)

尝试

cell.contentView.addSubview(ticket)

并且自定义单元格内容的最佳位置是其init函数。

答案 2 :(得分:0)

您应该尝试的一些事情,在您以编程方式创建的视图上将translatesAutoresizingMaskIntoConstraints设置为false,因为您将其插入到自动布局控制器中。

查看也应该尝试设置, dropDownMenu,dropDownBackground,containerView和ticket 或

在您的cellForRowAtIndexPath中也尝试设置属性 ticket.translatesAutoresizingMaskIntoConstraints = false