2014-02-10 59 views
0

我有一個帶有UIScrollView(boardScrollView)的RootViewController。這有一個UIImageView作爲子視圖來創建一個電路板(boardImage)。我可以放大和縮小,工作正常。也滾動工作正常!
現在,我想拖拽&將其他UIImageViews(Tiles)拖入和拖出ScrollView。iOS拖放到另一個視圖的子類

我已經將UIImageView子類化爲TileImageView,並重寫了方法touchesBegan,touchesMoved和touchesEnded。拖動&下降在超視圖上正常工作。但我希望能夠在RootViewController上的一個IBOutlet上的ScrollView上放置Tiles。

我可以拖放瓦片,因爲我可以使用superview但我不知道如何將瓦片添加到boardScrollView。

任何人都知道如何從子類訪問RootViewController上的對象?
我應該委託一些東西嗎?或者設置不同的參數?

代碼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.... 
} 

回答

0

我可以通過循環瓷磚添加到滾動型在子視圖上。

- (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; 
     } 
    } 

} 
相關問題