2015-06-01 46 views
0

借鑑的UIImage的問題在UIScrollView中

這是要聽起來很瘋狂。我正在製作繪圖應用程序,我希望用戶能夠繪製比屏幕更大或更小的圖像。因此,當用戶從他的照片庫中選擇一個圖像時,它將被放入一個滾動視圖的圖像視圖中。用戶繪製與所選圖像尺寸相同的圖像視圖,並在另一個滾動視圖上繪製另一個圖像視圖。兩個滾動視圖的滾動是同步的,因此當您繪製時,滾動繪圖似乎在圖像上方(在正確的位置)。然而,由於某些原因,當用戶選擇一個長圖像(比如說400 x 2000)時,繪圖工作在圖像的頂部,但是當您向下滾動繪製時,繪製的線條會到達頂部。我無法弄清楚發生了什麼問題......我的代碼在下面。

關於代碼

cameraStill是包含圖像

drawable圖像視圖圖像

myScroll的高度被用於圖像

mainImageView滾動視圖, tempImageView,undo1,undo2,undo3是繪圖層

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 
     } 

Synching兩個渦旋視圖

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

回答

1

我得到它通過修正與滾動視圖的偏移下列值工作。但是,我對長圖像和短圖像有一個非常奇怪的錯誤有些模糊。不知道什麼是錯的。

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