在滚动视图中的自定义视图中使用触摸进行缩放。 touchesMoved 未调用

Posted

技术标签:

【中文标题】在滚动视图中的自定义视图中使用触摸进行缩放。 touchesMoved 未调用【英文标题】:Zoom with touches in a custom view in a scrollView. touchesMoved not called 【发布时间】:2014-02-19 03:58:34 【问题描述】:

我有一个自定义视图可以缩放,但我也想在任何方向滑动它。缩放效果很好,移动效果很好,但到目前为止它只是其中之一。 touchesMoved 方法永远不会被调用。

scrollView 有一个子视图,用户可以触摸和移动它。它将像一张小地图一样运作。 subView 上有几个自定义标签。我在标签上有一个点击手势识别器,现在可以正常工作,并且在校正缩放和移动后仍然需要工作。

我还尝试了[scrollView setScrollEnabled:NO]; 和其他东西,但这并不能让两者都起作用。如何调用已移动?我需要做什么才能让两者都起作用?

- (void)viewDidLoad

    [super viewDidLoad];

    [self.view setUserInteractionEnabled:YES];

    scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    [scrollView setMinimumZoomScale:.7];
    [scrollView setMaximumZoomScale:1.5];
    [scrollView setAutoresizesSubviews:YES];
    [scrollView setUserInteractionEnabled:YES];
     scrollView.delegate = self;
    [self.view addSubview:scrollView];

    CGRect mapFrame = CGRectMake(0, 0, 300, 300);//temp numbers
    subView = [[UIView alloc]initWithFrame:mapFrame]; 
    subView.userInteractionEnabled=YES;
    subView.autoresizesSubviews=YES;  
    [scrollView addSubview:subView];



-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
        NSLog(@"touchesMoved");
    touch = [touches anyObject];
    CGPoint location = [touch locationInView:subView];
    CGPoint prevLoc = [touch previousLocationInView:subView];
    CGPoint origin = subView.frame.origin;
    origin.x += (location.x - prevLoc.x);
    origin.y += (location.y - prevLoc.y);
    CGRect newFrame = subView.frame;
    newFrame.origin = origin;
    subView.frame = newFrame;


- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
    return subView;


   //label sample
    newCity =[[MyCustomClass alloc] initWithFrame:CGRectMake(x, y, 95, 40)];
    newCity.userInteractionEnabled = YES;
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchUp:)];
    [newCity addGestureRecognizer:tapGesture];
    [subView addSubview:newCity];

我也在日志中得到了这个,不知道为什么。 "Ignoring call to [UIPanGestureRecognizer setTranslation:inView:] since gesture recognizer is not active. " 我删除了平移手势识别器,之后不起作用。我使用的是 Xcode 4.5.2

我的标题是

@interface CitiesViewController : UIViewController <UIScrollViewDelegate, UIGestureRecognizerDelegate>

    UIView      *subView;


@property(nonatomic, strong) UIView *subView;
@property(nonatomic, strong) UIScrollView *scrollView;

【问题讨论】:

【参考方案1】:

为了解决这个问题,我完全删除了 TouchesMoved 并改用 panGestureRecognizer。希望它可以帮助某人。

我将此添加到我的子视图中:

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];
[pan setDelegate:self];
[subView addGestureRecognizer:pan];

添加这个方法:

- (void)handlePan:(UIPanGestureRecognizer *)recognizer 

    CGPoint translation = [recognizer translationInView:subView];
    subView.center = CGPointMake(recognizer.view.center.x + translation.x,
                                 recognizer.view.center.y + translation.y);

我从来没有弄清楚为什么仍然会出现忽略对 [UIPanGestureRecognizer setTranslation:inView:] 的调用的消息,但这似乎有效。

【讨论】:

以上是关于在滚动视图中的自定义视图中使用触摸进行缩放。 touchesMoved 未调用的主要内容,如果未能解决你的问题,请参考以下文章

在滚动视图内的 UIImageView 上捏缩放效果?

onDraw 滚动视图中的自定义视图

如何在我自己的自定义视图中重现 iPhone UIScrollView 的轻弹滚动行为?

在 ios 的滚动视图中绘制缩放的图像视图?

带有 UIButtons 的 UIScrollView - 当按钮开始触摸时,滚动视图不会滚动

在可重复使用的表格视图单元格中自动触摸按钮