iOS - помощь по математике - при увеличении базового изображения жесты должны накладываться на изображения, корректировать координаты X / Y относительно

У меня есть приложение для iPad, которое имеет базовое изображение UIImageView (в данном случае это крупное здание или план или схема участка), а затем несколько «контактов». может быть добавлен в верхней части плана (визуально похож на Google Maps). Эти контакты также являются UIImageViews и добавляются к основному виду жестов. Базовое изображение также добавляется в основной вид на viewDidLoad.

У меня есть базовое изображение, работающее с жестом пинч для масштабирования, но, очевидно, когда вы масштабируете базовое изображение, все выводы остаются в тех же координатах x и y основного вида и теряют относительное положение на базовом изображении (чьи x, y и ширина, координаты высоты изменились).

Пока у меня есть это ...

- (IBAction)planZoom:(UIPinchGestureRecognizer *) recognizer;
{
    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
    recognizer.scale = 1;

    for (ZonePin *pin in planContainer.subviews) {
        if ([pin isKindOfClass:[ZonePin class]]){
            CGRect pinFrame = pin.frame;

            // ****************************************
            // code to reposition the pins goes here...
            // ****************************************

            pin.frame = pinFrame;
        }
    }
}

Мне нужна помощь, чтобы вычислить математику, чтобы переместить координаты пинов x / y, чтобы сохранить там относительное положение на увеличенном или уменьшенном плане / диаграмме. Очевидно, что штифты вообще не хотят масштабироваться / масштабироваться с точки зрения их ширины или высоты - им просто нужны новые координаты x и y относительно их начальных положений на плане.

Я сам пытался отработать математику, но изо всех сил пытался ее проработать, и, к сожалению, я еще недостаточно знаком с SDK, чтобы знать, есть ли в нем встроенные условия, чтобы помочь или нет.

Помощь с этой математической проблемой была бы очень признательна! :)

Большое спасибо, Майкл. InNeedOfMathTuition.com

Ответы на вопрос(2)

Решение Вопроса

Во-первых, вы можете попробовать встроитьUIImageView вUIScrollView так что масштабирование в значительной степени выполнено для вас. Затем вы можете легко установить максимальную и минимальную шкалу, а также можете прокручивать увеличенное изображение по желанию (особенно, если ваши выводы являются подпредставлениямиUIImageView или что-то еще внутриUIScrollView).

Что касается масштабирования местоположений выводов, я думаю, что будет полезно сохранить исходные координаты x и y каждого вывода (то есть, когда представление загружается впервые, когда они впервые позиционируются, в масштабе 1.0). Затем, когда представление увеличено, установитеx = (originalX * zoomScale) а такжеy = (originalY * zoomScale).

У меня была такая же проблема в приложении для iOS пару лет назад, и, если я правильно помню, я справился с ней.

EDITНиже приведено более подробное описание того, как я это сделал (сейчас я смотрю свой старый код).

У меня естьUIScrollView как подпредставление моего основного взгляда, и мойUIImageView как подвид этого. Мои кнопки были добавлены в представление прокрутки, и я сохранил их исходные местоположения (при увеличении 1,0) для справки.

В-(void)scrollViewDidScroll:(UIScrollView *)scrollView метод:

for (id element in myButtons)
{
   UIButton *theButton = (UIButton *)element;
   CGPoint originalPoint = //get original location however you want
   [theButton setFrame:CGRectMake(
       (originalPoint.x - theButton.frame.size.width / 2) * scrollView.zoomScale,
       (originalPoint.y - theButton.frame.size.height / 2) * scrollView.zoomScale,
       theButton.frame.size.width, theButton.frame.size.height)];
}

Для-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView метод, я вернул свойUIImageView, Размер моих кнопок увеличен, но я не включил их в приведенный выше код. Если вы обнаружили, что штифты автоматически масштабируются по размеру, вам может потребоваться сохранить их исходные размеры, а также исходные координаты и использовать их вsetFrame вызов.

 23 мая 2012 г., 17:29
@ Майкл - я обновил свой ответ более подробно. Возможно, вам удастся решить проблему масштабирования размера прокрутки, задав ширину и высоту явно вUIScrollView& APOS; sscrollViewDidScroll метод делегата.
 Michael23 мая 2012 г., 13:43
... для ясности ... Я не могу использовать вид прокрутки для обработки масштабирования, поскольку это фактически не разрешает все, что уже происходит. Если бы я сделал это, штифты также масштабировались бы по ширине и высоте, чего я бы не хотел. Ранее я делал это так, чтобы штифты добавлялись в качестве подпредставлений к базовому изображению, и они корректно масштабируются с точки зрения x / y, но они также масштабируются по ширине и высоте, что, очевидно, нежелательно!
 Michael25 мая 2012 г., 12:09
Спасибо за вашу помощь, мистер Джефферсон, вы поставили меня на правильный путь! Я добавил свою реализацию ниже для других. Для справки, одна вещь, которая должна была быть включена в расчет, заключалась в том, что мои изображения булавок не масштабировались по ширине и высоте. масштабирование x & amp; Координаты y включали также влияние роста ширины и высоты, и этому необходимо противодействовать при расчете новых координат. например, newX = (pin.originalX * scrollView.zoomScale) + (((pin.frame.size.width * scrollView.zoomScale) - pin.frame.size.width) / 2); Еще раз большое спасибо за вашу помощь. :)
 Michael23 мая 2012 г., 13:37
К сожалению, это не совсем работает. (Я уже пробовал это). Это частично работает в том смысле, что штифты действительно масштабируются относительно друг друга, но они не правильно позиционируются относительно плана. План масштабируется по направлению к центру, а штифты масштабируются по направлению к верхнему / левому краю контейнера. Каким-то образом мне нужно вычислить x, y, чтобы также масштабировать относительно центральной точки, а не верхнего / левого угла. Я попытался установить центр кадра вида в центре, но это не удивительно. Я думаю, что это больше математическая проблема. Есть идеи?

ОБНОВИТЬ...

Спасибо, мистер. Джефферсон & APOS; помогите в его ответе выше, хотя и с другой реализацией, я смог проработать этот ответ следующим образом ...

У меня есть scrollView, который имеет изображение плана / диаграммы в качестве подпредставления. ScrollView - это настройка для масштабирования / панорамирования и т. Д., Включая добавление UIScrollViewDelegate в ViewController.

При двойном нажатии пользователя на план / диаграмму изображение булавки добавляется в качестве подпредставления к scrollView в точке касания. Изображение булавки является пользовательским «ZonePin». класс, который наследуется от UIImageView и имеет несколько дополнительных свойств, включая «baseX»; и «baseY».

Код для добавления пинов ...

- (IBAction)planDoubleTap:(UITapGestureRecognizer *) recognizer;
{
    UIImage *image = [UIImage imageNamed:@"Pin.png"];
    ZonePin *newPin = [[ZonePin alloc] initWithImage:image];

    CGPoint touchPoint = [recognizer locationInView:planContainer];
    CGFloat placementX = touchPoint.x - (image.size.width / 2);
    CGFloat placementY = touchPoint.y - image.size.height;

    newPin.frame = CGRectMake(placementX, placementY, image.size.width, image.size.height);
    newPin.zoneRef = [NSString stringWithFormat:@"%@%d", @"BF", pinSeq++];
    newPin.baseX = placementX;
    newPin.baseY = placementY;
    [planContainer addSubview:newPin];
}

Затем у меня есть две функции для обработки взаимодействия scrollView, и это обрабатывает масштабирование / изменение положения штифтов относительно изображения в плане. Эти методы заключаются в следующем ...

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


- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    for (ZonePin *pin in planContainer.subviews) {
        if ([pin isKindOfClass:[ZonePin class]]){
            CGFloat newX, newY;

            newX = (pin.baseX * scrollView.zoomScale) + (((pin.frame.size.width * scrollView.zoomScale) - pin.frame.size.width) / 2);
            newY = (pin.baseY * scrollView.zoomScale) + ((pin.frame.size.height * scrollView.zoomScale) - pin.frame.size.height);

            CGRect pinFrame = pin.frame;
            pinFrame.origin.x = newX;
            pinFrame.origin.y = newY;
            pin.frame = pinFrame;
        }
    }
}

Для справки, расчеты для положения штифтов, по природе их представляют собой штифты ». центрирует изображение булавки на оси x, но выравнивает нижнюю часть оси y.

Единственное, что мне остается с этим сделать, - это изменить вычисления, используемые в методе scrollViewDidScroll, когда я добавляю булавки при увеличении. Код для добавления булавок выше будет работать правильно только тогда, когда scrollView.zoomScale равен 1.0.

Кроме этого, теперь он прекрасно работает! :)

Ваш ответ на вопрос