2013-05-21 3 views
0

앱에서 하위보기로 Cordova Cleaver를 사용하는 앱을 만듭니다. 앱의 상태에 따라보기 하단에 툴바가있을 수 있습니다. 도구 모음을 숨기면 전체보기 (맨 위의 상태 표시 줄 빼기)가 걸릴 수 있도록 코르도바보기의 크기가 커집니다. 이는 Webview를 재사용하여 임의의 위치에있는 콘텐츠를 표시하고 코드가 지원되는 경우 코드가 기본 기능을 제공 할 수 있기 때문입니다 (특히 앱 API를 구현하는 경우).Phonegap/Cordova camera.getPicture가 하위보기에 배치되면 이상하게 작동합니다.

전체 공개, MonoTouch는 크로스 플랫폼을 사용하고자하는 크고 복잡한 비즈니스 논리이기 때문에 MonoTouch를 사용하고 있습니다.하지만보기 측면에서 어떻게 만들어졌으며, iOS 라이브러리 만 사용하고 있습니다. (모노 터치 C# 래퍼 사용)하지만 문제가 발생하지 않아야합니다.

그래서 우리는 도구 모음과 WebViewController (CDVViewController의 하위 클래스)가 포함 된 AppViewController를 가지고 있습니다. 툴바는 즐겨 찾기를 추가하거나 기본 앱 페이지로 돌아가는 것과 같은 네이티브 앱의 일부 기능을 허용하는 데 사용됩니다.

이것은 잘 작동하는 것처럼 보였지만 한 가지 구체적인 경우에는 문제가 있습니다 (적어도 지금까지는). Cordova의 camera.getPicture 명령을 실행하면 상태 표시 줄이 숨겨 지지만 카메라보기는 여전히 상태 표시 줄 공간과 함께 맨 위에 배치되어 취소 버튼을 표시하지 않게됩니다. iPhone에서 카메라 버튼을 누르거나 취소하면이보기 아래의 툴바 버튼을 호출하는 것처럼 보입니다. Camera picker view with the status bar space remaining at the top.

이 문제를 극복하기 위해, 나는 TakePicture, DidCancelImagePicker, DidFinishPickingMediaWithInfo, DidFinishPickingImage 방법은, 우리가 테이크 사진 작업을 시작했을 때, 그것은 상태 표시 줄 및 도구 모음을 숨기거나 크기를 조절 할 수 있도록이 WebViewController의 CDVCamera는 서브 클래스 및 오버라이드 보기 및 WebView를 결합하여 효과적으로 볼 수 있도록합니다. 이것은 효과가 있었지만 다른 관련 버그를 경험하기 시작했습니다. 카메라 피커는 처음에는 완벽하게 괜찮 았지만, 피커를 취소하고 (가로에서 보았을 때) 다시 보일 경우 산발적으로 피커의 오른쪽에 큰 검은 색 섹션이 표시됩니다. 이 상태에있을 때 원하는 방식으로 회전 할 수 있으며 여전히 정사각형으로 표시됩니다. 초상화에서 취소하고 여는 것은 100 % 성공으로 작동하는 것처럼 보이지만 풍경에는 ​​다양한 신뢰성이있는 것으로 보입니다. Camera picker view with large black region unusable. 이보기 내에서 카메라보기를 누르면 사진을 찍은 것처럼 보이지만 보시다시피 카메라 선택 도구는 이미지의 하위 섹션에서 확대 된 것처럼 보입니다. Full view of the picture taken under the odd camera picker.

Holly Schinsky가 Embed Cordova/PhoneGap as a Subview in your Native iOS Application에 내 노력을 기울이기 위해 노력했지만, 잘못된 방식으로 뭔가를하고 있거나, 구성이 누락되어 있거나,이 작업을 수행해야하는 더 좋은 방법이 있습니다.

도움을 주시면 대단히 감사하겠습니다.


추가 유용한 정보 :

  • 코르도바 2.4.0은 지금까지 사용하지만 2.3.0과 2.7.0 시도하고 문제가있는 다른 표시하지 않은거야 것입니다.
+0

왜 당신이 코르도바 카메라 제어를 내장하는 대신 기본 카메라 API (또는 Xamarin.Mobile의 API)를 사용하고 있습니까? 이 접근 방식은 무엇을 얻게됩니까? – Jason

+0

긴 이야기를 짧게하기 위해 HTML5 기반 애플리케이션이 이미 성숙했지만 일부 특정 유스 케이스를 사용하려면 해당 기능을 제공하기 위해 네이티브 앱으로 래핑 할 수 있어야합니다. Cordova를 사용하면 HTML5 기반 앱의 자바 스크립트에서 카메라를 호출 할 수 있습니다. –

+0

내 카메라에서 동일한 문제가있는 코드 뷰어 뷰어로 AddChildViewController를 구현 한 코드를 표시 할 수 있습니다. –

답변

1

오늘이 문제에 대한 몇 주 후, 해결책을 찾았습니다. 아무도 그럴 필요가 없다고 확신 할 수는 없지만, 내가 원했던 문제는 내가 Cordova ViewController의 뷰를 가져 와서 더 큰 Applications ViewController 뷰에 추가하는 것이었다. 내가 누락 된 부분은 AddChildViewController을 사용하여 Cordova ViewController를 자식 뷰 컨트롤러로 추가하는 것입니다. Cordova ViewController를 자식으로두면 필요한 순환 게재 및 다른 애플리케이션 이벤트가 전달됩니다. 이제는 모든 것이 완벽하게 작동합니다.이번 주에 내가 찾았 으면 좋았을 텐데.

비슷한 문제를 겪고있는 다른 사용자들도 나처럼 자신 만의 View Controller에 삽입 할 새로운 Cordova ViewController를 만드는 경우 이와 같이 작동해야합니다.

관련된 모노의 부분 집합

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    this.webViewer = new CDVViewController(); 

    // If you have a start page you'd like to load, enter it here 
    // Or leave it commented to use what's configured in the config.xml 
    // this.webViewer.StartPage = ""; 

    AddChildViewController(this.webViewer); 

    this.View.add(this.webvViewer.View); 
} 

나는 희망이 도움이 (내 인터페이스 XIB를 사용)입니다.

Jason G의 코드를 기반으로 Objective-C에 내 코드를 쓰려고했습니다. 오류를 발견하면이 파일을 편집하십시오.

- (void)viewDidLoad 
{ 
    webView = [CDVViewController new]; 

    // If you have a start page you'd like to load, enter it here 
    // Or leave it commented to use what's configured in the config.xml 
    // webView.startPage = ""; 

    [self addChildViewController:webView]; 

    [self.view addSubview:webView.view]; 
} 

이 코드는 사용자가 원하는 코드가 아닙니다. self.view에 대한보기 프레임을 설정하려는 경우도 있습니다. 여기서 중요한 것은 addChildViewController이었습니다. 기본적으로 중요한 응용 프로그램 이벤트는 하위 ViewController로 전달됩니다.

1

그래, 여기 내 코드가 어떻게 생겼는지, 나는 옛날에 새로운 하위 뷰를 열었고, 새로 고침해야 할 때 다른 옵션을 찾아서 하위 뷰를 죽이고 다시 불러올 수 없었다. 맞아, 잘 됐네. 그러나 나가기 위하여 시도하고 있던 주요 것은 그것이 열릴 때 상쇄 된 사진기이었다.

내 H

,

#import <UIKit/UIKit.h> 
#import <ifaddrs.h> 
#import <arpa/inet.h> 
#import <Cordova/CDVViewController.h> 

@interface RSV : CDVViewController <UIWebViewDelegate> 
{ 
    IBOutlet CDVViewController *webView; 
    IBOutlet UIActivityIndicatorView *activityind; 
} 
- (IBAction)Refresh:(id)sender; 
@end 

내 M,

- (void)viewDidLoad 
{ 
    webView = [CDVViewController new]; 
    webView.startPage = @"Website"; 
    [self.webView addSubview:webView.view]; 
    webView.view.frame = CGRectMake(0, 0, 0, 0); 
    [activityind startAnimating]; 
    [self.webView addSubview: activityind]; 
    [self Malelka]; 
} 

-(void) Malelka 
{ 
    if ([webView.spaghetti isEqualToString:@"TRUE"]){ 
     [activityind removeFromSuperview]; 
    }else{ 
     [NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(Malelka) userInfo:nil repeats:NO]; 
    } 
} 

- (IBAction)Refresh:(id)sender { 
    webView = [CDVViewController new]; 
    webView.startPage = @"Website"; 
    [self.webView addSubview:webView.view]; 
    webView.view.frame = CGRectMake (0,0,self.view.frame.size.width,(self.view.frame.size.height -44)); 
    [activityind startAnimating]; 
    [self.webView addSubview: activityind]; 
    [self Malelka]; 
} 

- (void)webViewDidStartLoad:(UIWebView *)webView {} 
- (void)webViewDidFinishLoad:(UIWebView *)subview {} 
- (void)loading {} 
- (void)didReceiveMemoryWarning{[super didReceiveMemoryWarning];} 

@end