【问题标题】:how to accept UIPanGestureRecognizer on all objects in NSArray如何在 NSArray 中的所有对象上接受 UIPanGestureRecognizer
【发布时间】:2014-12-21 03:56:48
【问题描述】:

我创建了一个UIScrollView 并添加了UIPanGestureRecognizer,然后在滚动视图中我添加了一些UIImageView 然后我在图像上添加了这个DragAndDrop2 问题是当我拖动图像时它可以工作但是只有一个图像我在代码中创建了一个NSArray,但仍然存在相同的问题,UIPanGestureRecognizer *DragAndDrop2 在数组的最后一个对象上被接受,所以我如何将这个UIPanGestureRecognizer *DragAndDrop2 应用于数组中的所有UIIMageView 所以无论我从UIImages 中选择什么,都将接受UIPanGestureRecognizer 这是代码中的

UIImage+Stuff.h

#import <UIKit/UIKit.h>

@interface UIImage (Stuff)

//
// return an UIImage from a CALayer
//
+ ( UIImage* ) grabImage:(CALayer*)layer;

@end

UIImage+Stuff.m

#import "UIImage+Stuff.h"

@implementation UIImage (Stuff)

+ ( UIImage* ) grabImage:(CALayer*)layer
{
UIGraphicsBeginImageContext ( layer.frame.size );
[ layer renderInContext:UIGraphicsGetCurrentContext() ];

    UIImage *grab = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return grab;
}
@end

MainGameVC.h

@class APChartObject;

//
// drag status
//
typedef enum {
tDragStatusBegin = 0,
tDragStatusEnd,
tDragStatusIntersectIn,
tDragStatusIntersectOut
} tDragStatus;

@interface MainGameVC : UIViewController
//top menu scroll views
@property (nonatomic, retain) IBOutlet UIScrollView *TopMenuViewer;
@property (nonatomic, retain) IBOutlet UIScrollView *scrollview;

//drag and drop
@property (nonatomic, strong) IBOutlet UIView *DropView;
@property (nonatomic, strong) UIImageView *dragObject;
@property (nonatomic, strong) IBOutlet UIScrollView *cart;
@property (nonatomic, assign) tDragStatus dragging;
@property (nonatomic, strong) APChartObject *selectedModel;
@property (weak, nonatomic) IBOutlet UIImageView *DragedObjectWheat;
@property (weak, nonatomic) IBOutlet UIImageView *DragedObjectCorn;
@property (weak, nonatomic) IBOutlet UIImageView *DragedObjectOnion;
@end

MainGameVC.m

#import "UIImage+Stuff.h"
@interface MainGameVC ()
{
UIImageView *_selectedView;
CGPoint _startPoint;
}

@end

- (void)viewDidLoad
{
// drag and drop touch
UIPanGestureRecognizer *DragAndDrop = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panDetected:)];
[self.TopMenuViewer addGestureRecognizer:DragAndDrop];

NSArray *imageViewArray = [NSArray arrayWithObjects:DragedObjectWheat,DragedObjectCorn,DragedObjectOnion, nil];

for(UIImageView *image in imageViewArray)
{
    UIPanGestureRecognizer *DragAndDrop2 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panDetected:) ];
    [DragAndDrop2 setMinimumNumberOfTouches:1];

    [image addGestureRecognizer:DragAndDrop2];
    image.userInteractionEnabled = YES;

}

}

    //+---------------------------------------------------------------------------+
    #pragma mark - View exchange
    // +---------------------------------------------------------------------------+


    //
    // make the tricks.
    // Add a subview with the screenshot of selected and move around the screen
    //
    - ( void) cloneViewWithCenter:(CGPoint)point image:(UIImage*)grab
    {
        if ( _selectedView ) [ _selectedView removeFromSuperview ];

        _selectedView = [[ UIImageView alloc ] initWithImage:grab ];
        _selectedView.frame = CGRectMake(point.x, point.y, grab.size.width, grab.size.height);
        _selectedView.userInteractionEnabled = YES;

        [ self.view addSubview:_selectedView ];

        UIPanGestureRecognizer *pan = [[ UIPanGestureRecognizer alloc ] initWithTarget:self action:@selector(moveObject:) ];
        [ pan setMinimumNumberOfTouches:1 ];
        [ _selectedView addGestureRecognizer:pan ];
    }


    // +---------------------------------------------------------------------------+
    #pragma mark - Refresh
    // +---------------------------------------------------------------------------+


    //
    // refresh loop
    //
    - (void) refreshView
    {
        [UIView animateWithDuration:0.2 animations:^
         {
             CGRect r = _selectedView.frame;

             switch ( _dragging ) {
                 case tDragStatusBegin:
                     r.size.width  *= 1;
                     r.size.height *= 1;
                     break;
                 case tDragStatusEnd:
                     r.size.width  /= 1;
                     r.size.height /= 1;
                     break;
                 case tDragStatusIntersectIn:
                     r.size.width  = 1;
                     r.size.height = 1;

                     [ self finishDrag ];
                     break;
                 case tDragStatusIntersectOut:
                     _selectedView.center = _startPoint;
                     break;
             }

             _selectedView.frame = r;

         } completion:^(BOOL finished)
         {

             if ( _dragging == tDragStatusIntersectOut )
                 _selectedView.hidden = YES;

         }];
    }

    //
    // end drag
    //
    - (void) finishDrag
    {
        UIImageView *img = [[UIImageView alloc] initWithImage:_selectedView.image];
        [ self appendView:img ];
    }

    //
    // check for insertion in cart (or not)
    //
    - (void) checkForIntersection
    {
        //
        // ABS coords.
        //
        CGRect childRect = [ self.view convertRect:_selectedView.frame fromView:nil ];
        CGRect cartRect  = [ self.view convertRect:_cart.frame fromView:nil ];

        if ( CGRectIntersectsRect ( childRect, cartRect ))
        {
            self.dragging = tDragStatusIntersectIn;

        }
        else
        {
            self.dragging = tDragStatusIntersectOut;
        }
    }

    - (void) refreshCart
    {
        [ _cart setContentOffset:CGPointMake(_cart.contentOffset.x, 0) animated:YES ];
    }


    // +---------------------------------------------------------------------------+
    #pragma mark - Pan gesture
    // +---------------------------------------------------------------------------+

    - ( void ) panDetected:(UIPanGestureRecognizer*)gesture
    {

        CGPoint pInView = [ gesture locationInView:self.view ];
        //CGSize  pSize   = gesture.view.frame.size;

        if ( gesture.state == UIGestureRecognizerStateBegan )
        {
            _startPoint = pInView;

    //        UIPanGestureRecognizer *DragAndDrop2 = [[ UIPanGestureRecognizer alloc ] initWithTarget:self action:@selector(panDetected:) ];
    //        [ DragAndDrop2 setMinimumNumberOfTouches:1 ];
    //        [DragedObjectCorn addGestureRecognizer:DragAndDrop2];
    //        [DragedObjectOnion addGestureRecognizer:DragAndDrop2];
    //        [DragedObjectWheat addGestureRecognizer:DragAndDrop2];
    //        
    //        NSArray *imageViewArray = [NSArray arrayWithObjects:DragedObjectWheat,DragedObjectCorn,DragedObjectOnion, nil];
    //        for(UIImageView *image in imageViewArray)
    //        {
    //            [image addGestureRecognizer:DragAndDrop2];
    //            image.userInteractionEnabled = YES;
    //        }


    UIGestureRecognizer *DragAndDrop2;
    // grab image
    //
     UIImage *grab = [UIImage grabImage: DragAndDrop2.view.layer];
            //
            // centering view
            //
            //pInView.x = pInView.x - pSize.width/2;
            //pInView.y = pInView.y - pSize.height/2;

            [ self cloneViewWithCenter:pInView image:grab ];

            self.dragging = tDragStatusBegin;
        }
        else if ( gesture.state == UIGestureRecognizerStateChanged )
        {
            [ self moveObject:gesture ];
        }
        else if ( gesture.state == UIGestureRecognizerStateEnded )
        {
            self.dragging = tDragStatusEnd;
            [ self checkForIntersection ];
        }
    }

    //
    // move draggable view around
    //
    - (void) moveObject:(UIPanGestureRecognizer *)pan
    {
        _selectedView.center = [ pan locationInView:_selectedView.superview ];
    }


    // +---------------------------------------------------------------------------+
    #pragma mark - Setter
    // +---------------------------------------------------------------------------+


    - (void)setDragging:(tDragStatus)dragging
    {
        _dragging = dragging;
        [ self refreshView ];
    }


    // +---------------------------------------------------------------------------+
    #pragma mark - Chart view
    // +---------------------------------------------------------------------------+


    //
    // recursively append view to scrollview.
    // If position already contains a view, shift and retry.
    //
    - (void) appendView:(id)view
    {
        //    UIView *v = view;
        //
        //    CGRect vRect = [ self.view convertRect:v.frame fromView:nil ];
        //
        //    for ( UIView *innerView in _cart.subviews )
        //    {
        //        CGRect cartRect = [ self.view convertRect:innerView.frame fromView:nil ];
        //
        //        if ( CGRectIntersectsRect(vRect, cartRect) )
        //        {
        //            CGRect r = v.frame;
        //            r.origin.x += r.size.width;
        //            v.frame = r;
        //
        //           _cart.contentSize = CGSizeMake(r.origin.x + 80, 80);
        //
        //            return [ self appendView:v ];
        //        }
        //    }
        //    
        [ _cart addSubview:view ];

        [ self performSelector:@selector(refreshCart) withObject:nil afterDelay:0 ];
    }
    @end

【问题讨论】:

    标签: ios objective-c uiscrollview uiimageview nsarray


    【解决方案1】:

    两件事:

    1. 您必须将您的UIImageViews 设置为userInteractionEnabled = YES,因为默认情况下它们的用户交互属性是禁用的。

    2. 每个UIImageView 都应该有自己的UIGestureRecognizer

    我建议像这样编辑您的代码:

    NSArray *imageViewArray = [NSArray arrayWithObjects:DragedObjectWheat,DragedObjectCorn,DragedObjectOnion, nil];
    
    for(UIImageView *image in imageViewArray)
    {
        UIPanGestureRecognizer *DragAndDrop2 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panDetected:) ];
        [DragAndDrop2 setMinimumNumberOfTouches:1];
    
        [image addGestureRecognizer:DragAndDrop2];
        image.userInteractionEnabled = YES;
    
    }
    

    另外,我不知道你想用这行做什么,但这段代码有点可疑:

    UIImage *grab = [UIImage grabImage: DragAndDrop2.view.layer];
    

    编辑:

    将我写的第一个代码块移动到您的viewDidLoad,然后在panDetected 中更改这些行:

    UIGestureRecognizer *DragAndDrop2;
    UIImage *grab = [UIImage grabImage: DragAndDrop2.view.layer];
    

    到这里:

    UIImage *grab = [UIImage grabImage: gesture.view.layer];
    

    就像在 github 代码中一样,这样您就可以从当前手势中抓取图像。

    【讨论】:

    • UIImage *grab = [UIImage grabImage: DragAndDrop2.view.layer]; 正在获取 DragAndDrop2 "GestureRecognizer" 中接受的图像,并将其添加到这个 grap uiimage 中,以便它在屏幕,除了 GestureRecognizer 仅应用于数组中的最后一个对象之外,问题一切正常,而你想要的是当我选择数组中的任何其他 uiimages 时应该应用 GestureRecognizer
    • 在这种情况下它工作得很好,但正如你在我的代码中看到的那样,数组中的最后一个对象是 DragedObjectOnion,所以它是唯一的工作,所以你如何在滚动中选择其他图像查看它运行并只显示洋葱的图像
    • 我的项目是关于从滚动视图中拖放项目,所以将它从滚动视图中拖放到 uiview 或其他滚动视图中,但真的让我特别头疼,尤其是初学者
    • @Mahmoud 您是否尝试按照我在回答的第一部分中建议的那样编辑您的代码?
    • 是的,当我将 UIPanGestureRecognizer 放在 for 语句中时,UIImage *grap .... 行给出错误,因为看不到 DragAndDrop2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多