Objective c 将uiimage拖放到另一个uiimageview中

Objective c 将uiimage拖放到另一个uiimageview中,objective-c,ipad,drag-and-drop,uiimageview,Objective C,Ipad,Drag And Drop,Uiimageview,我使用以下代码片段拖放uiimageview UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; [panRecognizer setMinimumNumberOfTouches:1]; [panRecognizer setMaximumNumberOfTouches:1]; [panRecognizer setD

我使用以下代码片段拖放uiimageview

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
[panRecognizer setMinimumNumberOfTouches:1];
[panRecognizer setMaximumNumberOfTouches:1];
[panRecognizer setDelegate:self];
[myImageView addGestureRecognizer:panRecognizer];

-(void)move:(id)sender {

    CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view];

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {

        firstX = [myImageView  center].x;
        firstY = [myImageView  center].y;
    }

    translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y);
    [myImageView  setCenter:translatedPoint];

}

这段代码会拖动整个myImageView,但我的要求是只需拖动uiimage并将其放到另一个uiimagview中。拖动后myImageView也应保持原样。只需拖动myImageView层。可拖动的图像应为透明的。如果有任何想法,我将不胜感激。

我几乎没有付出任何努力来实现您的成果。试试看

步骤1
:在
.h
文件中定义这3个变量

UIImageView *ivSource1, *ivDestination2, *tempIV;
步骤2
:初始化所有三个
UIImageView
并添加到
ViewController
viewDidLoad
方法中写入

ivSource1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1.jpg"]];
[ivSource1 setFrame:CGRectMake(100, 100, 100, 100)];
[ivSource1 setTag:100];
[ivSource1 setUserInteractionEnabled:YES];    
[self.view addSubview:ivSource1];

ivDestination2 = [[UIImageView alloc] init];
[ivDestination2 setFrame:CGRectMake(200, 300, 100, 100)];
[ivDestination2 setTag:101];
[ivDestination2 setUserInteractionEnabled:YES];
[self.view addSubview:ivDestination2];

tempIV = [[UIImageView alloc] init];
[tempIV setFrame:CGRectMake(0, 300, 100, 100)];
[tempIV setTag:102];
[tempIV setUserInteractionEnabled:YES];
[self.view addSubview:tempIV];
步骤3
:定义以下触摸方法来处理拖放图像的移动

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    if([[touch view] tag] == 100)
    {
        [tempIV setImage:ivSource1.image];
        [tempIV setCenter:[touch locationInView:self.view]];
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    [tempIV setCenter:[touch locationInView:self.view]];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    [tempIV setCenter:[touch locationInView:self.view]];

    if(CGRectContainsPoint(ivDestination2.frame, [touch locationInView:self.view]))
    {
        [ivDestination2 setImage:tempIV.image];
    }
    // Remove image from dragable view
    [tempIV setImage:[UIImage imageNamed:@""]];    
}

在iOS 13中,您可以使用拖放和复制/粘贴API来执行
UIImage
从一个
UIImageView
到另一个
UIImageView
的拖放操作。根据您的需要,您可以从以下两种Swift 5.1实现中选择一种


#1.使用
UIDragInteraction
UIDragInteractionDelegate
UIPasteConfiguration

#2.使用
UIDraginInteraction
UIDraginInteractionDelegate
UIDropInteraction
UIDropInteractionDelegate
import UIKit

class ViewController: UIViewController {

    let imageView1 = UIImageView()
    let imageView2 = UIImageView()

    override func viewDidLoad() {
        super.viewDidLoad()

        imageView1.image = UIImage(named: "image")
        imageView1.contentMode = .scaleAspectFit
        imageView1.isUserInteractionEnabled = true
        let dragInteraction = UIDragInteraction(delegate: self)
        dragInteraction.isEnabled = true
        imageView1.addInteraction(dragInteraction)

        imageView2.contentMode = .scaleAspectFit
        imageView2.isUserInteractionEnabled = true
        let configuration = UIPasteConfiguration(forAccepting: UIImage.self)
        imageView2.pasteConfiguration = configuration

        let stackView = UIStackView(arrangedSubviews: [imageView1, imageView2])
        view.addSubview(stackView)
        stackView.distribution = .fillEqually
        stackView.frame = view.bounds
        stackView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    }

    override func paste(itemProviders: [NSItemProvider]) {
        _ = itemProviders.first?.loadObject(ofClass: UIImage.self, completionHandler: { (image: NSItemProviderReading?, error: Error?) in
            DispatchQueue.main.async {
                self.imageView2.image = image as? UIImage
            }
        })
    }

}
extension ViewController: UIDragInteractionDelegate {

    func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {
        guard let image = imageView1.image else { return [] }
        let item = UIDragItem(itemProvider: NSItemProvider(object: image))
        return [item]
    }

}
import UIKit

class ViewController: UIViewController {

    let imageView1 = UIImageView()
    let imageView2 = UIImageView()

    override func viewDidLoad() {
        super.viewDidLoad()

        imageView1.image = UIImage(named: "image")
        imageView1.contentMode = .scaleAspectFit
        imageView1.isUserInteractionEnabled = true

        imageView2.contentMode = .scaleAspectFit
        imageView2.isUserInteractionEnabled = true

        let dragInteraction = UIDragInteraction(delegate: self)
        dragInteraction.isEnabled = true
        imageView1.addInteraction(dragInteraction)

        let dropInteraction = UIDropInteraction(delegate: self)
        imageView2.addInteraction(dropInteraction)

        let stackView = UIStackView(arrangedSubviews: [imageView1, imageView2])
        view.addSubview(stackView)
        stackView.distribution = .fillEqually
        stackView.frame = view.bounds
        stackView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    }

}
extension ViewController: UIDragInteractionDelegate {

    func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {
        guard let image = imageView1.image else { return [] }
        let item = UIDragItem(itemProvider: NSItemProvider(object: image))
        item.localObject = image
        return [item]
    }

}
extension ViewController: UIDropInteractionDelegate {

    func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool {
        return session.canLoadObjects(ofClass: UIImage.self) && session.items.count == 1
    }

    func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
        let dropLocation = session.location(in: view)
        let operation: UIDropOperation
        if imageView2.frame.contains(dropLocation) {
            operation = session.localDragSession == nil ? .copy : .move
        } else {
            operation = .cancel
        }

        return UIDropProposal(operation: operation)
    }

    func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
        session.loadObjects(ofClass: UIImage.self) { imageItems in
            guard let images = imageItems as? [UIImage] else { return }
            self.imageView2.image = images.first
        }
    }

}