2013-10-28 41 views
1

我正在研究一个包含多个子视图的应用程序。C4摄像头捕捉 - 回到视图时的问题

目前我有4个子视图。 这将C4Workspace代码设置它们

//TakePhoto 
    takePhoto= [TakePhoto new]; 
    takePhoto.canvas.frame=CGRectMake(0, 0, self.canvas.width, self.canvas.height); 
    takePhoto.canvas.userInteractionEnabled = YES; 
    [takePhoto transferVariables:1 topBarFromTop:TopBarFromTopDefault topBarHeight:TopNavBarHeightDefault bottomBarHeight:BottomBarHeightDefault navBarColor:navBarColorDefault navigationColor:navigationColorDefault typeColor:typeColorDefault fatFont:fatFontDefault normalFont:normalFontDefault iconTakePhoto:iconTakePhoto iconClose:iconClose iconBack:iconBack]; 
    [takePhoto setup]; 
    [takePhoto cameraSetup]; 
    [self.canvas addSubview:takePhoto.canvas]; 

    //CropPhoto 
    cropPhoto=[CropPhoto new]; 
    cropPhoto.canvas.frame=CGRectMake(0, 0, self.canvas.width, self.canvas.height); 
    cropPhoto.canvas.userInteractionEnabled=YES; 
    [cropPhoto transferVariables:1 topBarFroTop:TopBarFromTopDefault topBarHeight:TopNavBarHeightDefault bottomBarHeight:BottomBarHeightDefault navBarColor:navBarColorDefault navigationColor:navigationColorDefault typeColor:typeColorDefault overlayColor:overlayColorDefault fatFont:fatFontDefault normalFont:normalFontDefault iconClose:iconClose iconBack:iconBack iconOk:iconOk]; 
    [self.canvas addSubview:cropPhoto.canvas]; 
    cropPhoto.canvas.hidden= YES; 

    //AssignPhoto 
    assignLetter=[AssignLetter new]; 
    assignLetter.canvas.frame=CGRectMake(0, 0, self.canvas.width, self.canvas.height); 
    assignLetter.canvas.userInteractionEnabled=YES; 
    [assignLetter transferVariables:1 topBarFroTop:TopBarFromTopDefault topBarHeight:TopNavBarHeightDefault bottomBarHeight:BottomBarHeightDefault navBarColor:navBarColorDefault navigationColor:navigationColorDefault typeColor:typeColorDefault highlightColor:highlightColorDefault fatFont:fatFontDefault normalFont:normalFontDefault iconClose:iconClose iconBack:iconBack iconOk:iconOk iconSettings:iconSettings]; 

    [self.canvas addSubview:assignLetter.canvas ]; 
    assignLetter.canvas.hidden=YES; 

    //AlphabetView 
    alphabetView=[AlphabetView new]; 
    alphabetView.canvas.frame= CGRectMake(0, 0, self.canvas.width, self.canvas.height); 
    alphabetView.canvas.userInteractionEnabled=YES; 
    [alphabetView transferVaribles:1 topBarFromTop:TopBarFromTopDefault topBarHeight:TopNavBarHeightDefault bottomBarHeight:BottomBarHeightDefault navBarColor:navBarColorDefault navigationColor:navigationColorDefault typeColor:typeColorDefault darkenColor:darkenColorDefault fatFont:fatFontDefault normalFont:normalFontDefault iconClose:iconClose iconBack:iconBack iconMenu:iconMenu iconTakePhoto:iconTakePhoto iconAlphabetInfo:iconAlphabetInfo iconShareAlphabet:iconShareAlphabet iconWritePostcard:iconWritePostcard iconMyPostcards:iconMyPostcards iconMyAlphabets:iconMyAlphabets]; 
    [self.canvas addSubview:alphabetView.canvas]; 
    alphabetView.canvas.hidden=YES; 

//the methods to listen for from all other canvasses 
    [self listenFor:@"goToTakePhoto" andRunMethod:@"goToTakePhoto"]; 
    [self listenFor:@"goToCropPhoto" andRunMethod:@"goToCropPhoto"]; 
    [self listenFor:@"goToAssignPhoto" andRunMethod:@"goToAssignPhoto"]; 
    [self listenFor:@"goToAlphabetsView" andRunMethod:@"goToAlphabetsView"]; 

该主工作区还具有以下功能的意见

-(void)goToTakePhoto{ 
    [takePhoto resetCounter]; 
    [takePhoto setup]; 

    C4Log(@"TakePhoto"); 
    takePhoto.canvas.hidden=NO; 
    cropPhoto.canvas.hidden=YES; 
    assignLetter.canvas.hidden=YES; 
    alphabetView.canvas.hidden=YES; 
} 
-(void)goToCropPhoto{ 
    C4Log(@"going to CropPhoto"); 
    [cropPhoto displayImage:takePhoto.img]; 
    [cropPhoto setup]; 
    takePhoto.canvas.hidden=YES; 
    cropPhoto.canvas.hidden=NO; 
    assignLetter.canvas.hidden=YES; 
    alphabetView.canvas.hidden=YES; 
} 
-(void)goToAssignPhoto{ 
    C4Log(@"AssignPhoto"); 
    [assignLetter setup]; 
    [assignLetter drawCurrentAlphabet:currentAlphabet]; 
    [assignLetter drawCroppedPhoto:cropPhoto.croppedPhoto]; 
    takePhoto.canvas.hidden=YES; 
    cropPhoto.canvas.hidden=YES; 
    assignLetter.canvas.hidden=NO; 
    alphabetView.canvas.hidden=YES; 
} 
-(void)goToAlphabetsView{ 
    C4Log(@"AlphabetsView"); 
    [alphabetView setup]; 
    [alphabetView drawCurrentAlphabet:assignLetter.currentAlphabet]; 
    takePhoto.canvas.hidden=YES; 
    cropPhoto.canvas.hidden=YES; 
    assignLetter.canvas.hidden=YES; 
    alphabetView.canvas.hidden=NO; 
} 

第一视图被拍摄照片非常相似的教程之间切换(我为摄像机添加了一个重置​​计数器,因为我注意到拍摄照片的按钮在被点击时总是发送两次通知)。

-(void) setup{ 
photoButtonImage=iconTakePhoto; 
    photoButtonImage.height=45; 
    photoButtonImage.width=90; 
    photoButtonImage.center=CGPointMake(self.canvas.width/2, self.canvas.height-bottomBarHeight/2); 
    [self.canvas addImage:photoButtonImage]; 
    //gestures to take the photo 
    [self listenFor:@"touchesBegan" fromObject:photoButtonImage andRunMethod:@"captureImage"]; 
    [self numberOfTouchesRequired:1 forGesture:@"capture"]; 
    [self listenFor:@"imageWasCaptured" fromObject:cam andRunMethod:@"goToCropPhoto"]; 
} 

-(void)cameraSetup{ 
    cam = [C4Camera cameraWithFrame:CGRectMake(0,topBarFromTop+topBarHeight, self.canvas.width, self.canvas.height-(topBarHeight+bottomBarHeight+topBarFromTop))]; 
    cam.cameraPosition = CAMERABACK; 
    [self.canvas addCamera:cam]; 
    [cam initCapture]; 
    counter=0; 
} 
-(void) captureImage{ 
    [cam captureImage]; 
    C4Log(@"capturing image"); 
} 
-(void)resetCounter{ 
    counter=0; 
} 

这工作正常,只要我从C4Label导航回该视图,但不是如果我从图像导航回来。即使我在接触两者时也运行完全相同的功能。 它看起来像这样:

//image as navigation element 
takePhotoButton=iconTakePhoto; 
    takePhotoButton.width=60; 
    takePhotoButton.center=CGPointMake(takePhotoButton.width/2+5, bottomNavBar.center.y); 
    [self.canvas addImage:takePhotoButton]; 
    [self listenFor:@"touchesBegan" fromObject:takePhotoButton andRunMethod:@"goToTakePhoto"]; 

//label as navigation element 
takePhoto=[C4Label labelWithText:@"take Photo" font: normalFont]; 
    takePhoto.center=CGPointMake(self.canvas.width-(takePhoto.width/2+5), topNavBar.center.y); 
    [self.canvas addLabel:takePhoto ]; 
    [self listenFor:@"touchesBegan" fromObject:takePhoto andRunMethod:@"goToTakePhoto"]; 

,最后,这是该视图里面的函数发送TE通知

-(void) goToTakePhoto{ 
    C4Log(@"goToTakePhoto"); 
    [self removeFromView]; //removes the currently displayed items from being displayed 
    [self postNotification:@"goToTakePhoto"]; 
} 

我可以把它现在使用标签的工作,但它会如此好得多使用C4Image作为按钮...... 任何想法? 可以使用完整的代码在Github上:http://github.com/susemiessner/Urban-Alphabets/tree/master/urbanAlphabetsII

+0

难以编译您的项目,github回购缺少图像和其他一些文件。你能做到:'fromObject:theImageYouWantToUse'而不是'takePhoto'标签吗? –

+0

这就是我在这里做的:'[self listenFor:@“touchesBegan”fromObject:takePhotoButton andRunMethod:@“goToTakePhoto”];'它的作品也立即启动了在下一个屏幕中拍摄照片的按钮...... – suMi

回答

0

我刚刚找到这个问题的答案之一: 当回来的摄像头查看旧

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

依然活跃,因此它认为我已经拍摄的图像从相机,这是不正确的。所以解决方案是当我离开视图我只需要禁用,使用此代码

[self stopListeningFor:@"imageWasCaptured" object:cam]; 

这样做的整个魔术!