我正在创建一个应用程序,我在应用程序中使用Cordova Cleaver作为子视图。根据应用程序的状态,我们可能在视图底部有一个工具栏。当我们隐藏工具栏时,我们会增加Cordova视图的大小,以便它占据整个视图(减去顶部的状态栏)。这样做是因为我们可以重复使用Webview来显示来自任意位置的内容,并在这些页面支持时提供cordova本机功能,特别是如果它们实现我们的应用程序API。
完全披露,我正在使用MonoTouch,因为这些是我们想要使用跨平台的一些大而复杂的业务逻辑,但就视图而言,以及它们是如何创建的,我只使用iOS库(使用单声道C#包装器,但这不应该导致问题。
所以为了说清楚,我们有我们的AppViewController,它包含一个工具栏,以及一个我们的WebViewController(CDVViewController的子类)。工具栏用于允许本机应用程序中的某些功能,例如添加收藏夹或返回主应用程序页面。
这似乎运作良好,但在一个特定情况下(至少到目前为止)存在问题。当我们运行Cordova的camera.getPicture命令时,状态栏被隐藏,但是相机视图仍然显示在顶部的状态栏空间,切断了取消按钮。在iPhone上,如果您点击相机按钮或取消,它似乎也会调用此视图下方的工具栏按钮。。
为了克服这个问题,我将CDVCamera子类化,并覆盖了TakePicture,DidCancelImagePicker,DidFinishPickingMediaWithInfo,DidFinishPickingImage方法,这样当我们开始拍摄任务时,它会隐藏状态栏和工具栏,并调整WebViewController的视图大小和WebView通过关联,使它们有效地成为唯一的视图。这很有效,但我们开始遇到另一个相关的错误。 Camera Picker第一次显示完全正常,但是如果我们取消选择器并重新调用(在横向时),它会偶尔显示右侧有一个黑色部分的选择器。当处于这种状态时,我们可以以任何我们想要的方式旋转它,它仍然会显示为正方形。取消和开放肖像似乎100%成功,但景观似乎有不同的可靠性。 。点击此视图中的摄像机视图似乎可以拍摄照片,但正如您所看到的,就像摄像机选取器放大了图像的子部分一样。
我试图将我的努力建立在Holly Schinsky的Embed Cordova/PhoneGap as a Subview in your Native iOS Application上,但也许我正在以错误的方式做某事,缺少一些配置,或者我有更好的方法来做这件事。
非常感谢任何帮助。
其他有用信息:
答案 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