iOS: подпредставления с centeroffset (следовательно, не перекрестье!!) игнорируются при увеличении / уменьшении родительского вида
Я имею:
-
UIScrollView
UIImageView
как подпредставление предыдущего прокрутки (это очень большое фоновое изображение с 1 зеленым кружком и 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);
, Это установит опорную точку в середине нижней части оранжевого штифта, где находится его пик. Любое последующее аффинное преобразование будет использовать эту новую опорную точку. Этот трюк не был так очевиден для начинающего, как я