gpt4 book ai didi

ios - 我可以将手势识别器的代码放在 View 的子类中吗?

转载 作者:行者123 更新时间:2023-11-29 12:56:24 25 4
gpt4 key购买 nike

我的程序中有一个主视图,其中有一个可拖动的 View 。可以使用平移手势来拖动此 View 。目前虽然它使用了很多我想放在子类中的代码以降低复杂性。 (我最终想通过允许用户使用更多平移手势扩展 View 来增加功能。这意味着如果我不能先解决这个问题,将会有更多代码阻塞我的 View Controller )

是否有可能在一个类的子类中拥有手势识别器的代码,并且仍然与父类中的 View 进行交互。

这是我用于在父类中启用平移手势的当前代码:

-(void)viewDidLoad {

...


UIView * draggableView = [[UIView alloc]initWithFrame:CGRectMake(highlightedSectionXCoordinateStart, highlightedSectionYCoordinateStart, highlightedSectionWidth, highlightedSectionHeight)];
draggableView.backgroundColor = [UIColor colorWithRed:121.0/255.0 green:227.0/255.0 blue:16.0/255.0 alpha:0.5];
draggableView.userInteractionEnabled = YES;

[graphView addSubview:draggableView];

UIPanGestureRecognizer * panner = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panWasRecognized:)];

[draggableView addGestureRecognizer:panner];

}

- (void)panWasRecognized:(UIPanGestureRecognizer *)panner {

UIView * draggedView = panner.view;
CGPoint offset = [panner translationInView:draggedView.superview];
CGPoint center = draggedView.center;

// We want to make it so the square won't go past the axis on the left
// If the centre plus the offset

CGFloat xValue = center.x + offset.x;

draggedView.center = CGPointMake(xValue, center.y);

// Reset translation to zero so on the next `panWasRecognized:` message, the
// translation will just be the additional movement of the touch since now.
[panner setTranslation:CGPointZero inView:draggedView.superview];
}

(Thanks to Rob Mayoff for getting me this far)

我现在已经添加了 View 的子类,但无法弄清楚我需要如何或在何处创建手势识别器,因为 View 现在是在子类中创建并添加到父类中。

我真的希望手势识别器的目标在这个子类中,但是当我尝试对其进行编码时,什么也没有发生。

我已经尝试将所有代码放在子类中并将平移手势添加到 View 中,但是当我尝试拖动它时出现错误的访问崩溃。

我目前正在尝试使用

[graphView addSubview:[[BDraggableView alloc] getDraggableView]];

将其添加到 subview ,然后在子类的函数 getDraggableView 中设置 View (添加平移手势等)

必须有一种更直接的方法来做到这一点,我还没有概念化 - 我在处理子类方面还是很新,所以仍在学习它们是如何组合在一起的。

感谢您提供的任何帮助

最佳答案

我想我可能会弄明白这一点。

在父类中我创建了子类变量:

BDraggableView * draggableViewSubClass;
draggableViewSubClass = [[BDraggableView alloc] initWithView:graphView andRangeChart: [rangeSelector getRangeChart]];

这使我可以使用我希望在其上具有可拖动 View 的 View 来初始化子类:graphView

然后在 subview 中,我像往常一样设置平移手势,但将其添加到此 View 中:

- (id)initWithView:(UIView *) view andRangeChart: (ShinobiChart *)chart {
self = [super initWithNibName:nil bundle:nil];
if (self) {
// Custom initialization
parentView = view;

[self setUpViewsAndPans];
}
return self;
}

- (void)setUpViewsAndPans {

draggableView = [[UIView alloc]initWithFrame:CGRectMake(highlightedSectionXCoordinateStart, highlightedSectionYCoordinateStart, highlightedSectionWidth, highlightedSectionHeight)];
draggableView.backgroundColor = [UIColor colorWithRed:121.0/255.0 green:227.0/255.0 blue:16.0/255.0 alpha:0.5];
draggableView.userInteractionEnabled = YES;

// Add the newly made draggable view to our parent view
[parentView addSubview:draggableView];
[parentView bringSubviewToFront:draggableView];

// Add the pan gesture
UIPanGestureRecognizer * panner = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panWasRecognized:)];
[draggableView addGestureRecognizer:panner];
}

- (void)panWasRecognized:(UIPanGestureRecognizer *)panner {

UIView * draggedView = panner.view;
CGPoint offset = [panner translationInView:draggedView.superview];
CGPoint center = draggedView.center;

CGFloat xValue = center.x + offset.x;

draggedView.center = CGPointMake(xValue, center.y);

// Reset translation to zero so on the next `panWasRecognized:` message, the
// translation will just be the additional movement of the touch since now.
[panner setTranslation:CGPointZero inView:draggedView.superview];
}

我花了一段时间才在脑海中理顺我们想要在我们的子类中进行所有设置,然后将这个 View 及其特性添加到父 View 中。

感谢所有的答案,只要他们让我按照正确的思路思考解决问题

关于ios - 我可以将手势识别器的代码放在 View 的子类中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20962193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com