我有一个包含单元格的uitableview。我试图弄清楚如何调整细胞的z顺序。我想这样做:
但是当我加载tableview时,我得到了这个:
我已经尝试[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;
答案 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
}
}
}