在UIScrollView中使用UIImage

时间:2015-06-01 09:58:18

标签: swift cgcontext

问题

这听起来很疯狂。我正在制作一个绘图应用程序,我希望用户能够绘制比屏幕更大或更小的图像。因此,当用户从他的照片库中选择图像时,它将被放入滚动视图中的图像视图中。用户绘制与所选图像尺寸相同的图像视图,并在另一个上方的另一个滚动视图中绘制。两个滚动视图的滚动是同步的,因此当您绘制时滚动图形显示在图像上方(在正确的位置)。然而,出于某种原因,当用户选择长图像时(例如400 x 2000),图形在图像的顶部工作,但是当您向下滚动以绘制时,您绘制的线条将显示在顶部。我无法弄清楚出了什么问题...我的代码在下面。

关于守则

cameraStill是包含图片的图片视图

drawable是图片的高度

myScroll是图片的滚动视图

mainImageViewtempImageViewundo1undo2undo3是绘图图层

drawScroll是绘图图层的滚动视图

图片选择

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
        self.dismissViewControllerAnimated(true, completion: { () -> Void in

        })

        if (image != nil) {
self.cameraStill.contentMode = UIViewContentMode.ScaleAspectFit
            cameraStill.frame = CGRectMake(0, 0, screenWidth, screenWidth*(image.size.height/image.size.width))

            // change uiimageivews size

            mainImageView.frame = CGRectMake(0, 0, screenWidth, screenWidth*(image.size.height/image.size.width))
            tempImageView.frame = CGRectMake(0, 0, screenWidth, screenWidth*(image.size.height/image.size.width))
            undo1.frame = CGRectMake(0, 0, screenWidth, screenWidth*(image.size.height/image.size.width))
            undo2.frame = CGRectMake(0, 0, screenWidth, screenWidth*(image.size.height/image.size.width))
            undo3.frame = CGRectMake(0, 0, screenWidth, screenWidth*(image.size.height/image.size.width))

            drawable = screenWidth*(image.size.height/image.size.width)

            myScroll.contentSize = CGSize(width: screenWidth,height: screenWidth*(image.size.height/image.size.width))
            drawScroll.contentSize = CGSize(width: screenWidth,height: screenWidth*(image.size.height/image.size.width))

            if (screenWidth*(image.size.height/image.size.width) > (screenHeight-130)) {
                myScroll.scrollEnabled = true
                drawScroll.scrollEnabled = true
            }
            else {
                myScroll.scrollEnabled = false
                drawScroll.scrollEnabled = false
                cameraStill.center = CGPoint(x: screenWidth/2, y: (screenHeight-130)/2)
                mainImageView.center = CGPoint(x: screenWidth/2, y: (screenHeight-130)/2)
                tempImageView.center = CGPoint(x: screenWidth/2, y: (screenHeight-130)/2)
                undo1.center = CGPoint(x: screenWidth/2, y: (screenHeight-130)/2)
                undo2.center = CGPoint(x: screenWidth/2, y: (screenHeight-130)/2)
                undo3.center = CGPoint(x: screenWidth/2, y: (screenHeight-130)/2)
            }


            self.camera!.stopCamera()
        }


        //drawView.alpha = 1.0

    }

图纸

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        println("began")

        if (drawingEnabled == true) {
            c1 = 3
            closeAllExtras()
            swiped = false
            if let touch = touches.first as? UITouch {
                lastPoint = touch.locationInView(self.view)
            }
        }


    }



    func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) {

        //if (fromPoint.y > 50 && fromPoint.y < screenHeight-80 && toPoint.y > 50 && toPoint.y < screenHeight-80) {
            // 1
            UIGraphicsBeginImageContext(CGSize(width: view.frame.size.width,height: drawable))
            let context = UIGraphicsGetCurrentContext()
            tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: drawable))

            // 2
            CGContextMoveToPoint(context, fromPoint.x, fromPoint.y)
            CGContextAddLineToPoint(context, toPoint.x, toPoint.y)

            // 3
            CGContextSetLineCap(context, kCGLineCapRound)
            CGContextSetLineWidth(context, brushWidth)
            CGContextSetRGBStrokeColor(context, red, green, blue, 1.0)
            CGContextSetBlendMode(context, kCGBlendModeNormal)

            // 4
            CGContextStrokePath(context)

            // 5
            tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
            tempImageView.alpha = opacity
            UIGraphicsEndImageContext()
        //}



    }

    override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
        // 6

        if (drawingEnabled == true) {
            swiped = true
            if let touch = touches.first as? UITouch {
                let currentPoint = touch.locationInView(view)
                drawLineFrom(lastPoint, toPoint: currentPoint)

                // 7
                lastPoint = currentPoint
            }
        }

    }

    func mergeViewContext(v1 : UIImageView, v2: UIImageView) {
        UIGraphicsBeginImageContext(v1.frame.size)
        v1.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: drawable), blendMode: kCGBlendModeNormal, alpha: 1.0)
        v2.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: drawable), blendMode: kCGBlendModeNormal, alpha: 1.0)
        v1.image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        v2.image = nil
    }

    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {

        if (drawingEnabled == true) {
            if !swiped {
                // draw a single point
                drawLineFrom(lastPoint, toPoint: lastPoint)
            }
            mergeViewContext(mainImageView, v2: undo1)

            undo1.image = undo2.image
            undo2.image = nil
            undo2.image = undo3.image
            undo3.image = nil


            UIGraphicsBeginImageContext(undo3.frame.size)
            undo3.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: drawable), blendMode: kCGBlendModeNormal, alpha: 1.0)
            tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: drawable), blendMode: kCGBlendModeNormal, alpha: opacity)
            undo3.image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            tempImageView.image = nil
        }

同步两个滚动视图

func scrollViewDidScroll(scrollView: UIScrollView) {
        if (scrollView == drawScroll) {
            var offset = scrollView.contentOffset
            myScroll.setContentOffset(offset, animated: false)
        }
    }

1 个答案:

答案 0 :(得分:1)

我通过使用滚动视图的偏移量更正以下值来实现它。但是,我得到了一些模糊的长图像和一个非常奇怪的错误与短的图像。不知道出了什么问题。

CGContextMoveToPoint(context, fromPoint.x, fromPoint.y)
CGContextAddLineToPoint(context, toPoint.x, toPoint.y)