2016-05-02 12 views
0

Ich kämpfe um die Ansicht, die nur oberen Ecken und Schatten um sie gerundet hätte. Die gesamte Ansicht sollte unten im Superview maskiert werden, um zu verhindern, dass sich der Schatten nach der Teilansicht überlappt (Schattenversatz sollte (0, 0) sein).UIView mit Schatten, abgerundete nur obere Ecken und maskierte untere Kante

Wenn ich:

// Adding shadow 
    let contentSubviewLayer = contentSubview.layer 
    contentSubviewLayer.masksToBounds = false 
    contentSubviewLayer.shadowOpacity = 0.3 
    contentSubviewLayer.shadowRadius = 2.5 
    contentSubviewLayer.shadowOffset = CGSizeMake(0, 0) 
    contentSubviewLayer.cornerRadius = 5.0 
    contentSubviewLayer.shadowPath = UIBezierPath(rect: contentSubview.bounds).CGPath 
    self.layer.masksToBounds = true 

ich: enter image description here

Aber nach der Unterkante Zugabe Maskierung:

// Adding maskView to round only top corners 
    let maskLayer = CAShapeLayer() 
    maskLayer.frame = self.contentSubview.bounds 
    let roundedPath = UIBezierPath(roundedRect: maskLayer.bounds, byRoundingCorners: [UIRectCorner.TopLeft, UIRectCorner.TopRight], cornerRadii: CGSizeMake(CORNER_RADIUS, CORNER_RADIUS)) 
    maskLayer.fillColor = UIColor.whiteColor().CGColor 
    maskLayer.backgroundColor = UIColor.clearColor().CGColor 
    maskLayer.path = roundedPath.CGPath 
    contentSubview.layer.mask = maskLayer 

Ich erhalte: enter image description here

Der gewünschte Effekt sollte die Verbindung der beiden oben sein und so etwas wie dies mit Schatten um den linken, oberen und rechten Rand ähneln sollte: enter image description here

Bitte um Hilfe! Vielen Dank im Voraus.

+0

können Sie einfach eine andere Ansicht der gleichen Hintergrundfarbe oben auf Ihrem unteren Teil setzen, um den unerwünschten Teil zu bedecken? –

+0

Nein, weil es ein Tabellenansichtsabschnitt sein wird. – Kaktusiarz

Antwort

2

Ich neige dazu, eine App namens PaintCode zu verwenden, um den Swift-Code zu generieren, den ich für diese Art von Ding benötige. Ich habe kürzlich etwas Ähnliches gemacht und es hat sich für mich ausgespuckt:

let context = UIGraphicsGetCurrentContext() 

    //// Color Declarations 
    let chiesi_light_grey = UIColor(red: 0.851, green: 0.851, blue: 0.851, alpha: 1.000) 

    //// Shadow Declarations 
    let chiesi_shadow = NSShadow() 
    chiesi_shadow.shadowColor = chiesi_light_grey.colorWithAlphaComponent(0.8 * CGColorGetAlpha(chiesi_light_grey.CGColor)) 
    chiesi_shadow.shadowOffset = CGSize(width: 0.1, height: 4.1) 
    chiesi_shadow.shadowBlurRadius = 2 

    //// Rectangle Drawing 
    let rectanglePath = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 50, height: 54), byRoundingCorners: [UIRectCorner.BottomLeft, UIRectCorner.BottomRight], cornerRadii: CGSize(width: 8, height: 8)) 
    rectanglePath.closePath() 
    CGContextSaveGState(context) 
    CGContextSetShadowWithColor(context, chiesi_shadow.shadowOffset, chiesi_shadow.shadowBlurRadius, (chiesi_shadow.shadowColor as! UIColor).CGColor) 
    UIColor.whiteColor().setFill() 
    rectanglePath.fill() 
    CGContextRestoreGState(context) 

    chiesi_light_grey.setStroke() 
    rectanglePath.lineWidth = 2 
    rectanglePath.stroke() 

Vielleicht wird es dir helfen.

+0

Hallo, tolle Antwort, vielen Dank! Das hat mein Problem gelöst. Natürlich musste ich 'shadowOffset' auf' (0, 0) 'setzen, Schattenfarbe anpassen, abgerundete Ecken zu' [TopLeft, TopRight] 'ändern und die 3 unteren Zeilen des Codes entfernen, der für das Streichen der Linien zuständig ist. – Kaktusiarz