2012-03-28 8 views
15

Ich habe gesucht, konnte aber nicht den Grund für dieses Verhalten finden.CALayer Border erscheint über Unteransicht (Z-Reihenfolge verwandt, denke ich)

Ich habe eine UIButton, deren Bild ich setze. So sollte der Button aussehen. Beachten Sie, dass dies nur ein photoshop der beabsichtigten Tasten-Design:

enter image description here

Im Wesentlichen ist es ein Quadrat Brauch ist UIButton mit einem weißen Rand und einem kleinen umgebenden Schatten. In der oberen rechten Ecke befindet sich ein "X" -Marker, der programmatisch als Unteransicht hinzugefügt wird.

Hier ist der Screenshot der Schaltfläche innerhalb der eigentlichen App. Zu diesem Zeitpunkt habe ich hinzugefügt nur einen Schatten und die Markierung X als Subview:

enter image description here

Wie, wenn ich versuche, die weiße Grenze zu addieren, hier ist, wie es aussieht:

enter image description here

Es scheint, dass der weiße Rahmen über der X-Mark-Unterschicht erscheint. Ich weiß nicht warum. Hier

ist der Code, den ich verwende:

// selectedPhotoButton is the UIButton with UIImage set earlier 
// At this point, I am adding in the shadow 
[selectedPhotoButton layer] setShadowColor:[[UIColor lightGrayColor] CGColor]]; 
[[selectedPhotoButton layer] setShadowOffset: CGSizeMake(1.0f, 1.0f)]; 
[[selectedPhotoButton layer] setShadowRadius:0.5f]; 
[[selectedPhotoButton layer] setShadowOpacity:1.0f]; 

// Now add the white border  
[[selectedPhotoButton layer] setBorderColor:[[UIColor whiteColor] CGColor]]; 
[[selectedPhotoButton layer] setBorderWidth:2.0]; 

// Now add the X mark subview 
UIImage *deleteImage = [UIImage imageNamed:@"nocheck_photo.png"]; 
UIImageView *deleteMark = [[UIImageView alloc] initWithFrame:CGRectMake(53, -5, 27, 27)]; 
deleteMark.contentMode = UIViewContentModeScaleAspectFit; 
[deleteMark setImage:deleteImage]; 
[selectedPhotoButton addSubview:deleteMark]; 
[deleteMark release]; 

Ich verstehe nicht, warum die Grenze über dem DeleteMark subview erscheinen. Gibt es eine Möglichkeit, den beabsichtigten Effekt zu erzielen?

Vielen Dank!

+0

Anstatt den Rahmen zu setzen, versuchen Sie es zu zeichnen! – tipycalFlow

+0

@tipycalFlow wtf warum? –

+0

@returntrue Das ist ziemlich alt, aber ich denke, ich wollte die Zeichenreihenfolge kontrollieren – tipycalFlow

Antwort

16

Von Apple docs auf CALayer:

Die Grenze ist Einschub von den Grenzen von border des Empfängers gezogen. Es wird über dem Inhalt und den Sublayern des Empfängers zusammengesetzt und enthält die Effekte der Eigenschaft cornerRadius.

Um den gewünschten Effekt zu erhalten, empfehle ich Ihnen das Bild in eine eigene subview/Unterschicht gelegt, und dass Unterschicht der borderWidth Eigenschaft festgelegt.

+0

Es tut mir leid, könnten Sie mit etwas Pseudo-Code klären, wenn möglich? Das Bild wird als Bild der UIB-Taste festgelegt. Willst du das vermeiden? – kurisukun

+4

Erstellen Sie einfach eine allgemeine Superansicht für 'selectedPhotoButton' und' deleteMark', d. H. Fügen Sie 'deleteMark' nicht als Unteransicht von' selectedPhotoButton' hinzu, sondern fügen Sie beide zu einer neuen 'UIView' hinzu. – MrMage

2

ich ähnliches Problem hatte (ich wollte Grenzlinie zu sein auf meinem Subviews verhindern)

CAShapeLayer * _border = [CAShapeLayer layer]; 
_border.strokeColor = [UIColor colorWithRed:119/255.0f green:119/255.0f blue:119/255.0f alpha:1.0f].CGColor; 
_border.fillColor = nil; 
[bgRoundView.layer addSublayer:_border]; 
_border.path = [UIBezierPath bezierPathWithRoundedRect:bgRoundView.bounds cornerRadius:20.f].CGPath; 
3

Sie setzen zPosition auf die Ebene des -1 kann. Das hat für mich funktioniert.