为分组表视图中的每个部分添加阴影

Posted

技术标签:

【中文标题】为分组表视图中的每个部分添加阴影【英文标题】:Add shadow to every section in grouped table view 【发布时间】:2018-01-24 23:18:53 【问题描述】:

如图所示,我想为我的表格视图部分添加阴影。就像表格视图有 4 个部分,那么表格视图中就会有 4 个阴影视图。

func numberOfSections(in tableView: UITableView) -> Int 返回 3

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 3


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    switch processIndex 
        return cell


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return  44


func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
        return UIView


func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
        return 40

【问题讨论】:

需要查看您的UITableViewDataSourceUITableViewDelegate 的一些代码。 你能更新你问题中的一些代码吗?你试过什么?由此,我们可以尽我们所能。 我在这里更新了代码 【参考方案1】:

有一种更简单的方法可以显示每个部分的阴影。

    将表格视图的背景颜色设置为UIColor.clear 将表格视图样式设置为分组(或者对于 ios 13+,您甚至可以选择 Inset Grouped 样式,这也会为每个部分添加角) 为整个表格视图添加阴影。这将为每个部分投下阴影

给表格视图添加阴影:

tableView.layer.masksToBounds = false
tableView.layer.shadowColor = UIColor.black.withAlphaComponent(0.4).cgColor // any value you want
tableView.layer.shadowOpacity = 1 // any value you want
tableView.layer.shadowRadius = 100 // any value you want
tableView.layer.shadowOffset = .init(width: 0, height: 10) // any value you want

【讨论】:

这太棒了,无需进行单元级别的操作。 这是一个很好的解决方案。有没有办法不将阴影添加到部分或标题?我的表格视图有一个标题,我不想对其应用阴影。【参考方案2】:

我尝试过自定义 [String : UIView] 。这将适用于最少的行数。如果您的单元的设计是静态的,这将满足您的设计。如果要访问UITableViewCell 中的某些属性,则必须使用子视图。

只有一行的多个部分。相应行内只有一个视图 (lookView)。 我们必须根据要求以编程方式创建 n 个UIViewUITapGestureTableViewTableView 格式为 GroupedSeparator.none

以下代码将给出如下输出:

//Global Variable:


@IBOutlet weak var tblVw: UITableView!

var rowItemsDict = [String : [String]]()
var rowHeight = [String : CGFloat]()
var eachRowSubViews = [String : UIView]()


override func viewDidAppear(_ animated: Bool) 

    rowItemsDict = ["0" : ["welcome", "hello", "wow", "Good", "Bad"], "1" : ["Asia", "Europe", "America"], "2" : ["Mcdonald", "Pizza", "Fries"]]

    for i in 0..<rowItemsDict.count
    
        let numOfSubItemsArr : [String] = rowItemsDict[String(i)]!
        let eachRowHeight : CGFloat = getShadowViewHeight(defaultHeight: 44.0, numberOfItems: numOfSubItemsArr.count)

        var subArrView = UIView()

        for j in 0..<numOfSubItemsArr.count
        
            let sublabel = UILabel(frame: CGRect(x: 0, y: 0, width: tblVw.frame.size.width - 42, height: 39))
            sublabel.text = numOfSubItemsArr[j]
            sublabel.isUserInteractionEnabled = true
            sublabel.textAlignment = .right
            sublabel.textColor = UIColor.red
            let subView = UIView(frame: CGRect(x: 0, y: CGFloat((j * 40)), width: tblVw.frame.size.width, height: 39))
            subView.addSubview(sublabel)
            subView.backgroundColor = UIColor.clear
            subView.tag = ((i+1) * 100) + j

            if j == (numOfSubItemsArr.count - 1)
            

            
            else
            
                let LinesubView = UIView(frame: CGRect(x: 0, y: 38, width: tblVw.frame.size.width - 8, height: 1))
                LinesubView.backgroundColor = UIColor.lightGray.withAlphaComponent(0.2)
                subView.addSubview(LinesubView)
            

            subView.isUserInteractionEnabled = true
            subArrView.addSubview(subView)
            subArrView.isUserInteractionEnabled = true
        

        eachRowSubViews[String(i)] = subArrView
        rowHeight[String(i)] = eachRowHeight
    

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapEachView))
    tblVw.addGestureRecognizer(tapGesture)
    tblVw.reloadData()



// TABLEVIEW DELEGATES
func numberOfSections(in tableView: UITableView) -> Int 


    return rowItemsDict.count


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return 1

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SampleTableViewCell

    print("\n\ncellFor")
    cell.backgroundColor = UIColor(red: 240/255, green: 240/255, blue: 240/255, alpha: 0.0)
    cell.separatorVw.backgroundColor = UIColor(red: 250/255, green: 250/255, blue: 250/255, alpha: 0.0)
    tableView.clipsToBounds = true
    let gettingVw : UIView = eachRowSubViews[String(indexPath.section)]!
    cell.lookVw.addSubview(gettingVw)
    cell.lookVw.layer.cornerRadius = 10
    cell.separatorVw.backgroundColor = UIColor.clear

    cell.selectionStyle = .none
    return cell



func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 

    let cell = cell as! SampleTableViewCell

    cell.lookVw.dropOnlyOneShadowLeft(getSize: CGSize.zero)
    cell.lookVw.backgroundColor = UIColor.white




func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

    return (rowHeight[String(indexPath.section)]! )




//ROW HEIGHT CALCULATION
func getShadowViewHeight(defaultHeight: CGFloat, numberOfItems: Int) -> CGFloat

    let requiredHeight = CGFloat(Int(defaultHeight) * numberOfItems)

    return requiredHeight


//TAP GESTURE ACTION
@objc func tapEachView(sender: UITapGestureRecognizer)

    let touchPoint = sender.location(in: tblVw)
    let index = tblVw.indexPathForRow(at: touchPoint)

    if (index == nil)
    
            print("long press on table view but not on a row");
    
    else
    
        let cell = tblVw.cellForRow(at: index!) as! SampleTableViewCell
        let pointInCell = cell.convert(touchPoint, from: tblVw)

        let innerSubVw = cell.lookVw.subviews
        print("pointInCellpointInCell)  ", pointInCell)
        for sVw in innerSubVw[0].subviews
        
            let pointY = pointInCell.y - 5
            let comparePoint = sVw.frame.origin.y

            if pointY >= comparePoint && pointY <= comparePoint + 39
            
                print("sVwsVwsVwsVwsVw    ", sVw.tag)

                //DO YOUR ACTION IN RESPECTIVE VIEW CLICK
                return
            

        

    



extension UIView 
    func dropOnlyOneShadowLeft(getSize: CGSize) 
        self.layer.shadowColor = UIColor.lightGray.cgColor
        self.layer.shadowOpacity = 0.6
        self.layer.shadowOffset = getSize
        self.layer.shadowRadius = 3
    

【讨论】:

请给我发一份演示文件 邮件地址?我会邮寄 adiindia.sharma@gmail.com 你能分享一下演示吗? GitHub,开车? 我试过了,但是不能请你分享到 Github 或 Drive 链接吗?

以上是关于为分组表视图中的每个部分添加阴影的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将视图添加到表视图中的单元格

在 Xcode Storyboard 中编辑具有多个部分的静态分组表视图

分组表视图中单元格的索引路径

表视图未知阴影错误

分组表视图空白部分

分组表视图中的中间动画看起来很糟糕