2012-03-28 15 views
15

Szukałem, ale nie mogłem znaleźć przyczyny tego zachowania.Granica KALKOMERZA pojawia się powyżej widoku podrzędnego (w kolejności Z, myślę)

Mam UIButton, którego obraz ustawiam. Oto, jak powinien się pojawić przycisk. Należy pamiętać, że jest to tylko photoshop planowanego projektu przycisk:

enter image description here

Zasadniczo, jest to kwadrat niestandardowe UIButton z białym obramowaniem i trochę otaczającej cienia. W prawym górnym rogu znajduje się znak "X", który zostanie dodany programowo jako wyeksportowany widok.

Oto zrzut ekranu przycisku w rzeczywistej aplikacji. W tym momencie mam tylko dodaje cień i znak X jako podrzędny:

enter image description here

Jak, kiedy próbuję dodać białą obwódkę, oto jak to wygląda:

enter image description here

Wygląda na to, że biała granica pojawia się powyżej podwarstwy znaku X. Nie wiem dlaczego.

Oto kod, który używam:

// 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]; 

Nie rozumiem dlaczego ta granica jest wyświetlana powyżej podrzędny deleteMark. Czy istnieje jakiś sposób uzyskania zamierzonego efektu?

Dziękujemy!

+0

Zamiast ustawiać ramkę, spróbuj ją narysować! – tipycalFlow

+0

@tipycalFlow wtf dlaczego? –

+0

@returntrue To jest dość stary, ale myślę, że prosiłem o kontrolę nad kolejnością rysowania – tipycalFlow

Odpowiedz

16

Od docs Apple na CALayer:

Granica jest zasysane wstawka z granicami odbiornika przez borderWidth. Jest on łączony nad zawartością odbiornika i podwarstwami i zawiera efekty własności CornerRadius.

Aby uzyskać pożądany efekt, sugeruję umieszczenie obrazu we własnej subview/podwarstwach i ustawienie właściwości podwarstwy jako borderWidth.

+0

Przykro mi, czy możesz wyjaśnić za pomocą jakiegoś pseudokodu, jeśli to możliwe? Obraz jest ustawiany jako obraz UIButton. Czy chcesz tego uniknąć? – kurisukun

+4

Po prostu utwórz wspólny superview dla "selectedPhotoButton' i' deleteMark', tj. Nie dodawaj 'deleteMark' jako podglądu' selectedPhotoButton', ale dodaj oba do nowego 'UIView'. – MrMage

2

miałem podobny problem (chciałem zapobiec linię graniczną, aby być na szczycie moich subviews)

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

Można ustawić zPosition warstwy do -1. To działało dla mnie.