<img src="https://img.shields.io/badge/%20-ENTERPRISE-B10031" style="float:left"/><br /> <img src="https://img.shields.io/badge/iOS-V4-009727?logo=apple" style="float:left"/><br />

The `JWPlayerViewController` is a customizable view controller that allows you to display user controls for a prepackaged video experience without having to implement your own interface.

<br /> <hr />

## Requirement

  • JWPlayerKit 4.0.0+

<br /> <hr />

## Features

### General

The following table lists the customizable native features of the `JWPlayerViewController`.



This class does not allow for 100% customization. For more customization or a simpler interface, use `JWPlayerView` and assign your own delegates to the player.

TopicFeatures
**Branding****[Logo/Watermarks](🔗)**: Add a unique logoto your app **[Skinning](🔗)**: Customize and define the player skin
**Cross-device streaming****[AirPlay](🔗)**: Stream to iOS devices through clicking the AirPlay button **[Google Cast](🔗):** Stream to Cast devices when linked with the Cast framework
**Monetization****[Google DAI](🔗) **, **[Google IMA](🔗)**: Monetize content with Google DAI and IMA ads (native customization not supported) **[VAST](🔗)**: Monetize content with JWP VAST ads (native customization supported)
**User Experience****Fullscreen**: Initiate fullscreen mode by tapping a button, rotating the device, triggering an event, or calling a method **Lock screen controls**: Enable or disable lock screen controls for content **Playback rates**: Define the available playback rates for your content
**User Interface****Poster Image**: The poster image you specify for a player item will display at the beginning of a video unless `autostart` is set to `true` in the player config. This idle screen will wait until the user taps the play button. This poster image is also displayed during audio-only content. **[Picture in Picture](🔗)**: Display or hide a Picture in Picture button **Playlist button**: Playlist button that allows users to navigate through media and choose the next media to be played
**Video Recommendations**If your content has [Recommendations](🔗), this can be accessed through the playlist screen. The Recommendations menu will also appear at the end of a playlist or during the autoplay screen, if set up in your configuration.

<br /> <br />

### Additional Features

#### Basic Player Interface

The interface comes with a centered play/pause button and fast-forward/rewind buttons (15 seconds). If the currently playing media is part of a playlist there are also centered next/previous buttons. These do not appear unless you are viewing a playlist.

The interface will stay on during audio-only content, but by default the interface will only appear when the user taps it. It will fade after three seconds, but this can be customized by setting the `interfaceFadeTime` property. The interface can also be set to always show or always hide using the `interfaceBehavior` property.

Another feature related to seeking is double tapping the left or right side of the screen. With or without the controls on the screen, this will trigger a rewind 15 seconds or fast forward 15 seconds event.

<br />

#### Accessing the Player

You have full access to the `JWPlayer` object through the `player` property. If you wish to call methods on the player directly, such as `play()`, `pause()`, setting other properties or querying the state of the player, use this property.

You also have full access to the `JWPlayerView` through the `playerView` property. You can set its properties by using this.

<br />

#### Listening for Events

When using the `player` and `playerView` properties you will notice they differ from the `JWPlayerView` and `JWPlayer` base types in that they do not allow you to set the delegate properties. `JWPlayerViewController` conforms to every delegate, and is already the assigned delegate for its player.

In order to listen for events, you need to subclass `JWPlayerViewController`. This allows you to override any delegate methods. Please refer to the delegates listed in JWPlayerView and JWPlayer for more information on the delegates and their methods.



When you override a delegate method in your `JWPlayerViewController` subclass, always call the `super` method before your implementation, as in the snippets presented here in [our documentation](🔗).

<br />

In addition, the `JWPlayerViewController` itself has a delegate property which takes a `JWPlayerViewControllerDelegate`. Conforming to this delegate allows you to listen for view controller-specific events, such as the following:

  • Fullscreen state

  • Related and Recommended item state and choices

  • Player size changes

  • Screen taps

<br />

<!-- Removes the automatic page-to-page navigation at the bottom of the page -->

<style> .rm-Pagination { display: none; } </style>