2013-08-14 5 views
7

Я хочу отобразить линию сетки, подобную той, которая появляется, когда камера открыта. Я использую AVCaptureManager. Должен ли я использовать основную графику для рисования линий сетки? эти линии сетки?Как рисовать линии сетки, когда камера открыта avcapturemanager

благодаря

ответ

23

Вы можете добавить пользовательский вид в виде наложения поверх своего вида камеры, чтобы нарисовать сетку с помощью QuartzCore.

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

enter image description here

код я использую, чтобы сделать это (примечание: моя решетка регулируется, так что это может быть 10х10, 2х2 и т.д.):

// ------------------------------------------------------------------------------- 
// Used for drawing the grids ontop of the view port 
// ------------------------------------------------------------------------------- 
- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, 0.5); 
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); 

    // --------------------------- 
    // Drawing column lines 
    // --------------------------- 

    // calculate column width 
    CGFloat columnWidth = self.frame.size.width/(self.numberOfColumns + 1.0); 

    for(int i = 1; i <= self.numberOfColumns; i++) 
    { 
     CGPoint startPoint; 
     CGPoint endPoint; 

     startPoint.x = columnWidth * i; 
     startPoint.y = 0.0f; 

     endPoint.x = startPoint.x; 
     endPoint.y = self.frame.size.height; 

     CGContextMoveToPoint(context, startPoint.x, startPoint.y); 
     CGContextAddLineToPoint(context, endPoint.x, endPoint.y); 
     CGContextStrokePath(context); 
    } 

    // --------------------------- 
    // Drawing row lines 
    // --------------------------- 

    // calclulate row height 
    CGFloat rowHeight = self.frame.size.height/(self.numberOfRows + 1.0); 

    for(int j = 1; j <= self.numberOfRows; j++) 
    { 
     CGPoint startPoint; 
     CGPoint endPoint; 

     startPoint.x = 0.0f; 
     startPoint.y = rowHeight * j; 

     endPoint.x = self.frame.size.width; 
     endPoint.y = startPoint.y; 

     CGContextMoveToPoint(context, startPoint.x, startPoint.y); 
     CGContextAddLineToPoint(context, endPoint.x, endPoint.y); 
     CGContextStrokePath(context); 
    } 
} 

В моем классе GridView, я определил 2 свойства numberOfRows и numberOfColumns:

#import <UIKit/UIKit.h> 

@interface GridView : UIView 

@property (nonatomic, assign) int numberOfColumns; 
@property (nonatomic, assign) int numberOfRows; 

@end 

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

+0

Потрясающие спасибо, вот что я искал – sin

+0

Как бы я добавить, что оверлей? Если я подклассифицирую UIView в класс GridView, а затем попробую это, drawRect никогда не будет вызван. GridView * gridView = [[GridView alloc] init]; gridView.numberOfColumns = 10; gridView.numberOfRows = 10; [камераUI комплектCameraOverlayView: gridView]; –

+0

Вам необходимо вызвать [gridView setNeedsDisplay]; каждый раз, когда вы меняете числоOfRows или numberOfCols. Это вызовет метод drawRect: метод gridView. – Zhang

1

Создать UIImageView использовать для cameraOverlayView.

Используйте UIImagePickerController и изображение как ваши «линии сетки». При создании файла изображения линии сетки обязательно используйте прозрачный фон - не непрозрачный белый.

UIImageView *overlayImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"overlay.png"]]; 

CGRect overlayRect = CGRectMake(0, 0, overlayImage.image.size.width, overlayImage.image.size.height); 

[overlayImage setFrame:overlayRect]; 

[yourImagePickerController setCameraOverlayView:overlayImage]; 
+0

Я не использую ImagePickerViewController – sin

+0

Затем вы можете сделать это с помощью CoreGraphics ИЛИ QuartzCore как .. в соответствии с вашими требованиями .. –