Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 缩放后如何找到UIImageView的新中心?_Ios_Swift_Core Data_Imageview - Fatal编程技术网

Ios 缩放后如何找到UIImageView的新中心?

Ios 缩放后如何找到UIImageView的新中心?,ios,swift,core-data,imageview,Ios,Swift,Core Data,Imageview,我正在创建一个应用程序,用户可以将图像添加到“画布”,并使用捏和平移手势识别器调整图像大小和移动图像。图像视图是我使用本文创建的自定义视图: 这真的很好用。图像的大小和移动非常平滑。我可以在平移和挤压动作后捕捉图像的中心和大小。问题是,在我保存图像的大小和坐标后,当我将其加载回“画布”时,它不尊重这些。这就好像中心偏移了“X”个像素 以下是我制作可调整大小和可移动图像视图的代码: ''' import UIKit import Foundation class MovableImage: U

我正在创建一个应用程序,用户可以将图像添加到“画布”,并使用捏和平移手势识别器调整图像大小和移动图像。图像视图是我使用本文创建的自定义视图:

这真的很好用。图像的大小和移动非常平滑。我可以在平移和挤压动作后捕捉图像的中心和大小。问题是,在我保存图像的大小和坐标后,当我将其加载回“画布”时,它不尊重这些。这就好像中心偏移了“X”个像素

以下是我制作可调整大小和可移动图像视图的代码:

'''

import UIKit
import Foundation

class MovableImage: UIImageView {
    let size: CGFloat = 150.0
    var imageMovedHandler:((_ x: CGFloat, _ y: CGFloat) -> ())?
    var imageDeletedHandler:((_ delete: Bool) -> ())?
    var longPressHandler:((_ selected: Bool) -> ())?
    var imageSizeChangedHandler:((_ newImageView: MovableImage) -> ())?
    let deleteButton = UIButton(type: .close)

    init(origin: CGPoint) {
        super.init(frame: CGRect(x: origin.x, y: origin.y, width: size, height: size)) //

        debugCenterDot()
        initGestureRecognizers()
    }

//added a dot to try and understand what is happening with the "center" of the imageview, but it didn't show in the center of the imageview
    func debugCenterDot() {
        let dot = UIBezierPath(ovalIn: CGRect(x: self.center.x, y: self.center.y, width: 15, height: 15))
        let dotLayer = CAShapeLayer()
        dotLayer.path = dot.cgPath
        dotLayer.strokeColor = UIColor.yellow.cgColor

        self.layer.addSublayer(dotLayer)
        self.setNeedsDisplay()
    }

    internal func addButton() {
        deleteButton.tintColor = UIColor.red
        deleteButton.backgroundColor = UIColor.white
        deleteButton.addTarget(self, action: #selector(deleteSelf(sender:)), for: .touchUpInside)
        deleteButton.frame = .zero //CGRect(x: 8, y: 8, width: 15, height: 15)
        deleteButton.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(deleteButton)
        NSLayoutConstraint.activate([
            deleteButton.widthAnchor.constraint(equalToConstant: 15),
            deleteButton.widthAnchor.constraint(equalTo: deleteButton.heightAnchor),
            deleteButton.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor, constant: 8),
            deleteButton.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 8),
        ])


    }

    @objc func deleteSelf(sender: UIButton) {
        imageDeletedHandler?(true)
        self.removeFromSuperview()
    }

    func initGestureRecognizers() {
        let panGR = UIPanGestureRecognizer(target: self, action: #selector(didPan(panGR:)))
        addGestureRecognizer(panGR)

        let pinchGR = UIPinchGestureRecognizer(target: self, action: #selector(didPinch(pinchGR:)))
        addGestureRecognizer(pinchGR)

        let longPressGR = UILongPressGestureRecognizer(target: self, action: #selector(didLongPress(longPressGR:)))
        longPressGR.minimumPressDuration = 1
        addGestureRecognizer(longPressGR)

    }

    @objc func didLongPress(longPressGR: UILongPressGestureRecognizer) {
        self.superview!.bringSubviewToFront(self)
        self.layer.borderWidth = 2
        self.layer.borderColor = UIColor.red.cgColor

        addButton()
        longPressHandler?(true)
    }

    @objc func didPan(panGR: UIPanGestureRecognizer) {
        self.superview!.bringSubviewToFront(self)

        if self.layer.borderWidth == 2 {
            let translation = panGR.translation(in: self)

            print("BEFORE PAN: \(self.center)")

            self.center.x += translation.x
            self.center.y += translation.y

            print("AFTER PAN: \(self.center)")

            panGR.setTranslation(CGPoint.zero, in: self)
            if panGR.state == .ended {
                imageMovedHandler?(self.center.x, self.center.y)
                self.layer.borderWidth = 0
                self.layer.borderColor = nil
                self.deleteButton.removeFromSuperview()
            }
        }
    }

    @objc func didPinch(pinchGR: UIPinchGestureRecognizer) {
        self.superview?.bringSubviewToFront(self)

        if self.layer.borderWidth == 2 {
            let scale = pinchGR.scale

            self.transform = CGAffineTransform(scaleX: scale, y: scale)

            if pinchGR.state == .ended {
                imageSizeChangedHandler?(self)
            }
        }
    }

    func scaleOf(transform: CGAffineTransform) -> CGPoint {
        let xscale = sqrt(transform.a * transform.a + transform.c * transform.c)
        let yscale = sqrt(transform.b * transform.b + transform.d * transform.d)

        return CGPoint(x: xscale, y: yscale)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
'''

import UIKit
import Foundation

class MovableImage: UIImageView {
    let size: CGFloat = 150.0
    var imageMovedHandler:((_ x: CGFloat, _ y: CGFloat) -> ())?
    var imageDeletedHandler:((_ delete: Bool) -> ())?
    var longPressHandler:((_ selected: Bool) -> ())?
    var imageSizeChangedHandler:((_ newImageView: MovableImage) -> ())?
    let deleteButton = UIButton(type: .close)

    init(origin: CGPoint) {
        super.init(frame: CGRect(x: origin.x, y: origin.y, width: size, height: size)) //

        debugCenterDot()
        initGestureRecognizers()
    }

//added a dot to try and understand what is happening with the "center" of the imageview, but it didn't show in the center of the imageview
    func debugCenterDot() {
        let dot = UIBezierPath(ovalIn: CGRect(x: self.center.x, y: self.center.y, width: 15, height: 15))
        let dotLayer = CAShapeLayer()
        dotLayer.path = dot.cgPath
        dotLayer.strokeColor = UIColor.yellow.cgColor

        self.layer.addSublayer(dotLayer)
        self.setNeedsDisplay()
    }

    internal func addButton() {
        deleteButton.tintColor = UIColor.red
        deleteButton.backgroundColor = UIColor.white
        deleteButton.addTarget(self, action: #selector(deleteSelf(sender:)), for: .touchUpInside)
        deleteButton.frame = .zero //CGRect(x: 8, y: 8, width: 15, height: 15)
        deleteButton.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(deleteButton)
        NSLayoutConstraint.activate([
            deleteButton.widthAnchor.constraint(equalToConstant: 15),
            deleteButton.widthAnchor.constraint(equalTo: deleteButton.heightAnchor),
            deleteButton.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor, constant: 8),
            deleteButton.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 8),
        ])


    }

    @objc func deleteSelf(sender: UIButton) {
        imageDeletedHandler?(true)
        self.removeFromSuperview()
    }

    func initGestureRecognizers() {
        let panGR = UIPanGestureRecognizer(target: self, action: #selector(didPan(panGR:)))
        addGestureRecognizer(panGR)

        let pinchGR = UIPinchGestureRecognizer(target: self, action: #selector(didPinch(pinchGR:)))
        addGestureRecognizer(pinchGR)

        let longPressGR = UILongPressGestureRecognizer(target: self, action: #selector(didLongPress(longPressGR:)))
        longPressGR.minimumPressDuration = 1
        addGestureRecognizer(longPressGR)

    }

    @objc func didLongPress(longPressGR: UILongPressGestureRecognizer) {
        self.superview!.bringSubviewToFront(self)
        self.layer.borderWidth = 2
        self.layer.borderColor = UIColor.red.cgColor

        addButton()
        longPressHandler?(true)
    }

    @objc func didPan(panGR: UIPanGestureRecognizer) {
        self.superview!.bringSubviewToFront(self)

        if self.layer.borderWidth == 2 {
            let translation = panGR.translation(in: self)

            print("BEFORE PAN: \(self.center)")

            self.center.x += translation.x
            self.center.y += translation.y

            print("AFTER PAN: \(self.center)")

            panGR.setTranslation(CGPoint.zero, in: self)
            if panGR.state == .ended {
                imageMovedHandler?(self.center.x, self.center.y)
                self.layer.borderWidth = 0
                self.layer.borderColor = nil
                self.deleteButton.removeFromSuperview()
            }
        }
    }

    @objc func didPinch(pinchGR: UIPinchGestureRecognizer) {
        self.superview?.bringSubviewToFront(self)

        if self.layer.borderWidth == 2 {
            let scale = pinchGR.scale

            self.transform = CGAffineTransform(scaleX: scale, y: scale)

            if pinchGR.state == .ended {
                imageSizeChangedHandler?(self)
            }
        }
    }

    func scaleOf(transform: CGAffineTransform) -> CGPoint {
        let xscale = sqrt(transform.a * transform.a + transform.c * transform.c)
        let yscale = sqrt(transform.b * transform.b + transform.d * transform.d)

        return CGPoint(x: xscale, y: yscale)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
下面是我如何将其加载回“画布”并将其保存回CoreData(将函数保存在加载函数底部附近的闭包中):

'''

'''

闭包“imageMovedHandler”和“imageSizeChangedHandler”用于检测何时完成移动和调整大小,我将图像保存到CoreData。这是:

'''

'''

以下是我在画布上移动图像时发生的情况: 第一幅图像显示了我停止将图像移动到的位置:

此图显示保存大小和坐标后图像的加载位置:

预期的结果是:

  • 挤压、平移和保存图像并加载时,图像在画布中保留其当前坐标和大小
编辑:
还应注意,移动图像时图像的偏移仅发生在移动之后“缩放

我要做的是调试。查看保存的值是否正确。如果是,请查看要恢复的值是否与这些值相同。它们是。我已经检查过好几次了。我想知道我的一些限制是否是错误的?我将更仔细地观察它们,因为当把图像视图移回来时,它似乎是偏移的。好吧,你提供的代码太多了,我甚至无法分辨什么是相关的,什么是不相关的。我根本找不到保存代码。@matt我只是编辑了这篇文章,以便更容易地看到代码在做什么以及保存函数在哪里。它们位于“loadImages”函数底部的两个闭包中。这两个闭包检测平移和挤压,以更新DB中的图像位置和大小。
if movableImage != nil {                        


movableImage?.imageMovedHandler = { [unowned self] (x, y) in
                    if self.isYear {
                        if self.scrollView.mainView.newImages.count > 0 {
                            for (idx, i) in self.scrollView.mainView.newImages.enumerated() {
                                if i.layer.borderWidth == 2 {
                                    let id = idx + 1
                                    _ = LoadPagePhotos().updateYearPhoto(journalName: self.journalName, yearPosition: self.yearPosition, pageImageId: id, imageHeight: Float(i.frame.size.height), imageWidth: Float(i.frame.size.width), imageX: Float(i.center.x), imageY: Float(i.center.y), pagePhoto: i.image!, photoPath: nil)
                                }
                            }
                        }
                    } else {
                        if self.scrollView.mainView.newImages.count > 0 {
                            for (idx, i) in self.scrollView.mainView.newImages.enumerated() {
                                if i.layer.borderWidth == 2 {
                                    let id = idx + 1
                                    _ = LoadPagePhotos().updatePhoto(journalName: self.journalName, monthName: self.monthName, weekPosition: self.positionWeek, pageImageId: id, imageHeight: Float(i.frame.size.height), imageWidth: Float(i.frame.size.width), imageX: Float(i.center.x), imageY: Float(i.center.y), pagePhoto: i.image!, photoPath: nil)
                                }
                            }
                        }
                    }
                    self.loadImages(new: false, enableInteraction: true)
                }

    movableImage?.imageSizeChangedHandler = { [unowned self] (newImageView) in
                                var id = 0
                                var img = 0
                                if self.isYear {
                                    if self.scrollView.mainView.newImages.count > 0 {

                                    for (idx, i) in self.scrollView.mainView.newImages.enumerated() {
                                        if i.layer.borderWidth == 2 {
                                            id = idx + 1
                                            img = idx
                                        }
                                    }
                                    self.scrollView.mainView.newImages[img] = newImageView                                
                                    _ = LoadPagePhotos().updateYearPhoto(journalName: self.journalName, yearPosition: self.yearPosition, pageImageId: id, imageHeight: Float(newImageView.frame.size.height), imageWidth: Float(newImageView.frame.size.width), imageX: Float(newImageView.center.x), imageY: Float(newImageView.center.y), pagePhoto: newImageView.image!, photoPath: nil)
                                }
                            } else {
                                if self.scrollView.mainView.newImages.count > 0 {
                                    for (idx, i) in self.scrollView.mainView.newImages.enumerated() {
                                        if i.layer.borderWidth == 2 {
                                            id = idx + 1
                                            img = idx
                                        }
                                    }
                                    self.scrollView.mainView.newImages[img] = newImageView
                                    _ = LoadPagePhotos().updatePhoto(journalName: self.journalName, monthName: self.monthName, weekPosition: self.positionWeek, pageImageId: id, imageHeight: Float(newImageView.frame.size.height), imageWidth: Float(newImageView.frame.size.width), imageX: Float(newImageView.center.x), imageY: Float(newImageView.center.y), pagePhoto: newImageView.image!, photoPath: nil)
                                }
                            }
                            self.loadImages(new: false, enableInteraction: true)
                        }
                    }
                }