C4 захватить пример изображения с камеры

Hei,

только начинаю садиться в С4 и пока мой опыт был отличным. Я копирую сделанный снимок с примером камеры в данный момент и по какой-то причине, когда я делаю все как описано в руководстве ( http://www.c4ios.com/tutorials/takingSnapshots), я получаю следующую ошибку: "Нет видимого @interface для" TakePhoto "объявляет селектор listenFor:from Object:'" (Take Photo - это файл, в котором я работаю) Я думаю, что я должен объявить "imageWasCaptured" в определении класса, но я не знаете что? Какие-либо предложения?

обновлено: вот код https://github.com/susemiessner/Urban-Alphabets/tree/master/urbanAlphabets или просто скопированныйTakePhoto.h

#import "C4CanvasController.h"

@interface TakePhoto : C4CanvasController

@end

TakePhoto.m

    #import "TakePhoto.h"
    #define NavBarHeight 42
    #define TopBarFromTop 20

    @interface TakePhoto ()

    @end

    @implementation TakePhoto {
        //common variables
        UIColor *navBarColor;
        UIColor *buttonColor;
        UIColor *typeColor;

        //top toolbar
        C4Shape *topNavBar;
        C4Font *fatFont;
        C4Label *takePhoto;



        //camera
        C4Camera *cam;

        //bottom Toolbar
        C4Shape *bottomNavBar;
        C4Button *takePhotoButton;
    }
    -(void) setup{
        navBarColor=[UIColor colorWithRed:0.96875 green:0.96875 blue:0.96875 alpha:1];
        buttonColor= [UIColor colorWithRed:0.8984275 green:0.8984275 blue:0.8984275 alpha:1];
        typeColor=[UIColor colorWithRed:0.19921875 green:0.19921875 blue:0.19921875 alpha:1];

        [self topBarSetup];
        [self bottomBarSetup];
        [self cameraSetup];

    }
    -(void)topBarSetup{
        topNavBar=[C4Shape rect:CGRectMake(0, TopBarFromTop, self.canvas.width, NavBarHeight)];
        topNavBar.fillColor=navBarColor;
        topNavBar.lineWidth=0;
        [self.canvas addShape:topNavBar];


        fatFont=[C4Font fontWithName:@"HelveticaNeue-Bold" size:17];
        takePhoto = [C4Label labelWithText:@"Take Photo" font:fatFont];
        takePhoto.center=topNavBar.center;
        [self.canvas addLabel:takePhoto];}

    -(void)cameraSetup{
        cam = [C4Camera cameraWithFrame:CGRectMake(0,TopBarFromTop+NavBarHeight, self.canvas.width, self.canvas.height-(2*NavBarHeight+TopBarFromTop))];
        [self.canvas addCamera:cam];
        [cam initCapture];
        //tapping to take image
        [self addGesture:TAP name:@"capture" action:@"capturedImage"];
        [self numberOfTouchesRequired:1 forGesture:@"capture"];
//the following line is where I get the error
        [self listenFor:@"imageWasCaptured" fromObject:@"putCapturedImageOnCanvas"];
    }
    -(void) bottomBarSetup{
        bottomNavBar=[C4Shape rect:CGRectMake(0, self.canvas.height-(NavBarHeight), self.canvas.width, NavBarHeight)];
        bottomNavBar.fillColor= navBarColor;
        bottomNavBar.lineWidth=0;
        [self.canvas addShape:bottomNavBar];

        takePhotoButton=[UIButton buttonWithType: ROUNDEDRECT];
        [takePhotoButton setTitle:@"TakePhoto" forState:UIControlStateNormal];
        takePhotoButton.frame=CGRectMake(self.canvas.width/2-50, self.canvas.height-(NavBarHeight), 100, NavBarHeight);
        takePhotoButton.backgroundColor=buttonColor;
        takePhotoButton.tintColor=typeColor;
        [self.canvas addSubview:takePhotoButton];

    }

    -(void) takingPhoto{
        [cam captureImage];
    }
    -(void) captureImage{
        [cam captureImage];
    }
    -(void)putCapturedImageOnCanvas{
        C4Image *img = cam.capturedImage;
        img.width=240;
        img.center=CGPointMake(self.canvas.width*2/3, self.canvas.center.y);

    }


    @end

1 ответ

Решение

Чтобы ваша концепция работала, в вашем подходе есть пара дыр, которые не позволят вам увидеть, что на самом деле что-то происходит. Ваш вопрос, безусловно, один из них.

Чтобы ответить на ваш вопрос:

listenFor:fromObject: не признается, потому что на самом деле его не существует.

Намерение listenFor Методы таковы, что ваше приложение или конкретный объект могут реагировать на уведомления или действия, происходящие где-то еще в приложении. Итак, что вы хотите сделать, это запустить метод, когда что-то происходит.

Ваш метод должен быть:

[self listenFor:@"imageWasCaptured" fromObject:cam andRunMethod:@"methodName"];

Вы хотите слушать, когда камера закончила снимать, а затем сделать что-то с этим...


Другие вещи, которые я заметил...

Если вы хотите использовать C4Buttonтогда следующее:

takePhotoButton=[UIButton buttonWithType: ROUNDEDRECT];
[takePhotoButton setTitle:@"TakePhoto" forState:UIControlStateNormal];

Должно быть:

takePhotoButton = [C4Button buttonWithType:ROUNDEDRECT];
[takePhotoButton setTitle:@"TakePhoto" forState:NORMAL];

Кроме того, вы подкласс C4CanvasController, Чтобы получить ваш TakePhoto Вид объекта на основной холст нужно правильно создать.

Чтобы сделать это на главном холсте, я написал следующее в моей рабочей области:

#import "C4Workspace.h"
#import "TakePhoto.h"

@implementation C4WorkSpace {
    TakePhoto *tp;
}

-(void)setup {
    tp = [TakePhoto new];
    tp.canvas.frame = CGRectMake(30,
                                 30,
                                 self.canvas.width - 60,
                                 self.canvas.height - 60);
    tp.canvas.shadowOffset = CGSizeMake(10,10);
    tp.canvas.shadowOpacity = 1.0f;
    tp.canvas.userInteractionEnabled = YES;
    [tp setup];
    tp.mainCanvas = self.canvas;
    [self.canvas addSubview:tp.canvas];
}
@end

И, наконец, чтобы вывести изображение с вашей камеры на основной холст, мне пришлось немного скомбинировать. Я создал собственность в TakePhoto это позволяет мне установить основной холст в вашем новом контроллере. Вы заметите в коде над строкой, которая заявляет tp.mainCanvas = self.canvas...

TakePhoto заголовок теперь выглядит так:

#import "C4CanvasController.h"

@interface TakePhoto : C4CanvasController
@property (readwrite, strong) C4Window *mainCanvas;
@end

И putImageOnCanvas Теперь метод выглядит так:

-(void)putCapturedImageOnCanvas{
    C4Image *img = cam.capturedImage;
    img.width=240;
//    img.center=CGPointMake(self.canvas.width*2/3, self.canvas.center.y);
    img.center = CGPointMake([C4Math randomInt:self.mainCanvas.width], [C4Math randomInt:self.mainCanvas.height]);
    [self.mainCanvas addImage:img];
    [self.mainCanvas bringSubviewToFront:self.canvas];
}

Последние две строки поместите изображение на холст, а затем убедитесь, что TakePhoto холст (то есть тот, что с камерой) выводится на передний план, чтобы вновь добавленное изображение не перекрывало его.

Потому что вы используете подкласс C4CanvasController структура вашего приложения выглядит следующим образом:

C4WorkSpace.canvas > TakePhoto.canvas > Camera

Другие вопросы по тегам