Справка - Масштабирование CAShapeLayer (т.е. пути) в UIScrollView

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

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

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

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

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

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

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

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

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

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

* Теперь проблема:

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

  • Я попытался собрать все CAShapeLayer (ы) в массив, стереть их из представления и снова добавить, но ничего не изменилось. Я пробовал и другие вещи, например, попытаться масштабировать CAShapeLayer (s) отдельно, добавив CAShapeLayer (s) в 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, но я еще не знаю, как им пользоваться.


person NewUser_    schedule 08.08.2011    source источник
comment
Привет, @NewUser_, ты нашел решение для этого, я тоже столкнулся с той же проблемой ... ты можешь помочь мне разобраться с этой проблемой?   -  person Bad Boy    schedule 17.06.2013
comment
Привет, когда вы масштабировали траекторию, разрешение было также правильным? У меня при увеличении теряется разрешение пути, пытаюсь нарисовать веректор с масштабированием   -  person anoop4real    schedule 17.07.2016


Ответы (1)


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

-(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 во внутренней системе координат представления изображения, вам следует преобразовать точки касания в систему координат этого представления перед выполнением проверки попадания.

person NewUser_    schedule 12.08.2011