iOS: подпредставления с centeroffset (следовательно, не перекрестье!!) игнорируются при увеличении / уменьшении родительского вида

Я имею:

  • UIScrollView
  • UIImageView как подпредставление предыдущего прокрутки (это очень большое фоновое изображение с 1 зеленым кружком и 1 красным кружком). Имеет 2 два подпредставления:

    1. первое изображение булавки (белый крест)
    2. второе изображение булавки (оранжевый пин-код карты)

Оба контакта должны указывать на центр их окружностей:

  • центр белого креста должен быть в центре зеленого круга
  • нижняя вершина оранжевой булавки должна быть в центре красного круга.

Это желаемое поведение, и, когда приложение запускается, я получил его.
(Я также успешно применил инвертированное преобразование, чтобы предотвратить масштабирование обоих выводов с большим фоновым изображением при масштабировании (как объяснил Эндрю Мэдсен в другом посте).

Эта проблема
Когда я увеличиваю / уменьшаю масштаб, оранжевый штифт (который имеет вид "centerOffset") кажется движущимся вверх / вниз, потому что его нижняя вершина потеряла центр красного круга.
(хотя белый крест в порядке, потому что он всегда в центре круга)

Смотрите 1 пример правильного поведения (при запуске) и 2 примера неправильного поведения здесь: https://www.dropbox.com/s/8stjh892wm8yfdb/123.png

Я также пытаюсь создать подкласс MKAnnotationView для оранжевого вывода и установить centerOffset:

self.centerOffset = CGPointMake(0,-self.image.size.width/2); 

в
- (void)setAnnotation:(id <MKAnnotation>)annotation,
но это игнорируется (возможно, потому что это не на mkmapview).


Как настроить нижний пик оранжевого штифта так, чтобы он следовал за центром красного круга при увеличении / уменьшении?

Я повторяю это для пояснения: я не хочу, чтобы центр оранжевого штифта всегда был в центре красного круга, я хочу, чтобы нижний пик оранжевого штифта всегда был в центре красного круга.

Вот пример кода ViewController

#import <QuartzCore/QuartzCore.h>
#import "TestViewController.h"


@implementation TestViewController

@synthesize scrollView;

//SLImageView is my extension of UIImageView with the invertedTransform (see: http://stackru.com/questions/12981201/keep-subviews-of-uiscrollview-from-resizing)
@synthesize backgroundImageView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIImage *image = [UIImage imageNamed:@"circles.png"];


    self.backgroundImageView = [[SLImageView alloc] initWithImage:image];
    self.backgroundImageView.frame = (CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=image.size};
    [self.scrollView addSubview:self.backgroundImageView];

    // Tell the scroll view the size of the contents
    self.scrollView.contentSize = image.size;


}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Set up the minimum & maximum zoom scales
    CGRect scrollViewFrame = self.scrollView.frame;
    CGFloat scaleWidth = scrollViewFrame.size.width / self.scrollView.contentSize.width;
    CGFloat scaleHeight = scrollViewFrame.size.height / self.scrollView.contentSize.height;
    CGFloat minScale = MIN(scaleWidth, scaleHeight);
    self.scrollView.minimumZoomScale = minScale;
    self.scrollView.maximumZoomScale = 4.0f;
    self.scrollView.delegate = self;

    UIImageView *topWhiteCrossPin = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cross.png"]];
    topWhiteCrossPin.center = CGPointMake(110, 304);

    UIImageView *topOrangeMapPin = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"centerOffsetPin.png"]];
    topOrangeMapPin.center = CGPointMake(284, 288);

    [backgroundImageView addSubview:topWhiteCrossPin];
    [backgroundImageView addSubview:topOrangeMapPin];

    self.scrollView.zoomScale = minScale * 3.5;
}


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


@end

Полный пример проекта xcode здесь: https://www.dropbox.com/s/rvohsn1wemd4lyj/AffineTransformExample.zip

Заранее спасибо.
Мик

1 ответ

Решение

После очередной ночи испытаний я наконец-то нашел хитрость, и это очень просто. добавлять [topOrangeMapPin.layer setAnchorPoint:CGPointMake(0.5, 1)]; сразу после topOrangeMapPin.center = CGPointMake(284, 308);, Это установит опорную точку в середине нижней части оранжевого штифта, где находится его пик. Любое последующее аффинное преобразование будет использовать эту новую опорную точку. Этот трюк не был так очевиден для начинающего, как я

Другие вопросы по тегам