2009-10-15 4 views
1

UIImageView 하위보기가 포함 된 UIView 주변에 "marching ants" (an animated dashed line) selection indicator을 만들려고합니다. 그러나, I가있는 UIImageView 내부 스케일링 및 회전이 가능하도록 아핀를 사용하여 뷰 변환 크기 (및 회전) 할코어 그래픽 경로의 변형을 방지하거나 보정하는 방법은 무엇입니까?

-(void) drawSelectedMarquee{ 
    CGContextRef c=UIGraphicsGetCurrentContext(); 
CGContextSetStrokeColorWithColor(c, [[UIColor whiteColor] CGColor]); 
CGRect f=self.bounds; 
CGContextSetLineWidth(c, 2.0); 
CGFloat dashes[]={1,2}; 
CGContextSetLineDash(c, 0, dashes, 2); 
CGContextBeginPath(c); 
CGContextAddRect(c, f); 
CGContextStrokePath(c); 
} 

: 다음의 UIView의 둘레 점선 그리기 코어 그래픽을 사용 사소한

코어 그래픽 명백하게도, 스케일링 변환뿐만 의해 스케일링된다 대하여 "사용자 공간 포인트"흡입 때문에
-(void) scaleByX:(CGFloat) xScale andY:(CGFloat) yScale{ 
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.1]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
self.transform=CGAffineTransformScale(self.transform, xScale, yScale); 
[UIView commitAnimations]; 
} 

그러나, 비율에서 확장하는 점선시킨다. 따라서 뷰 배율이 작을수록 선이 더 얇아지고 대시가 더 가까워지고 뷰 배율이 커지면 선이 더 두껍게 늘어나고 대시는 따로 분리됩니다.

인터페이스 요소로서 선택 윤곽은 고정 폭의 고정 된 크기의 대시로 남아 있어야합니다. 난 회전 및 기본보기의 UIImageView 하위보기 배율을 시도했지만 UIImageView superview 밖으로 확장 할 수 있습니다.

나는 임의 문자를 올바르게 그릴 수있는 방법을 생각할 수 있습니다. 뷰의 절대 크기를 추적 한 다음 다시 그릴 때마다 최종 사용자 공간 단위를 다시 계산하거나 UIImageView 때마다 선택 윤곽을 사용하여 새 뷰를 만들 수 있습니다. 그러나 이러한 솔루션은 비능하고 버그가 발생하기 쉽습니다.

UIView에서 그래픽을 그리거나 변환하는 방법에 대한 설명서에서 뭔가 놓친 것 같습니다.

[업데이트 : 행진 개미 사용은 iPhone의 작은 화면에서 유용하지 않기 때문에 다른 방법을 채택했습니다. 그러나 나는 여전히이 특별한 문제에 대한 해결책에 관심이있다.]

답변

2

문서에서 무엇이든 놓치지는 않았지만 스케일링이 제공하는 아이디어를 놓친 것 같습니다. 보기 또는 레이어의 내용을 조정하면 내용의 모든 내용의 크기가 조정됩니다. 이것은 실제로 바람직합니다. 모든 서브 뷰 스케일링을 관리 할 필요없이 쉽게 확장 할 수 있습니다. 당신이 필요로하는 것처럼 들리는 것은 당신의 시야 앞에 오버레이 레이어를 추가하는 것입니다.

보기의 크기를 어떻게 조정하는지 잘 모르겠지만보기가로드되면보기 배율로 크기를 조절할 수있는 오버레이 코어 애니메이션 레이어를 추가하십시오. 중첩 레이어를 참조 할 때 크기 조정보다는 크기 조정이라는 단어를 사용했습니다.

이 작업을 올바르게 수행하려면 오버레이 레이어가 자식이 아닌 크기 조정중인 뷰의 형제인지 확인해야합니다. 그렇지 않으면 크기가 조정됩니다.

흥미롭게도 CAShapeLayer를 사용하고 지정된 CGRect를 윤곽을 그릴 수있는 대시 패턴을 지정하기 위해 부동 소수점 배열을 사용하는 lineDashPattern 속성을 활용할 수 있습니다. 그런 다음이 패턴을 lineDashPhase 속성과 CABasicAnimation을 사용하여 애니메이션으로 만들 수 있습니다. CABasicAnimation은 행진하는 개미 효과를 제공합니다.그것이 당신에게 관심이 있다면 나는 이것에 대해 자세히 설명 할 수 있습니다.

업데이트 : 전진했고 wrote a blog post on getting the marching ants effect working using Core Animation입니다. 죄송합니다. 문제를 해결할 시간이 없었지만 블로그 게시물을 통해 올바른 방향으로 안내 할 수 있습니다.

+0

코어 애니메이션 솔루션을 살펴 보겠습니다. 겹치는 뷰 또는 레이어를 사용하여 문제가되는 것은 이미지 뷰가 포함 된 뷰의 프레임이 이미지의 크기가 커지면 커지고 축소되어야한다는 것입니다. 이것은 오버레이로 사용되는 모든 독립적 인 뷰에도 적용됩니다. 이미지의 축척으로 프레임을 동기화하면 눈에 띄는 결함이 생깁니다. 바라건대, CA 레이어는 그 문제를 가지지 않을 것입니다. – TechZen

+0

나는 내가 원래 원했던 것을 정확히 할 수 있다고 생각하지 않기 때문에 이것을 대답으로 받아 들일 것입니다. 이 대답은 동일한 문제 공간에서 매우 유용한 정보를 제공합니다. – TechZen

0

나는 당신이 원하는 것을하기 위해 역변환 할 수 있다고 생각한다. 만약 내가 틀렸다면 당신은 당신의 스케일과 변환 값을 안다면 반대의 변환을 만들 수 있어야합니다.

또 다른 방법은보기로 직접 그림을 그리는 대신 레이어에 그려서 레이어의 크기를 조절하는 것입니다.

어도비 일러스트 레이터와 같은 많은 응용 프로그램에서 선택 윤곽 사각형은 실제로 주 윈도우의 infront 투명 윈도우입니다.

1

핵심 그래픽 드로잉을 수행하고있는 뷰가 무엇이든 상관없이 contentMode를 확인할 수 있습니다. 나는 최근에 당신이 묘사 한 것과 비슷하게 크기가 가변 인 가변 높이 테이블 뷰 셀에 수직 파선이있는 문제에 직면했다. contentMode를 UIViewContentModeRedraw로 설정하면 크기를 조정하는 대신 프레임 변경시 drawRect를 사용하여 수동으로 뷰를 그려야합니다.

관련 문제