2017-02-10 5 views
0

ich eine UITableView mit den folgenden Zellen-Layout:Einige visuelle Fehler mit CALayer

• UIView

•• UIImageView

••• semitransparente Overlay UIView als Subview von UIImageView

Es gibt auch eine Symbolansicht, die den "Wiedergabe" -Knopf und UILabel imitiert, aber sie scheinen nicht mit diesem Fehler zu tun zu haben.

Und ich habe den folgenden Code:

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!) 
    } 

ich es in layoutSubviews bin fordern den Weg auf Gerätedrehung neu zu erstellen.

Und wenn Sie auf den Screenshot schauen, gibt es einige schwarze und rotierte ein bisschen schwarze "Löcher" in der Nähe des Pfades. Alle von ihnen sehen gleich aus, und sie sind sicherlich nicht auf dem Bild in UIImageView vorhanden.

Screenshot

Ich denke, es auf meine CALayer in engem Zusammenhang steht. Wie man es repariert?

+0

Es gibt einen schwarzer Keil entlang der inneren linken Kante jedes abgerundeten Rechtecks. Es ist sichtbar, wenn Sie weit hineinzoomen. Es gibt auch Keile entlang der oberen, rechten und unteren linken Kanten. –

+0

@robmayoff Ich bin froh, dass du siehst, was er meint! – matt

Antwort

2

Ihr Problem ist, diese schwarzen Keile:

black wedges

Die zugrunde liegende Ursache ist, dass der Standard fillColor ein CAShapeLayer undurchsichtig schwarz. Setzen Sie sich auf Null Füllung zu vermeiden:

pathLayer?.fillColor = nil 

das getan, lassen Sie mich Ihnen einen kürzeren Weg, um Ihren Weg zu konstruieren:

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 

Ergebnis:

no wedges