首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS:带有中心偏移量的子视图(因此不是交叉视图!!)在放大/移出父视图时忽略

问iOS:带有中心偏移量的子视图(因此不是交叉视图!!)在放大/移出父视图时忽略
EN

Stack Overflow用户
提问于 2013-10-14 08:45:40
回答 1查看 390关注 0票数 0

我有:

  • UIScrollView

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

代码语言:javascript
复制
1. first pin image (a white cross)
2. second pin image (an orange custom map pin)  

​

两个引脚都必须指向其圆圈的中心:

  • 白色十字的中心必须在绿色圆圈的中心。
  • 橙色地图针的底部峰值必须在红色圆圈的中心.

这是期望的行为,当应用程序启动时,我得到了它。

(我还成功地应用了倒置变换,以防止两个引脚在缩放时与大背景图像进行缩放(如Andrew在另一篇文章中所解释)。

问题

当我放大/缩小时,橙色引脚(它有一种"centerOffset")似乎向上/向下移动,因为的底部峰值失去了红色圆的中心。

(白色十字是可以的,因为它总是以圆心为中心)

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

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

代码语言:javascript
复制
self.centerOffset = CGPointMake(0,-self.image.size.width/2); 

在……里面

- (void)setAnnotation:(id <MKAnnotation>)annotation,

但是它被忽略了(可能是因为它不在mkmapview上)。

如何设置橙色针底部的峰值,使之在放大/缩小时沿着红色圆心移动?

我重复一遍是为了澄清:我不希望橙色引脚的中心总是在红色圆的中心,我希望橙色引脚的底部峰值总是在红色圆的中心。

下面是ViewController的示例代码

代码语言:javascript
复制
#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

提前谢谢。

米克

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-28 13:03:40

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19356472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档