Как ограничить область рисования коробкой? - PullRequest
2 голосов
/ 13 июля 2011

Я использовал код рисования из этого урока, чтобы кто-то рисовал в маленьком окошке: http://www.ifans.com/forums/showthread.php?t=132024

Код по умолчанию рисует на весь экран, как ограничить рисование маленьким окошком наэкран?

1 Ответ

3 голосов
/ 14 июля 2011

В этих примерах касания и рисование происходят в главном виде контроллера вида:

UIGraphicsBeginImageContext(self.view.frame.size);
[drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

и т.д ...

Таким образом, если вы измените рамку этого вида на меньший размер, чертеж должен автоматически ограничиться меньшим размером.

Или вы можете «переместить» распознавание касания и рисунок в другое меньшее подпредставление:

  1. Создать новое меньшее подпредставление.
  2. Добавьте его на главный экран.
  3. Добавить UITapGestureRecognizer в маленькое представление
  4. Обработайте касания в действии UITapGestureRecognizer и выполните рисование в подпредставлении.

===== РЕДАКТИРОВАТЬ =====

Вот как это сделать:

- (void)viewDidLoad{
   [super viewDidLoad];
   self.view.backgroundColor = [UIColor grayColor];

   canvas = [[UIView alloc] initWithFrame:CGRectMake(200.0, 200.0, 300.0, 300.0)];
   canvas.backgroundColor = [UIColor whiteColor];
   [self.view addSubview:canvas];

   UIImageView *iv = [[UIImageView alloc] initWithImage:nil];
   iv.frame = canvas.frame;
   [self.view addSubview:iv];
   self.drawImage = iv;
   [iv release];

   UIPanGestureRecognizer *panRec = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(userPanned:)];
   [canvas addGestureRecognizer:panRec];    
   [panRec release];
}


- (void)userPanned:(UIPanGestureRecognizer *)recognizer {
   CGPoint touchPoint = [recognizer locationInView:canvas];

   if (recognizer.state == UIGestureRecognizerStateBegan) lastTouchPoint = touchPoint;

      if (CGRectContainsPoint(CGRectMake(0.0, 0.0, canvas.frame.size.width, canvas.frame.size.height), touchPoint)) {
         UIGraphicsBeginImageContext(canvas.frame.size);
         [drawImage.image drawInRect:CGRectMake(0.0, 0.0, canvas.frame.size.width, canvas.frame.size.height)];
         CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
         CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
         CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
         CGContextBeginPath(UIGraphicsGetCurrentContext());
         CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastTouchPoint.x, lastTouchPoint.y);
         CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), touchPoint.x, touchPoint.y);
         CGContextStrokePath(UIGraphicsGetCurrentContext());
         drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
         UIGraphicsEndImageContext();

         lastTouchPoint = touchPoint;
     }
}

canvas, lastTouchPoint и drawImage - это iVars.

Я не реализовал процедуры doubleTap и Tap, чтобы очистить изображение и нарисовать точку, но этого должно быть достаточно, чтобы начать работу.

...