2012-03-28 2 views
15

검색했지만이 동작에 대한 이유를 찾을 수 없습니다.CALayer 테두리가 하위보기 위에 나타납니다 (Z 순서 관련, 제 생각에는)

나는 이미지를 설정하고있는 UIButton을 가지고있다. 다음은 버튼이 나타나는 방식입니다. 이것은 의도 된 버튼 디자인의 단지 포토샵 것을 참고 :

enter image description here

기본적으로는 흰색 테두리와 약간의 주변 그림자와 사각형 사용자 정의있는 UIButton입니다. 오른쪽 위 모서리에는 프로그래밍 방식으로 하위보기로 추가되는 "X"표시가 있습니다.

다음은 실제 앱 내의 버튼 스크린 샷입니다. 이 시점에서, 나는 단지 하위 뷰 같은 그림자와 X 표시를 추가 한 :

enter image description here

어떻게, 나는 여기가 모습입니다, 흰색 테두리를 추가하려고하면

enter image description here

흰색 테두리가 X 마크 하위 레이어 위에 나타납니다. 나는 이유를 모른다. 경계가 deleteMark의 서브 뷰 위에 나타나는 이유

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

가 이해가 안 : 여기

내가 사용하고있는 코드입니다. 원하는 효과를 얻을 수있는 방법이 있습니까?

감사합니다. CALayer에 애플의 문서에서

+0

테두리를 설정하는 대신 그려보십시오! – tipycalFlow

+0

@tipycalFlow 왜? –

+0

@returntrue 이것은 꽤 오래되었지만 드로잉 순서를 제어하라고 요청한 것 같습니다. – tipycalFlow

답변

16

은 :

경계는 borderWidth에 의해 수신기의 경계에서 삽입을 그려집니다. 수신기의 내용과 하위 레이어 위에 합성되며 cornerRadius 속성의 효과가 포함됩니다.

원하는 효과를 얻으려면 이미지를 자신의 하위보기/하위 레이어에 넣고 그 하위 레이어의 borderWidth 속성을 설정하는 것이 좋습니다.

나는 비슷한 문제가 있었다
+0

가능한 경우 의사 코드로 명확히 할 수 있습니까? 이미지가 UIButton의 이미지로 설정됩니다. 이 일을 피하기를 원하십니까? – kurisukun

+4

'selectedPhotoButton'과'deleteMark'에 대한 공통 수퍼 뷰를 작성하십시오. 즉,'selectedPhotoButton'의 서브 뷰로'deleteMark'를 추가하지 말고 새로운'UIView'에 둘 다 추가하십시오. – MrMage

2

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

당신은 -1로 레이어의 zPosition을 설정할 수 있습니다 (I 내 파단의 상단에있을 테두리 선을 방지하기 위해 원). 그것은 나를 위해 일했다.