iOS拖放到另一个具有子类的视图



我有一个带有UIScrollView(boardScrollView)的RootViewController。这有一个UIImageView作为子视图来创建一个板(boardImage)。我可以放大和缩小,效果很好。滚动也很好
现在,我想拖动&将其他UIImageViews(平铺)拖放到ScrollView中或从中移出。

我已经将UIImageView子类化为TileImageView,并重写了方法touchesBegan、touchesMoved和touchesEnded。拖动&drop在superview上运行良好。但我希望能够将Tiles放在ScrollView上,这是RootViewController上的IBOutlet。

我可以拖放磁贴,因为我可以使用superview,但我不知道如何将磁贴添加到板ScrollView。

有人知道我如何从子类访问RootViewController上的对象吗
我应该委派什么吗?或者设置不同的参数?

代码根视图控制器:

@implementation RootViewController_iphone
@synthesize boardScrollView;
@synthesize dragObject;
@synthesize boardImage;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.boardScrollView.clipsToBounds = YES;
UIImage *image = [UIImage imageNamed:@"greyblue_numbered_15x15_900x900.png"];
self.boardImage = [[UIImageView alloc] initWithImage:image];
self.boardImage.frame = (CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=image.size};
[self.boardScrollView addSubview:self.boardImage];
self.boardImage.userInteractionEnabled = YES;
self.boardScrollView.contentSize = image.size;
self.boardScrollView.userInteractionEnabled = YES;
self.boardScrollView.canCancelContentTouches = NO;
}

代码子类TileImageView.h:

#import <UIKit/UIKit.h>
@interface TileImageView : UIImageView
@property (nonatomic, strong) UIImageView *dragObject;
@property (nonatomic, assign) CGPoint touchOffset;
@end

代码子类TileImageView.m:

#import "TileImageView.h"
@implementation TileImageView
@synthesize dragObject;
@synthesize touchOffset;

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.exclusiveTouch = YES;
self.userInteractionEnabled = YES;
}
return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if ([touches count] == 1) {
// one finger
CGPoint touchPoint = [[touches anyObject] locationInView:self.superview];
// for now, I use the superview, but to be able to drag from the ScrollView, 
I need to access the boardScrollView on the UIViewController...
// i.e     CGPoint touchPoint = [[touches anyObject] locationInView:self.boardScrollView];
for (UIImageView *iView in self.superview.subviews) {
if ([iView isMemberOfClass:[TileImageView class]]) {
if (touchPoint.x > iView.frame.origin.x &&
touchPoint.x < iView.frame.origin.x + iView.frame.size.width &&
touchPoint.y > iView.frame.origin.y &&
touchPoint.y < iView.frame.origin.y + iView.frame.size.height)
{
self.dragObject = iView;
self.touchOffset = CGPointMake(touchPoint.x - iView.frame.origin.x,
touchPoint.y - iView.frame.origin.y);
[self.superview bringSubviewToFront:self.dragObject];
}
}
}
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint touchPoint = [[touches anyObject] locationInView:self.superview];
// here I use the superview, but I also want to use the ScrollView
CGRect newDragObjectFrame = CGRectMake(touchPoint.x - touchOffset.x,
touchPoint.y - touchOffset.y,
self.dragObject.frame.size.width,
self.dragObject.frame.size.height);
self.dragObject.frame = newDragObjectFrame;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
// here I need to be able to use the ScrollView on the RootViewController....
}

我可以通过循环子视图将tile添加到ScrollView中。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Ended Tile!");
for (UIView *iView in self.superview.subviews) {
NSLog(@"superview.subviews");
if ([iView isMemberOfClass:[UIScrollView class]])
{
CGPoint touchPointScreen = [[touches anyObject] locationInView:self.superview];
CGPoint touchPointBoard = [[touches anyObject] locationInView:iView];
if (touchPointScreen.x > iView.frame.origin.x &&
touchPointScreen.x < iView.frame.origin.x + iView.frame.size.width &&
touchPointScreen.y > iView.frame.origin.y &&
touchPointScreen.y < iView.frame.origin.y + iView.frame.size.height)
{
for (UIView *iView2 in iView.subviews) {
[iView2 addSubview:self.dragObject];
CGPoint touchPointImage = [[touches anyObject] locationInView:iView2];
self.dragObject.frame = CGRectMake(touchPointImage.x - touchOffset.x,
touchPointImage.y - touchOffset.y,
self.dragObject.frame.size.width,
self.dragObject.frame.size.height);
}
}
self.dragObject = nil;
} 
} 
}

最新更新