Используя UIScrollview для увеличения / панорамирования изображения, поместите элементы поверх изображения и переместите их - PullRequest
0 голосов
/ 18 октября 2011

Я использую uiscrollview для отображения UIImageview, который больше, чем размер экрана (так же, как просмотр фотографий в библиотеке фотографий).Затем мне нужно было добавить точку (я использую UIImageview, чтобы показать точку) на экране, когда пользователь нажимает.Получил, что работает.

Теперь то, что я пытаюсь сделать, это иметь эту точку, чтобы оставаться в том же месте относительно изображения.UIScrollview имеет некоторые уведомления о том, когда перетаскивание начинается и заканчивается, но ничего, что дает постоянное обновление его смещения содержимого.скажем, я поставил точку в X месте.Затем я прокручиваю вниз на 50 пикселей, точка должна плавно переместиться на 50 пикселей вверх (чтобы точка всегда оставалась в одном и том же месте относительно изображения).

У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: добавление кода

- (void)viewDidLoad
{
    [super viewDidLoad];
    //other code...
    scrollView.delegate = self;
    scrollView.clipsToBounds = YES;
    scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
    scrollView.minimumZoomScale = (scrollView.frame.size.width  / imageView.frame.size.width);
    scrollView.maximumZoomScale = 10.0;    
    //other code...
}

добавление точки

-(void) foundTap:(UITapGestureRecognizer *) recognizer
{
    CGPoint pixelPos = [recognizer locationInView:self.view];

    UIImageView *testPoint = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"inner-circle.png"]];
    testPoint.frame = CGRectMake(0, 0, 20, 20);
    testPoint.center = CGPointMake(pixelPos.x, pixelPos.y);
    [self.scrollView addSubview:testPoint];

    NSMutableArray *tempTestPointArray = [[NSMutableArray alloc] initWithArray:testPointArray];
    [tempTestPointArray addObject:testPoint];
    testPointArray = tempTestPointArray;

    NSLog(@"recorded point %f,%f",pixelPos.x,pixelPos.y);
}

получение точек пикселей

-(void)scrollViewDidZoom:(UIScrollView *)scrollView
{
    NSLog(@"zoom factor: %f", scrollView.zoomScale);
    UIPinchGestureRecognizer *test = scrollView.pinchGestureRecognizer;

    UIView *piece = test.view;
    CGPoint locationInView = [test locationInView:piece];
    CGPoint locationInSuperview = [test locationInView:piece.superview];

    NSLog(@"locationInView: %@ locationInSuperView: %@", NSStringFromCGPoint(locationInView), NSStringFromCGPoint(locationInSuperview));
}

Ответы [ 3 ]

2 голосов
/ 18 октября 2011

Разве вы не можете просто добавить представление изображения с точкой в ​​качестве подпредставления представления прокрутки?

2 голосов
/ 18 октября 2011

Вы можете реализовать метод UIScrollViewDelegate scrollViewDidScroll: для получения непрерывного обратного вызова при каждом изменении смещения содержимого.

0 голосов
/ 18 октября 2011

Вы можете использовать что-то вроде этого:

UIGraphicsBeginImageContext(mainimg.frame.size);
[mainimg.image drawInRect:
         CGRectMake(0, 0, mainimg.frame.size.width, mainimg.frame.size.height)];

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetLineCap(ctx, kCGLineCapButt);
CGContextSetLineWidth(ctx,2.0);
CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);
CGContextBeginPath(ctx);
if (largecursor == FALSE) {
    CGContextMoveToPoint(ctx, pt.x-3.0, pt.y);
    CGContextAddLineToPoint(ctx, pt.x+3.0,pt.y);
    CGContextMoveToPoint(ctx, pt.x, pt.y-3.0);
    CGContextAddLineToPoint(ctx, pt.x, pt.y+3.0);
} else {
    CGContextMoveToPoint(ctx, 0.0, pt.y);
    CGContextAddLineToPoint(ctx, maxx,pt.y);
    CGContextMoveToPoint(ctx, pt.x, 0.0);
    CGContextAddLineToPoint(ctx, pt.x, maxy);
}

CGContextStrokePath(ctx);
mainimg.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...