2015-06-01 2 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 Оба Scroll Просмотров

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)