문제

CGPoint를 한 uiview에서 다른 uiview로, 한 Calayer에서 다른 CGPoint로 전송하는 방법이 있습니다. CGPoint를 UIView의 좌표계에서 Calayer의 좌표계로 변경하는 방법을 찾을 수 없습니다.

레이어와 호스트보기에는 동일한 좌표계가 있습니까? 그들 사이에 포인트를 변환해야합니까?

고마워요, 코리

편집하다

답변 해주셔서 감사합니다! iPhone과 Mac의 CA의 차이점/유사성에 대한 정보를 찾기가 어렵습니다. 이 문제가 Apple 문서에서 직접 해결되지 않았다는 사실에 놀랐습니다.

나는 문제를 해결하는 버그를 돕기 위해이 답을 추구하고 있었고, 이것은 지금까지 가장 좋은 추측 이었지만, 나는 잘못된 나무를 짖고 있다고 생각합니다. 좌표계가 동일하다면 또 다른 문제가 있습니다 ...

내가 가진 실제 문제는 여기에서 스택 오버플로에서 찾을 수 있습니다.레이어 히트 테스트 레이어의 하단 절반이 터치 된 경우 반환 레이어 만 반환합니다.

도움이 되었습니까?

해결책

당신은 설정할 수 있습니다 transform 좌표계를 뒤집으려면 적절한 변환에 대한 calayers의 속성이지만 아마도 이것은 아마도 그들의 그림을 뒤집을 것입니다. contents 또한 (나는 그것을 테스트하지 않았지만 이것이 사실이라는 것이 합리적입니다). UIView와 관련된 Calayer가 동일한 좌표 시스템을 공유한다는 내 주장은 실제로 완전히 잘못 될 수 있습니다. Calayers는 Uiviews와 동일한 좌표계를 사용하는 것일 수도 있지만 (즉, 수직으로 뒤집지 않았습니다) Coregraphics가 Uikit에 비해 뒤집힌 좌표계를 사용하기 때문에 생각했습니다.

간단한 테스트 방법은 뷰 레이어의 하위 계층으로 스크린 크기의 칼레이를 추가 한 다음 다른 작은 Calayer를 그 하위 계층으로 추가하는 것입니다. (0, 0, 320, 100)에 표시하도록 설정하고 iPhone 화면의 상단 또는 하단에 표시되는지 확인할 수 있습니다. 이것은 y 축이 어떤 방향으로 Coreanimation을 향한 방향을 알려줄 것입니다.

- (void)viewDidLoad {
  [super viewDidLoad];
  CALayer *rootLayer = [CALayer layer];
  rootLayer.frame = self.view.layer.bounds;
  CALayer *smallLayer = [CALayer layer];
  smallLayer.frame = CGRectMake(0, 0, rootLayer.bounds.size.width, 50);
  smallLayer.backgroundColor = [UIColor blueColor].CGColor;
  [rootLayer addSublayer:smallLayer];
  [self.view.layer addSublayer:rootLayer];
}

방금이 테스트를 직접 수행했으며 Calayers는 실제로 Uiviews와 동일한 좌표계를 사용하는 것으로 보이므로 Calayer의 Y 축을 뒤집는 것은 확실히 잘못되었습니다. 그러나 CoreGraphics로 직접 그리면 CoreGraphics에 대해 알아보십시오. 하다 뒤집힌 y 축을 사용하십시오 (Uiview 서브 클래스에 그리거나 Calayer 대의원이 될 때 CoreGraphics 컨텍스트가 이미 Uiview의 (또는 Calayer) 좌표계와 일치하도록 뒤집 혔다고 가정합니다.

따라서 짧은 대답은 지금까지 만들었다면 Calayer의 좌표 시스템은 해당 UIView의 좌표계와 일치해야합니다.

다른 팁

Hittest의 문서는 다음과 같습니다.

/* Returns the farthest descendant of the layer containing point 'p'.
 * Siblings are searched in top-to-bottom order. 'p' is in the
 * coordinate system of the receiver's superlayer. */

그래서 당신은 (이와 같은)해야합니다.

CGPoint thePoint = [touch locationInView:self];
thePoint = [self.layer convertPoint:thePoint toLayer:self.layer.superlayer];
CALayer *theLayer = [self.layer hitTest:thePoint];

Apple 문서의 관점에서, 나는 레이어 좌표 시스템 섹션에서 "iPhone OS 노트"를 발견했습니다. 핵심 애니메이션 프로그래밍 안내서 (2008-11-13).

UIView 인스턴스의 기본 루트 레이어는 Uiview 인스턴스의 기본 좌표계와 일치하는 뒤집힌 좌표계를 사용합니다. 원점은 상단에 있고 값은 오른쪽으로 증가합니다. Calayer를 인스턴스화하여 생성 된 레이어는 표준 코어 애니메이션 좌표 시스템을 직접 사용합니다.

내 테스트에서 Subrayers가 상위 계층과 동일한 좌표계를 공유한다는 것을 알았으므로 Uiview 레이어에 Sublayer를 추가하면 동일한 좌표계를 공유합니다.

좌표계를 뒤집어 원점이 왼쪽 상단에 있도록 좌표계를 뒤집으려면 y 축을 뒤집는이 변환을 사용해야합니다. (x, y, 1) = (x ', y', 1) * [1 0 0], [0-1 0], [0 Heigth 1

코드로 번역 된 것은 다음과 같습니다.

UIView의 좌표계와 관련 층이 동일해야한다고 생각합니다. 그러나 층을 직접 만들면 좌표계가 수직으로 뒤집 힙니다.

Methods that fixing frames and points
- (CGRect) fixRect:(CGRect)rect inRect:(CGRect)container
{
    CGRect frame = rect;
    frame.origin.y = container.size.height - frame.origin.y - frame.size.height;
    return frame;
}
- (CGPoint) fixPoint:(CGPoint)point fromPoint:(CGSize)containerSize
{
    CGPoint frame = point;
    frame.y = size.height - frame.y;
    return frame;
}

나는 둘이 동일한 좌표계를 가지고 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top