Справка - Масштабирование CAShapeLayer (то есть пути) в UIScrollView - PullRequest
4 голосов
/ 09 августа 2011

У меня есть проблема, и я надеюсь, что вы можете помочь мне с этим.Кстати, для iPad.

У меня есть UIScrollView, UIImageView, CAShapeLayer и CGMutablePathRef.

1 - Итак, я загрузил изображение в UIImageView

2- Затем я проанализировал все пути из файла, затем добавил их в CAShapeLayer (ы), т.е. каждый CAShapeLayer - это путь.

3 - Затем я добавил все CAShapeLayer (s) в UIImageView.layer

4- Я выполнил шаг 3, чтобы использовать приведенную ниже функцию, чтобы вернуть представление, содержащее изображение и контуры.Это помогает масштабировать пути и изображение вместе.

- (UIView *)viewForZoomingInScrollView: (UIScrollView *)scrollView 
{
    return myUIImageView;
}

5- Затем я добавил UIImageView в UIScrollView.

6 - Затем я создал подкласс UIScrollView, чтобы я мог получить touchSecan и т. Д..

* Примечание. Все мои сенсорные события, такие как touchesBegan, могут определять все пути, когда я нажимаю на них, используя CGPathContainsPoint (aLayer.path, & transf, touchPoint, NO).Кроме того, я могу прокручивать вид после масштабирования, и он отлично работает.

* Теперь проблема в следующем:

  • Всякий раз, когда я увеличиваю / уменьшаю, CAShapeLayer(s) масштабируются нормально, но кажется, что (исходные координаты путей) не масштабируются, или, по крайней мере, это то, во что я верю.Я говорю это потому, что когда я нажимаю на CAShapeLayer, они не отвечают, но когда я нажимаю на их исходное место или рядом с тем местом, где показан CAShapeLayer, я получаю ответ CAShapeLayer.

  • Я попытался собрать все элементы CAShapeLayer в массив, стереть их из представления и снова добавить их, но ничего не изменилось.Я пробовал и другие вещи, такие как попытки масштабировать CAShapeLayer отдельно, добавляя CAShapeLayer в UIScrollView вместо UIImageView.Затем я получаю текущий примененный масштаб и применяю его ко всем слоям CAShapeLayer, но это не дает хорошего результата.

-Проверьте прикрепленные скриншоты.Я надеюсь, что они помогут.

Я надеюсь, что вы можете помочь мне с этим, заранее спасибо.

* Перед масштабированием изображения: http://imageshack.us/photo/my-images/193/beforescaling.jpg/

* После масштабирования изображения: http://imageshack.us/photo/my-images/818/afterscaling.jpg/

** Отредактировано:

-Потенциальные решения:

1- Возможно, мне нужно обновить CATransform3DIdentity CAShapeLayer.Однако я пока не знаю, как это сделать.

2 - Возможно, мне нужно использовать CATransform3DTranslate, но я пока не знаю, как его использовать.

1 Ответ

2 голосов
/ 12 августа 2011

Полагаю, я отвечу, когда наконец узнаю.Для тех, кто может застрять как я, просто сделайте это.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{
    for (UITouch *touch in touches) 

    {
          // The [self.view.subviews objectAtIndex:0]] is the view that I want to check whether the CAShapedLayer is touched or not.
          CGPoint touchPoint = [self.view convertPoint:[touch locationInView:self.view] toView:[self.view.subviews objectAtIndex:0]];
    }

}

Подробнее:

Когда представление прокрутки масштабирует представление, оно не меняет внутреннюю систему координатэто представление, только его внешняя система координат.После проверки нажатия CAShapeLayer во внутренней системе координат представления изображения перед преобразованием проверки нажатия следует преобразовать точки касания в систему координат этого представления.

...