2017-02-10 22 views
0

一些视觉上的错误我有以下细胞UITableView的布局:与CALayer的

•UIView的

••的UIImageView

•••半透明叠加的UIView为的UIImageView子视图

也有模仿“播放”按钮和UILabel的图标视图,但它们似乎与此错误无关。

而且我有以下代码:

override func layoutSubviews() { 
     super.layoutSubviews() 

     createPath() 
    } 

    private func createPath() { 
     let padding = CGFloat(16) 
     let bottomLineLength = CGFloat(64) 
     let arcPadding = CGFloat(8) 

     let width = self.contentView.frame.width 
     let height = self.contentView.frame.height 

     if pathLayer != nil { 
      pathLayer?.removeFromSuperlayer() 
     } 

     pathLayer = CAShapeLayer() 

     let path = UIBezierPath() 

     path.move(to: CGPoint(x: padding + arcPadding, y: padding)) 
     path.addLine(to: CGPoint(x: width - padding - arcPadding, y: padding)) 

     // Top-Right arc 
     path.addArc(withCenter: CGPoint(x: width - padding - arcPadding, y: padding + arcPadding), 
        radius: arcPadding, 
        startAngle: CGFloat(3 * M_PI/2), 
        endAngle: CGFloat(M_PI * 2), 
        clockwise: true) 

     path.move(to: CGPoint(x: width - padding, y: padding + arcPadding)) 
     path.addLine(to: CGPoint(x: width - padding, y: height - padding - arcPadding)) 

     // Bottom-Right arc 
     path.addArc(withCenter: CGPoint(x: width - padding - arcPadding, y: height - padding - arcPadding), 
        radius: arcPadding, 
        startAngle: CGFloat(M_PI * 2), 
        endAngle: CGFloat(M_PI/2), 
        clockwise: true) 
     path.move(to: CGPoint(x: width - padding - arcPadding, y: height - padding)) 
     path.addLine(to: CGPoint(x: width - padding - bottomLineLength, y: height - padding)) 

     path.move(to: CGPoint(x: padding + bottomLineLength, y: height - padding)) 
     path.addLine(to: CGPoint(x: padding + arcPadding, y: height - padding)) 

     // Bottom-Left arc 
     path.addArc(withCenter: CGPoint(x: padding + arcPadding, y: height - padding - arcPadding), 
        radius: arcPadding, 
        startAngle: CGFloat(M_PI/2), 
        endAngle: CGFloat(M_PI), 
        clockwise: true) 

     path.move(to: CGPoint(x: padding, y: height - padding - arcPadding)) 
     path.addLine(to: CGPoint(x: padding, y: padding + arcPadding)) 

     // Top-Left arc 
     path.addArc(withCenter: CGPoint(x: padding + arcPadding, y: padding + arcPadding), 
        radius: arcPadding, 
        startAngle: CGFloat(M_PI), 
        endAngle: CGFloat(3 * M_PI/2), 
        clockwise: true) 

     pathLayer?.rasterizationScale = 2 * UIScreen.main.scale 
     pathLayer?.shouldRasterize = true 
     pathLayer?.strokeColor = UIColor(red: 0xFF/255, green: 0xFF/255, blue: 0xFF/255, alpha: 0.5).cgColor 
     pathLayer?.lineWidth = 2.0 
     pathLayer?.path = path.cgPath 

     contentView.layer.addSublayer(pathLayer!) 
    } 

我称它在layoutSubviews对于重新创建的设备旋转的路径。

如果你看截图,会看到一些黑色,并在路径附近旋转了一些黑色的“洞”。它们全都看起来一样,并且它们当然不在UIImageView中的图像上。

Screenshot

我认为这是关系到我的CALayer。如何解决它?

+0

有一个沿着每个圆角矩形的内部左边缘的黑色楔子。如果您放大,则可以看到。沿着顶部,右侧和左下边缘也有楔形。 –

+0

@robmayoff我很高兴你看到他的意思! – matt

回答

2

你的问题是这些黑楔子:

black wedges

的根本原因是,CAShapeLayer的默认fillColor是不透明的黑色。将其设为零,以避免填充:

pathLayer?.fillColor = nil 

做完这些,让我告诉你一个较短的方式来构建你的路径:

let cgPath = CGMutablePath() 
let start = CGPoint(x: padding + bottomLineLength, y: height - padding) 
let blCorner = CGPoint(x: padding, y: height - padding) 
let tlCorner = CGPoint(x: padding, y: padding) 
let trCorner = CGPoint(x: width - padding, y: padding) 
let brCorner = CGPoint(x: width - padding, y: height - padding) 
let end = CGPoint(x: width - padding - bottomLineLength, y: height - padding) 

cgPath.move(to: start) 
cgPath.addArc(tangent1End: blCorner, tangent2End: tlCorner, radius: arcPadding) 
cgPath.addArc(tangent1End: tlCorner, tangent2End: trCorner, radius: arcPadding) 
cgPath.addArc(tangent1End: trCorner, tangent2End: brCorner, radius: arcPadding) 
cgPath.addArc(tangent1End: brCorner, tangent2End: end, radius: arcPadding) 
cgPath.addLine(to: end) 

shapeLayer.path = cgPath 

结果:

no wedges