UITableViewCell Z-Order

时间:2014-09-08 06:24:24

标签: ios objective-c xcode uitableview

我有一个包含单元格的uitableview。我试图弄清楚如何调整细胞的z顺序。我想这样做: enter image description here

但是当我加载tableview时,我得到了这个: enter image description here

我已经尝试[tableView sendSubViewToBack:cell]了。此外,当我滚动到底部然后返回到顶部时,结果如图1所示,但当我向下滚动时,结果如图2所示。我感谢您的帮助。

    static NSString *CellIdentifier = @"Cell";
NSString *row = [NSString stringWithFormat:@"%li",(long)indexPath.row];
GetMoreTableViewCell *cell = [_chapters dequeueReusableCellWithIdentifier:CellIdentifier];
NSMutableDictionary *deckCategory = [[_data valueForKey:key] valueForKey:row];

if (cell == nil) {
    cell = [[GetMoreTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}


[tableView bringSubviewToFront:cell];

if([[[_data valueForKey:key] valueForKey:[NSString stringWithFormat:@"%i",indexPath.row]] valueForKey:@"isDefault"] == [NSNumber numberWithBool:YES]) {
    cell.addButton.hidden = YES;
}
cell.ttitle.text = [[[_data valueForKey:key] valueForKey:row] valueForKey:@"Name"];
cell.backgroundColor = [UIColor clearColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
CALayer * l = [cell.cellImage layer];
[l setMasksToBounds:YES];
[l setCornerRadius:10.0];

CALayer * b = [cell.cellBackground layer];
[b setMasksToBounds:YES];
[b setCornerRadius:19.0];
cell.cellImage.image = [UIImage imageNamed:[deckCategory valueForKey:@"Image"]];

if(indexPath.row == 0) {
    cell.cellBackground.image = [UIImage imageNamed:@"card_green.png"];
}
else if(indexPath.row == 1) {
    cell.cellBackground.image = [UIImage imageNamed:@"card_orange.png"];
}
else if(indexPath.row == 2) {
    cell.cellBackground.image = [UIImage imageNamed:@"card_red.png"];
}

return cell;

5 个答案:

答案 0 :(得分:6)

我在UITableViewCells上使用阴影时遇到了同样的问题,屏幕下方的单元格(在Y方向上)的阴影与屏幕顶部的较高阴影重叠。

我的解决方案是根据indexPath在UITableViewCell层上设置Z Position。

cell.layer.zPosition = CGFloat(indexPath.section) * 1000.0 +  CGFloat(indexPath.row)

我的问题只发生在各个部分。如果后续部分中的单元格也遇到此问题,则需要在计算中添加部分编号。

import numpy as np
from scipy.optimize import minimize

def objective(x):     #L_1 norm objective function
    return np.linalg.norm(x,ord=1)

constraints = [] #list of all constraint functions
for i in range(a):
    def con(x,y=y,i=i):
        return np.matmul(M[i],x)-y[i]
    constraints.append(con)

#make constraints into tuple of dicts as required by scipy 
cons = tuple({'type':'eq','fun':c} for c in constraints)

#perform the minimization with sequential least squares programming
opt = minimize(objective,x0 = x0,
                        constraints=cons,method='SLSQP',options={'disp': True})

如果每个部分中的行数超过1000行,则增加幻数,或者考虑为什么在应用中有1000行; - )

答案 1 :(得分:3)

一段时间后我遇到了同样的问题。

对我有用的解决方案是使用Collection视图而不是TableView。通过从UICollectionViewFlowLayout扩展自定义类并在集合视图中使用它来创建自定义类。

class OverlappedCustomFlowLayout: UICollectionViewFlowLayout {
    override func prepare() {
        super.prepare()

        // This allows us to make intersection and overlapping
        // A negative number implies overlapping whereas positive implies space between the adjacent edges of two cells.
        minimumLineSpacing = -100
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let layoutAttributes = super.layoutAttributesForElements(in: rect)
        for currentLayoutAttributes: UICollectionViewLayoutAttributes in layoutAttributes! {

            // zIndex - Specifies the item’s position on the z-axis. 
            // Unlike a layer's zPosition, changing zIndex allows us to change not only layer position, 
            // but tapping/UI interaction logic too as it moves the whole item.
            currentLayoutAttributes.zIndex = currentLayoutAttributes.indexPath.row + 1
        }
    }

    return layoutAttributes
}

P.S。 - 根据Apple的zIndex

开发人员文档
  

此属性用于确定项目的前后排序   在布局期间。索引值较高的项目显示在项目的顶部   价值较低。具有相同值的项目未确定   订购。此属性的默认值为0.

希望它有所帮助! :)

答案 2 :(得分:2)

它应该通过在cell.layer.zPosition = CGFloat(indexPath.row) dataSource方法中更改单元格的zPosition来实现:tableView:cellForRowAtIndexPath:。并且不要忘记将单元格的clipsToBound属性设置为false。

答案 3 :(得分:0)

不幸的是,您无法控制调用cellForRow ...的顺序,因此将单元格发送到后面或前面都不会这样做。

您可能需要制作一个方法,该方法通过表格的可见单元格并根据索引路径对其进行重新排序,但是您要弄乱您无法控制的视图。表格视图可以随时重新排列或添加子视图,您可以尝试捕获所有这些事件。

我会使用集合视图而不是表格视图来实现这样的视图,这将允许您使用自定义布局为每个indexPath指定az位置,并允许您重叠细胞数量不等。创建自定义布局非常简单,特别是对于表格类型布局。

答案 4 :(得分:0)

如果要降序zPosition(以使第一个单元格位于顶部),请使用基于the answer from Brett的以下代码。使用这种方法,无需手动重新计算zPosition值。

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    DispatchQueue.main.async {
        for index in 0 ..< tableView.visibleCells.count {
            let zPosition = CGFloat(tableView.visibleCells.count - index)
            tableView.visibleCells[index].layer.zPosition = zPosition
        }
    }
}