1

我正在为 iOS 6 在 xcode 4.5.2 中使用 phonegap 2.7.0 Web 应用程序。在我的 Web 应用程序中,包含持续时间为 6 秒的视频录制选项。所以我从“ https://github.com/piemonte/PBJVision ”完成了这个过程。

现在我正在尝试使用 CDVPlugin 将原生 iOS 与 Phonegap 混合。因为我在 homescreen.html 中有一个图像(相机图标),所以当我单击图像时,图像标记 onclick() 会触发并调用 PBJViewController.m 文件中的 -(void) _setup() 方法。所以 mainscreen.html 是隐藏和显示带有一些自定义设计的相机选项。

因此,我将 PBJViewController.h & PBJViewController.m、PBJStrobeView.h & PBJStrobeView.m、PBJVisionUtilities.h & PBJVisionUtilities.m 以及最后一个 PBJVision.h & PBJVison.m 文件放在 plugins 文件夹中。

然后我创建一个 JavaScript 文件并命名为 PBJViewController.js 并添加到 www 文件夹中。

PBJViewController.js

function PBJViewController()
{

}


loadingalert.prototype._setup = function()
{
    //this.resultCallback(res);
    cordova.exec("PBJViewController._setup");
}


cordova.addConstructor(function() {

                       if(!window.plugins)
                       {
                       window.plugins = {};
                       }
                       //window.plugins.loadingalert = new PBJViewController();
                       window.loadingalert = new PBJViewController();
                       });

然后我在 homescreen.html 文件的函数 video() 中编写了调用代码。

主屏幕.htm l

  function video()
  {
       alert("video function");

      $('#loader').hide();
      $('#divcontroller').hide();
      $('#menuid').hide();
      $('#home_feeds').hide();

      loadingalert._setup();
      //window.plugins.loadingalert._setup();



      //objloading._setup();
      //window.location = "js-call:myObjectiveCFunction";
  //window.location.href='video.html?user_id='+userid+'&fb_token='+getValue("fb_token");
  }

我在 PBJViewController.h 文件中做了一些更改

PBJViewController.h

   #import <UIKit/UIKit.h>
#import <Cordova/CDVPlugin.h>

@interface PBJViewController : CDVPlugin <UIWebViewDelegate>
{
     IBOutlet UIWebView *webView;

}

-(void)_setup:(NSMutableArray*)paramArray withDict:(NSMutableDictionary*)options;

@end

并且在 PBJViewcontroller.m 文件中

    #import "PBJViewController.h"
#import "PBJVision.h"
#import "PBJStrobeView.h"
#import <Cordova/CDVPlugin.h>
#import <AssetsLibrary/AssetsLibrary.h>
#import <MediaPlayer/MediaPlayer.h>

@interface UIButton (ExtendedHit)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

@end

@implementation UIButton (ExtendedHit)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    CGRect relativeFrame = self.bounds;
    UIEdgeInsets hitTestEdgeInsets = UIEdgeInsetsMake(-35, -35, -35, -35);
    CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, hitTestEdgeInsets);
    return CGRectContainsPoint(hitFrame, point);
}

@end

@interface PBJViewController () <
    UIGestureRecognizerDelegate,
    PBJVisionDelegate,
    UIAlertViewDelegate>
{
    UIView *view;
    PBJStrobeView *_strobeView;
    UIButton *_doneButton;
    UIButton *_flipButton;

    UIView *_previewView;
    AVCaptureVideoPreviewLayer *_previewLayer;
    MPMoviePlayerViewController *playerController;
    MPMoviePlayerController *moviePlayer;
    UILabel *_instructionLabel;
    UILabel *ticker;
    NSTimer *timer;
    //NSDate *startDate;
    NSTimeInterval startDate;
    int hours, minutes, seconds;
    int secondsLeft;
    int counter;
    int timeRemaining;
    int i;
    NSTimeInterval elapsedTime;


    UILongPressGestureRecognizer *_longPressGestureRecognizer;
    BOOL _recording;
    BOOL running;

    ALAssetsLibrary *_assetLibrary;
    __block NSDictionary *_currentVideo;


    //NSTimeInterval coding..

    int currMinute;
    int currSecond;
    int currHour;
    int mins;
    NSTimeInterval secondsAlreadyRun;
    NSTimeInterval startTime;
    NSDate *startDate1;


}
//@property (nonatomic, retain) IBOutlet UIView *containerView;
@property (strong, nonatomic) MPMoviePlayerController *moviePlayerController;
@property (nonatomic, strong) NSString *videoPath;

@end

@implementation PBJViewController

//@synthesize containerView;
@synthesize moviePlayerController;
@synthesize videoPath;

#pragma mark - init


/*- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    //counter = 0;
    //ticker.text = [NSString stringWithFormat:@"%d", counter];

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        _assetLibrary = [[ALAssetsLibrary alloc] init];
        //[self _setup];
    }
    return self;
}*/

- (CDVPlugin *)initWithWebView:(UIWebView *)theWebView
{
    self = (PBJViewController *)[super initWithWebView:theWebView];

    if (self) {
        _assetLibrary = [[ALAssetsLibrary alloc] init];
    }

    return self;
}


/*-(void) viewDidLoad
{
    webView = [[UIWebView alloc] init];
    // Register the UIWebViewDelegate in order to shouldStartLoadWithRequest to be called (next function)
    webView.delegate = self;

}*/


- (void)dealloc
{
    [UIApplication sharedApplication].idleTimerDisabled = NO;
    _longPressGestureRecognizer.delegate = nil;

    [super dealloc];
}

//- (void)_setup
-(void)_setup:(NSMutableArray*)paramArray withDict:(NSMutableDictionary*)options;
{
    NSLog(@"Yes inheriting from homescreen btn click");
    running = false;
    secondsLeft = 67;
    view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)];
    view.backgroundColor = [UIColor blackColor];
    view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    CGFloat viewWidth = CGRectGetWidth(view.frame);

    // done button
    _doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    _doneButton.frame = CGRectMake(viewWidth - 20.0f - 20.0f, 20.0f, 20.0f, 20.0f);

    UIImage *buttonImage = [UIImage imageNamed:@"capture_yep"];
    [_doneButton setImage:buttonImage forState:UIControlStateNormal];

    [_doneButton addTarget:self action:@selector(_handleDoneButton:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:_doneButton];

    // elapsed time and red dot
    _strobeView = [[PBJStrobeView alloc] initWithFrame:CGRectZero];
    CGRect strobeFrame = _strobeView.frame;
    strobeFrame.origin = CGPointMake(15.0f, 15.0f);
    _strobeView.frame = strobeFrame;
    [view addSubview:_strobeView];

    // preview
    _previewView = [[UIView alloc] initWithFrame:CGRectZero];
    _previewView.backgroundColor = [UIColor blackColor];
    CGRect previewFrame = CGRectZero;
    previewFrame.origin = CGPointMake(0, 60.0f);
    CGFloat previewWidth = view.frame.size.width;
    previewFrame.size = CGSizeMake(previewWidth, previewWidth);
    _previewView.frame = previewFrame;

    // add AV layer
    _previewLayer = [[PBJVision sharedInstance] previewLayer];
    CGRect previewBounds = _previewView.layer.bounds;
    _previewLayer.bounds = previewBounds;
    _previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    _previewLayer.position = CGPointMake(CGRectGetMidX(previewBounds), CGRectGetMidY(previewBounds));
    [_previewView.layer addSublayer:_previewLayer];
    [view addSubview:_previewView];

    // instruction label
    _instructionLabel = [[UILabel alloc] initWithFrame:view.bounds];
    _instructionLabel.textAlignment = NSTextAlignmentCenter;
    _instructionLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:15.0f];
    _instructionLabel.textColor = [UIColor whiteColor];
    _instructionLabel.backgroundColor = [UIColor blackColor];
    _instructionLabel.text = NSLocalizedString(@"Touch and hold to record", @"Instruction message for capturing video.");
    [_instructionLabel sizeToFit];
    CGPoint labelCenter = _previewView.center;
    labelCenter.y += ((CGRectGetHeight(_previewView.frame) * 0.5f) + 35.0f);
    _instructionLabel.center = labelCenter;
    [view addSubview:_instructionLabel];

    ticker = [[UILabel alloc] initWithFrame:CGRectMake(230, 100, 80, 20)];
    ticker.textAlignment = NSTextAlignmentLeft;
    ticker.font = [UIFont fontWithName:@"HelveticaNeue" size:15.0f];
    ticker.textColor = [UIColor whiteColor];
    ticker.backgroundColor = [UIColor blackColor];
    ticker.text = @"00:00:00";
    [_previewView addSubview:ticker];


    // press to record gesture
    _longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] init];
    _longPressGestureRecognizer.delegate = self;
    _longPressGestureRecognizer.minimumPressDuration = 0.0f;
    _longPressGestureRecognizer.allowableMovement = 10.0f;
    [_longPressGestureRecognizer addTarget:self action:@selector(_handleLongPressGestureRecognizer:)];

    // gesture view to record
    UIView *gestureView = [[UIView alloc] initWithFrame:CGRectZero];
    CGRect gestureFrame = view.bounds;
    gestureFrame.origin = CGPointMake(0, 60.0f);
    gestureFrame.size.height -= 10.0f;
    gestureView.frame = gestureFrame;
    [view addSubview:gestureView];
    [gestureView addGestureRecognizer:_longPressGestureRecognizer];

    // flip button
    _flipButton = [UIButton buttonWithType:UIButtonTypeCustom];

    UIImage *flipImage = [UIImage imageNamed:@"capture_flip"];
    [_flipButton setImage:flipImage forState:UIControlStateNormal];

    CGRect flipFrame = _flipButton.frame;
    flipFrame.size = CGSizeMake(25.0f, 20.0f);
    flipFrame.origin = CGPointMake(10.0f, CGRectGetHeight(view.bounds) - 10.0f);
    _flipButton.frame = flipFrame;

    [_flipButton addTarget:self action:@selector(_handleFlipButton:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:_flipButton];
}

#pragma mark - view lifecycle



- (void)viewWillAppear:(BOOL)animated
{

    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

    [self _resetCapture];
    [[PBJVision sharedInstance] startPreview];
}

在这里,我面临警告消息“CDVPlugin”可能无法响应“viewWillAppear:”,因为我将 CDVPlugin 替换为 UIViewController "@interface PBJViewController : CDVPlugin"

我在 config.xml 文件中包含插件名称和值,有,

配置文件

这些是我的示例代码之一。我的问题是直到没有得到想要的输出。

请给出一些建议或结果。

4

1 回答 1

1

您可以尝试像这样调用插件方法 cordova.exec(null, null, "PBJViewController", "_setup", [])

于 2013-09-13T05:14:04.110 回答