0

我有:

  • 一个UIScrollView
  • UIImageView作为前一个滚动视图的子视图(这是一个非常大的背景图像,带有 1 个绿色圆圈和 1 个红色圆圈)。它有 2 个两个子视图:

    1. 第一个图钉图像(白色十字)
    2. 第二个图钉(橙色的自定义地图图钉)

两个引脚都必须指向它们的圆心:

  • 白色十字的中心必须在绿色圆圈的中心
  • 橙色地图图钉的底峰必须位于红色圆圈的中心。

这是所需的行为,当应用程序启动时,我得到了它。
(我还成功地应用了反转变换来防止两个引脚在缩放时与大背景图像一起缩放(正如 Andrew Madsen 在另一篇文章中所解释的那样)。


我放大/缩小时,橙色引脚(有一种“ centerOffset") 似乎向上/向下移动,因为它的底峰失去了红色圆圈的中心。
(而白色十字是可以的,因为它总是以圆圈为中心)

在此处查看 1 个正确行为示例(在启动时)和 2 个错误行为示例:https ://www.dropbox.com/s/8stjh892wm8yfdb/123.png

我还尝试将 MKAnnotationView 子类化为橙色引脚,并设置 centerOffset:

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

in
- (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://stackoverflow.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

提前致谢。
米克

4

1 回答 1

0

经过另一个晚上的测试,我终于找到了诀窍,而且非常简单。[topOrangeMapPin.layer setAnchorPoint:CGPointMake(0.5, 1)];在 之后添加topOrangeMapPin.center = CGPointMake(284, 308);。这会将锚点设置在橙色针脚底部的中间,就在它的峰值处。任何后续的仿射变换都将使用这个新的锚点。对于像我这样的初学者来说,这个技巧并不那么明显

于 2013-10-28T13:03:40.237 回答