放置在子视图中时,Phonegap / Cordova camera.getPicture表现得很奇怪

时间:2013-05-21 18:35:48

标签: cordova xamarin.ios cordova-2.0.0

我正在创建一个应用程序,我在应用程序中使用Cordova Cleaver作为子视图。根据应用程序的状态,我们可能在视图底部有一个工具栏。当我们隐藏工具栏时,我们会增加Cordova视图的大小,以便它占据整个视图(减去顶部的状态栏)。这样做是因为我们可以重复使用Webview来显示来自任意位置的内容,并在这些页面支持时提供cordova本机功能,特别是如果它们实现我们的应用程序API。

完全披露,我正在使用MonoTouch,因为这些是我们想要使用跨平台的一些大而复杂的业务逻辑,但就视图而言,以及它们是如何创建的,我只使用iOS库(使用单声道C#包装器,但这不应该导致问题。

所以为了说清楚,我们有我们的AppViewController,它包含一个工具栏,以及一个我们的WebViewController(CDVViewController的子类)。工具栏用于允许本机应用程序中的某些功能,例如添加收藏夹或返回主应用程序页面。

这似乎运作良好,但在一个特定情况下(至少到目前为止)存在问题。当我们运行Cordova的camera.getPicture命令时,状态栏被隐藏,但是相机视图仍然显示在顶部的状态栏空间,切断了取消按钮。在iPhone上,如果您点击相机按钮或取消,它似乎也会调用此视图下方的工具栏按钮。Camera picker view with the status bar space remaining at the top

为了克服这个问题,我将CDVCamera子类化,并覆盖了TakePicture,DidCancelImagePicker,DidFinishPickingMediaWithInfo,DidFinishPickingImage方法,这样当我们开始拍摄任务时,它会隐藏状态栏和工具栏,并调整WebViewController的视图大小和WebView通过关联,使它们有效地成为唯一的视图。这很有效,但我们开始遇到另一个相关的错误。 Camera Picker第一次显示完全正常,但是如果我们取消选择器并重新调用(在横向时),它会偶尔显示右侧有一个黑色部分的选择器。当处于这种状态时,我们可以以任何我们想要的方式旋转它,它仍然会显示为正方形。取消和开放肖像似乎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上,但也许我正在以错误的方式做某事,缺少一些配置,或者我有更好的方法来做这件事。

非常感谢任何帮助。


其他有用信息:

  • 我目前使用的是Cordova 2.4.0,但尝试过2.3.0和2.7.0,问题没有任何不同。

2 个答案:

答案 0 :(得分:1)

在这个问题上经过几周,今天,我找到了解决方案。并不是说我确定任何人都会需要它,但如果他们这样做,我遇到的问题是我正在使用Cordova ViewController的视图,并将其添加到我更大的应用程序ViewController的视图中。我缺少的是使用AddChildViewController将我的Cordova ViewController添加为子视图控制器。通过将Cordova ViewController作为子项,它将转发所需的旋转和其他应用程序事件。现在每件事都很完美。希望我能在几个星期前找到它。

对于遇到类似问题的其他人,如果您像我一样创建一个新的Cordova ViewController,您将在自己的View Controller中嵌入,这样的东西应该可以工作。

这是所涉及的单声道的子集(我使用xib作为我的界面)

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);
}

我希望有所帮助。

基于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,默认情况下会将重要的应用程序事件转发给子ViewControllers。

答案 1 :(得分: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