How do I add an extra separator to the top of a UITableView?

后端 未结 8 2112
面向向阳花
面向向阳花 2021-02-06 22:20

I have a view for the iPhone that is basically split in two, with an informational display in the top half, and a UITableView for selecting actions in the bottom half. The prob

8条回答
  •  囚心锁ツ
    2021-02-06 22:53

    I made a UITableView extension that displays a native style separator on top of the UITableView, while the table gets scrolled.

    Here is how it looks

    Here's the code (Swift 3)

    fileprivate var _topSeparatorTag = 5432 // choose unused tag
    
    extension UITableView {
    
        fileprivate var _topSeparator: UIView? {
            return superview?.subviews.filter { $0.tag == _topSeparatorTag }.first
        }
    
        override open var contentOffset: CGPoint {
            didSet {
                guard let topSeparator = _topSeparator else { return }
    
                let shouldDisplaySeparator = contentOffset.y > 0
    
                if shouldDisplaySeparator && topSeparator.alpha == 0 {
                    UIView.animate(withDuration: 0.15, animations: {
                        topSeparator.alpha = 1
                    })
                } else if !shouldDisplaySeparator && topSeparator.alpha == 1 {
                    UIView.animate(withDuration: 0.25, animations: {
                        topSeparator.alpha = 0
                    })
                }
            }
        }
    
        // Adds a separator to the superview at the top of the table
        // This needs the separator insets to be set on the tableView, not the cell itself
        func showTopSeparatorWhenScrolled(_ enabled: Bool) {
            if enabled {
                if _topSeparator == nil {
                    let topSeparator = UIView()
                    topSeparator.backgroundColor = separatorColor?.withAlpha(newAlpha: 0.85) // because while scrolling, the other separators seem lighter
                    topSeparator.translatesAutoresizingMaskIntoConstraints = false
    
                    superview?.addSubview(topSeparator)
    
                    topSeparator.leftAnchor.constraint(equalTo: self.leftAnchor, constant: separatorInset.left).isActive = true
                    topSeparator.rightAnchor.constraint(equalTo: self.rightAnchor, constant: separatorInset.right).isActive = true
                    topSeparator.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
                    let onePixelInPoints = CGFloat(1) / UIScreen.main.scale 
                    topSeparator.heightAnchor.constraint(equalToConstant: onePixelInPoints).isActive = true
    
                    topSeparator.tag = _topSeparatorTag
                    topSeparator.alpha = 0
    
                    superview?.setNeedsLayout()
                }
            } else {
                _topSeparator?.removeFromSuperview()
            }
        }
    
        func removeSeparatorsOfEmptyCells() {
            tableFooterView = UIView(frame: .zero)
        }
    }
    

    To enable it, simply call tableView.showTopSeparatorWhenScrolled(true) after you set your delegate for your UITableView

提交回复
热议问题