0

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

完全披露,我使用 MonoTouch,因为这些是我们希望跨平台使用的一些大型而复杂的业务逻辑,但就视图以及它们的创建方式而言,我只使用 iOS 库(使用 monotouch C# 包装器),但这不应该引起问题。

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

这似乎运作良好,但在一个特定情况下(至少到目前为止)存在问题。当我们运行 Cordova 的 camera.getPicture 命令时,状态栏是隐藏的,但相机视图似乎仍然放置在顶部,状态栏空间位于顶部,取消了取消按钮。在 iPhone 上,如果您点击相机按钮或取消,它似乎也会调用此视图下方的工具栏按钮。顶部剩余状态栏空间的相机选择器视图.

为了解决这个问题,我继承了 CDVCamera,并覆盖了 TakePicture、DidCancelImagePicker、DidFinishPickingMediaWithInfo、DidFinishPickingImage 方法,这样当我们开始拍照任务时,它会隐藏状态栏和工具栏,并调整 WebViewController 的视图大小,以及WebView 通过关联,因此它们将有效地成为唯一的视图。这很有效,但我们开始遇到另一个相关的错误。Camera Picker 在第一次时会显示得非常好,但是如果我们要取消选择器并重新调用(在横向时),它会偶尔在右侧显示一个带有大黑色部分的选择器。在这种状态下,我们可以随意旋转它,它仍然会显示为正方形。在 Portrait 中取消和打开似乎 100% 成功,带有大黑色区域的相机选择器视图无法使用. 在此视图中点击相机视图似乎可以拍摄照片,但正如您所看到的,就好像相机选择器放大了图像的一个子部分。在奇怪的相机选择器下拍摄的照片的全视图.

我试图将我的努力基于 Holly Schinsky 的Embed Cordova/PhoneGap as a Subview in your Native iOS Application,但也许我做错了事情,缺少一些配置,或者我应该有更好的方法正在这样做。

任何帮助是极大的赞赏。


其他有用信息:

  • 到目前为止,我使用的是 Cordova 2.4.0,但尝试了 2.3.0 和 2.7.0,问题似乎没有任何不同。
4

2 回答 2

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

我的米,

- (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
于 2013-06-28T12:39:51.787 回答
1

在这个问题上几周后,今天,我找到了解决方案。并不是说我确定任何人都需要它,但如果他们需要,我遇到的问题是我正在获取我的 Cordova ViewController 的视图,并将其添加到我更大的 Applications ViewController 的视图中。我缺少的是使用AddChildViewController. 通过将 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。

于 2013-06-04T23:13:36.703 回答