iOS Screen Capture View

iOS Screen Capture View

A UIView that records real-time video of its subviews and periodically samples its current display to create a snapshot screen image. Can also record full screen with or without status bar area. Get screen snapshots quickly. Includes full source code and a working demo.

UIScreenCaptureView, a UIView subclass that periodically samples its current display and stores it as a UIImage available through the currentScreen property. The sample/update rate can be configured (within reason) by setting the frameRate property.

Can create a video of view, full screen with status bar or full screen without the status bar area. By default, the view and it's subviews are recorded. Get a screenshot at any time of a view, full screen with status area or full screen without status area.

By default, all screen snapshots are now done on a background thread to free up the UI main thread. A flag in UIScreenCaptureView class lets you switch between running snapshot on background or main thread.

This class can also be used to record real-time video of its subviews, using the startRecording and stopRecording methods. A new recording will overwrite any previously made recording file, so if you want to create multiple recordings per session (or across multiple sessions) then it is your responsibility to copy/back-up the recording output file after each session.

Some Uses

  1. Create a video of your app
  2. Create a video of a specific view in your app
  3. Add screen capture video recording capability to any view in your app
  4. Make the main view for your app to allow your app users to create videos on their own
  5. Create screen snapshot images. Can access the individual screen capture images used to create the video.
  6. Create screen snapshot. Periodically samples its current display to create a snapshot of the screen. So you do not have to even start recording to get screen snapshots. Use frameRate to adjust the sampling rate.
  7. Create fullscreen screen capture or video with or without the status area.
  8. Get a screen capture of full screen with status area.
  9. Get a screen capture of the full screen without status area.
  10. Get a screen capture of a specific view.

New alternative methods that do not require adding UIScreenCaptureView as main view.
e.g.: [screenCaptureView startRecordingViewForTimePeriod:seconds view:self.view parent:self];

Use UIScreenCaptureView like any UIView class and add views to record as subviews. If you would like to use the class to make a video of your app, make a UIScreenCaptureView the main view for your app. This way the recording will include all views in your app.

If you want to record a specific view only, then replace the view to record with a UIScreenCaptureView instance.

UIScreenCaptureView will make a recording of anything in it's subviews. Powerful and simple.

It's tested and works fine on iOS6 but will work on any other version as well.

Hide

Supported OS & SDK Versions

  • Supported build target - iOS 6.0 and iOS7 / Mac OS 10.7 (Xcode 4.3.1, Apple LLVM compiler 3.1)
  • Earliest supported deployment target - iOS 6.0 / Mac OS 10.6
  • Earliest compatible deployment target - iOS 6.0 / Mac OS 10.6

NOTE: 'Supported' means that the library has been tested with this version. 'Compatible' means that the library should work on this OS version (i.e. it doesn't rely on any unavailable SDK features) but is no longer being tested for compatibility and may require tweaking or bug fixes to run correctly.

Hide

Installation

To install UIScreenCaptureView into your app, create a group named UIScreenCaptureView within your app project then drag the file from the ScreenCaptureView folder into the folder. Make sure that you indicate to copy the files into your project and set the target ownership of your app for all files copied.

You should copy these files: SystemUtilities.h, SystemUtiities.m, UIScreenCaptureView.h and UIScreenCaptureView.m

Hide

Usage

To use this class, you must link against the following frameworks:

  - AssetsLibrary
  - AVFoundation
  - CoreGraphics
  - CoreMedia
  - CoreVideo
  - QuartzCore
  - MediaPlayer

// see Demo Example in Examples/Demo folder for full example and source code

 // To use view to make a video of screen snapshots of you app.
 // First make your view the UIScreenCaptureView
 // then any view added to UIScreenCaptureView will included when recording…


  (void)viewDidLoad {
 [super viewDidLoad];

 // create screen capture view.   Any subviews added to screen capture view will be recorded.
 BOOL fullscreen = FALSE;         // turn on to capture fullscreen, otherwise view only
 BOOL includeStatusBar = FALSE;   // turn on to include status bar when capturing fullscreen
 UIScreenCaptureView * screenCaptureView = [[UIScreenCaptureView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] fullscreen:fullscreen includeStatusBar:includeStatusBar];
 screenCaptureView.delegate = self;   // implements UIScreenCaptureViewDelegate interface
 self.view = screenCaptureView;

 // add your views to be recorded.   If you do not want to make the screenCaptureView your main view, see ALTERNATIVE below
 [self.view addSubView:yourView];

  // set some options
 [screenCaptureView setFrameRate:10.0f];            // 10 frames per seconds (10 frames is the default) adjust to control
                                                    // sampling of screen captures used in making video.
 [screenCaptureView setOutputName:@"output1.mp4"];  // output name (output.mp4 is the default)
 [screenCaptureView setVerbose:false];              // verbose debug mode (false is default)

  // ALTERNATIVE: if you did not want to set a UIScreenCaptureView as your parent view, then you
  // can use this alternate recording method to record your main views components.
  // To use this method you do not need to do the [self.view addSubview:yourView] call above
  // as you will be providing self.view which is your current view used.
  // [screenCaptureView startRecordingViewForTimePeriod:seconds view:self.view parent:self];

 // MANUAL RECORDING TIED TO BUTTONS if you want manual start recording by clicking a button, 
 // then create a UIButton that calls startRecording method when clicked.  Add another button 
 // to call stopRecording 

 // TIMED RECORDING: this test shows starting a timed recording for 20 seconds which records 
 // a video of view added to screenCaptureView
 [NSThread detachNewThreadSelector:@selector(startRecordingForTimePeriodTestThread:) toTarget:self withObject:@""];


 // can also use static methods to get a screen capture image
 //
 // fullscreen shot with no status bar
 UIImage * screenSnapshot = [UIScreenCaptureView takeScreenSnapshot];
 NSLog(@"screenSnapshot is width %.0f X height %.0f", screenSnapshot.size.width, screenSnapshot.size.height);
 // fullscreen shot with status bar
 UIImage * screenSnapshotWithStatusBar = [UIScreenCaptureView takeScreenSnapshotWithStatusBar];
 NSLog(@"screenSnapshot with status bar is width %.0f X height %.0f", screenSnapshotWithStatusBar.size.width, screenSnapshotWithStatusBar.size.height);
 // fullscreen shot with no status bar
 UIImage * screenSnapshotWithNoStatusBar = [UIScreenCaptureView takeScreenSnapshotWithNoStatusBar];
 NSLog(@"screenSnapshot with no status bar is width %.0f X height %.0f", screenSnapshotWithNoStatusBar.size.width, screenSnapshotWithNoStatusBar.size.height);

 // screenshot of a view...
 UIImage * screenSnapshotOfView = [UIScreenCaptureView takeScreenSnapshotOfView:self.view];
 NSLog(@"screenSnapshot of view is width %.0f X height %.0f", screenSnapshotOfView.size.width, screenSnapshotOfView.size.height);

 }

 // timed recording...
 (void)startRecordingForTimePeriodTestThread:(NSString *)arg {

[NSThread sleepForTimeInterval:1];
[self performSelectorOnMainThread:@selector(startRecordingForTimePeriodTest:) withObject:@"" waitUntilDone:NO];
}

 (void)startRecordingForTimePeriodTest:(NSString *)arg {

    [self startRecordingForTimePeriod:20];
}

 (void)startRecordingForTimePeriod:(int)seconds {

recordButton.hidden = TRUE;
stopButton.hidden = TRUE;

playIndex = 0;
recordingSeconds = seconds;
recordingTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(recordingTimerElapsed:) userInfo:nil repeats:YES];   

[screenCaptureView setFrameRate:10.0f];             // 10 frames per seconds (10 frames is the default)
[screenCaptureView setOutputName:@"video.mp4"];     // output name (output.mp4 is the default)
[screenCaptureView setVerbose:FALSE];                // verbose debug mode off

// record any subview of screenCaptureView...
//[screenCaptureView startRecordingForTimePeriod:seconds];   // record for N seconds

// if you did not want to add a UIScreenCaptureView as your parent view, then you
// can use this alternate recording method to record your main views components.

// alternate method records any subview of self.view without having to 
// make screenCaptureView the parent view.   Make sure the view passed is the main app view...
// this is useful for adding app demo video recording to your app without modifying your view layout...
[screenCaptureView startRecordingViewForTimePeriod:seconds view:self.view parent:self];
 }

 (void)startRecording {

recordButton.hidden = TRUE;
stopButton.hidden = FALSE;

playIndex = 0;
recordingTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(recordingTimerElapsed:) userInfo:nil repeats:YES];   

[screenCaptureView setFrameRate:10.0f];            // 10 frames per seconds (10 frames is the default)
[screenCaptureView setOutputName:@"video.mp4"];    // output name (output.mp4 is the default)
[screenCaptureView setVerbose:FALSE];              // verbose debug mode off
[screenCaptureView startRecording];                // verbose debug mode (false is default)
 }

// outputPathOrNil has the local output path if successful or nil if an error occurred...
 (void)recordingFinished:(NSURL *)outputPathOrNil {

 if (outputPathOrNil != nil) {
     NSLog(@"local output filename is %@", outputPathOrNil);

     // save the created video to Photos...
     NSString * outputName = [outputPathOrNil path];
     [screenCaptureView saveToPhotos:outputName target:self];

     // ---- other options:
     // play recorded video
     // [screenCaptureView playVideo:outputPathOrNil parent:self];

     // remove local copy
     // [screenCaptureView removeLocalCopyOfVideo:outputPathOrNil];    
     // ---- end other options
 } else
     NSLog(@"Error creating the video!");
}

 (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {

 if (error != nil)
     NSLog(@"Try to saved video and got the error: %@", [error description]);
}

// Constructors:

(id)initWithFrame:(CGRect)frame parent:(UIViewController *)parent;  
(id)initWithFrame:(CGRect)frame parent:(UIViewController *)parent fullscreen:(BOOL)_fullScreen includeStatusBar:(BOOL)includeStatusBar;

// Static Methods:

(UIImage *)takeScreenSnapshot;
(UIImage *)takeScreenSnapshotWithStatusBar;
(UIImage *)takeScreenSnapshotWithNoStatusBar;
(UIImage *)takeScreenSnapshotOfView:(UIView *)view;

// Methods:

(BOOL)startRecording;     // start recording screen captures...  
(BOOL)startRecordingForTimePeriod:(int)seconds;  // start recording screen captures for so many seconds...

 (BOOL)startRecordingView:(UIView *)view parent:(UIViewController *)_parent;     // start recording screen captures for a view...
 (BOOL)startRecordingViewForTimePeriod:(int)seconds view:(UIView *)view parent:(UIViewController *)_parent;  // start recording screen captures for so many seconds for a view...

 (void)stopRecording;   // stop recording screen captures and save video...

 (UIImage *)screenCaptureView:(UIView *)view;   // get screen capture image for a view

 (UIImage *)screenCaptureView2:(UIView *)view rect:(CGRect)rect;  // get screen capture image for a specific area of a view

 (UIImage *)getCurrentScreenshot;

 (UIImage *)getScreenshotForView:(UIView *)view;

 (UIImage *)getImageForView:(UIView *)view usePresentationLayer:(BOOL)usePresentationLayer;

 (void)playVideo:(NSURL *)videoUrl parent:(UIViewController *)parent;  // play a recorded view using the supplied view controller

 (BOOL)removeLocalCopyOfVideo:(NSURL *)localFile;    // remove the local copy of a recorded video

 (void)setVerbose:(BOOL)verbose;   // turn verbose mode on which displays more details when recording
Hide

Example Project Demo

The UIScreenCaptureViewDemo demo example in the Examples/Demo folder demonstrates how you might implement using UIScreenCaptureView.

The example is for iOS.

You need to log-in or create an account
  • Create an account
  • Log-in
Please use your real name.
Activation link will be sent to this address.
Minimum 8 characters
Enter your password again

Clicking this button confirms you read and agreed to the terms of use and privacy policy.

X

Save your watchlist

Fill your details below to receive project updates from your watch list - including new versions, price changes and discounts.

I agree to the terms of use and privacy policy.

3 licenses, starting from From » $39.99 14 day money-back guarantee View Licenses
or Get a quote

for customization or integration services

  • UIScreenCaptureView is very useful for me. And it saved my time.
    VG Vadim Glebov
    2 years ago, 0 comments
    Was this helpful?
    Flag
  • not so good,
    you delay with this code:
    [NSThread sleepForTimeInterval:delayRemaining > 0.0 ? delayRemaining : 0.01];

    but you forgot the duration for the creating of the screenshot. so the frame rate is not accurate.
    L liwei
    3 months ago, 0 comments
    Was this helpful?
    Flag
  • The code can be a little better with commenting and quality, I actually bought this for 29.99 now its 10.00.
    L Larry
    8 months ago, 0 comments
    Was this helpful?
    Flag
Post a comment

Or enter your name and Email
  • HH Hansol Huh 6 hours ago
    I want to make a video from UIView with sound from mic. Is it possible?
  • Thomas A. Markel Developer 4 days ago
    New version 4.2 has support for view, full screen with status bar and full screen without status bar.
  • LM Luis Miguel 5 months ago
    We have developed a simple app, in which the user draws on the screen of an iPad. Like paint app. We need to capture on video what the user is drawing. We need to obtain a smooth video. The frame must be 30 fps. Our drawing code is as follows (very simple): - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; currentPoint = [touch locationInView:self]; CGPoint midPoint = midpoint(previousPoint, currentPoint); [path addQuadCurveToPoint:midPoint controlPoint:previousPoint]; [path addQuadCurveToPoint:midPoint controlPoint:currentPoint]; previousPoint = currentPoint; [self setNeedsDisplay]; } Your library will work well?? Your library record from MPMoviePlayerController? Is there a evaluation version?? Thaks a lot.