- made theme 2 banner dynamic, if ad loads then only it will be shown
- made radio ad dynamic, now ad will show up only if ad is received - added a retry count to fm, it will try 4 times to connect to the server if not then showing the reload btn
This commit is contained in:
@@ -31,6 +31,7 @@ class WokaFMVC: UIViewController {
|
||||
|
||||
vm.player?.pause()
|
||||
NotificationCenter.default.removeObserver(self,name: UIApplication.didEnterBackgroundNotification, object: nil)
|
||||
NotificationCenter.default.removeObserver(self,name: UIApplication.willEnterForegroundNotification, object: nil)
|
||||
|
||||
// Deactivate the audio session if needed
|
||||
do {
|
||||
@@ -45,11 +46,14 @@ class WokaFMVC: UIViewController {
|
||||
vm.vc = self
|
||||
vm.initView()
|
||||
NotificationCenter.default.addObserver(self,selector: #selector(appDidEnterBackground),name: UIApplication.didEnterBackgroundNotification,object: nil)
|
||||
NotificationCenter.default.addObserver(self,selector: #selector(appWillEnterForeground),name: UIApplication.willEnterForegroundNotification,object: nil)
|
||||
}
|
||||
|
||||
// MARK: - App LifeCycle HAndler
|
||||
|
||||
@objc func appDidEnterBackground() {
|
||||
vm.setupNowPlayingInfo()
|
||||
vm.setupRemoteCommandCenter()
|
||||
if let postID = AuthFunc.shareInstance.staticURLs?.liveFmData?.id {
|
||||
let duration = DateFormatterLib.dateDifferenceINT(date1: vm.startTimeStamp, date2: Date())
|
||||
AuthFunc.shareInstance.userVideoView(postID: postID, postType: PostType.FM.rawValue, duration: duration, catID: 0) { [weak self] isDone in
|
||||
@@ -61,6 +65,10 @@ class WokaFMVC: UIViewController {
|
||||
}
|
||||
}
|
||||
|
||||
@objc func appWillEnterForeground(){
|
||||
vm.stopMPNowPlayin()
|
||||
}
|
||||
|
||||
@IBAction func playBtnTapped(_ sender: UIButton) {
|
||||
PersistentStorage.shared.addRadioCount()
|
||||
if sender == playBtn{
|
||||
@@ -151,6 +159,12 @@ class WokaFMVC: UIViewController {
|
||||
print("FM is ready to play")
|
||||
vm.player.play()
|
||||
} else if vm.playerItem.status == .failed {
|
||||
if vm.retryCount < 4{
|
||||
vm.retryCount += 1
|
||||
vm.retryConnect()
|
||||
print("retry fm connect :-", vm.retryCount)
|
||||
return
|
||||
}
|
||||
print("FM failed to load")
|
||||
activityIndicator.stopAnimating()
|
||||
playBtn.setImage(UIImage(named: "Reload"), for: .normal)
|
||||
@@ -225,9 +239,10 @@ extension UIButton {
|
||||
extension WokaFMVC : GADBannerViewDelegate{
|
||||
func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
|
||||
print("bannerViewDidReceiveAd")
|
||||
adView.isHidden = false
|
||||
bannerView.alpha = 0
|
||||
bannerView.backgroundColor = #colorLiteral(red: 0.01960784314, green: 0, blue: 0.2196078431, alpha: 1)
|
||||
UIView.animate(withDuration: 0.3, animations: {
|
||||
UIView.animate(withDuration: 0.2, animations: {
|
||||
bannerView.alpha = 1
|
||||
})
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
import UIKit
|
||||
import AVFoundation
|
||||
import GoogleMobileAds
|
||||
import MediaPlayer
|
||||
|
||||
class WokaFMVM{
|
||||
|
||||
@@ -18,7 +19,10 @@ class WokaFMVM{
|
||||
|
||||
var startTimeStamp = Date()
|
||||
var bottomBannerView = GADBannerView()
|
||||
|
||||
|
||||
// if retry count is 4 reset it to 0
|
||||
var retryCount = 0
|
||||
|
||||
func initView(){
|
||||
startTimeStamp = Date()
|
||||
vc.mainView.roundCorners(radius: 10, corners: [.topLeft, .topRight])
|
||||
@@ -43,18 +47,94 @@ class WokaFMVM{
|
||||
}
|
||||
self.vc.dismiss(animated: true)
|
||||
}
|
||||
setGoogleAd()
|
||||
|
||||
|
||||
// updateNowPlayingInfo()
|
||||
}
|
||||
|
||||
// MARK: - SetupAd
|
||||
|
||||
func stopMPNowPlayin(){
|
||||
MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
|
||||
}
|
||||
|
||||
func setupNowPlayingInfo() {
|
||||
let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
|
||||
var nowPlayingInfo: [String: Any] = [:]
|
||||
|
||||
// Set the media title, artist, and album name
|
||||
nowPlayingInfo[MPMediaItemPropertyTitle] = "Live FM"
|
||||
nowPlayingInfo[MPMediaItemPropertyArtist] = "WOKA"
|
||||
nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = "Album Name"
|
||||
|
||||
// Optional: Set the artwork
|
||||
if let artworkImage = UIImage(named: "WokaLogo") {
|
||||
let artwork = MPMediaItemArtwork(boundsSize: artworkImage.size) { size in
|
||||
return artworkImage
|
||||
}
|
||||
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
|
||||
}
|
||||
|
||||
// Set the duration and current playback position
|
||||
if let currentItem = player.currentItem {
|
||||
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = currentItem.asset.duration.seconds
|
||||
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
|
||||
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
|
||||
}
|
||||
|
||||
// Assign the nowPlayingInfo to the center
|
||||
nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo
|
||||
}
|
||||
|
||||
func setupRemoteCommandCenter() {
|
||||
let commandCenter = MPRemoteCommandCenter.shared()
|
||||
|
||||
// Enable play command
|
||||
commandCenter.playCommand.addTarget { [unowned self] event in
|
||||
if player.rate == 0.0 {
|
||||
player.play()
|
||||
return .success
|
||||
}
|
||||
return .commandFailed
|
||||
}
|
||||
|
||||
// Enable pause command
|
||||
commandCenter.pauseCommand.addTarget { [unowned self] event in
|
||||
if player.rate == 1.0 {
|
||||
player.pause()
|
||||
return .success
|
||||
}
|
||||
return .commandFailed
|
||||
}
|
||||
|
||||
// Enable next and previous track commands if needed
|
||||
commandCenter.nextTrackCommand.isEnabled = false
|
||||
commandCenter.previousTrackCommand.isEnabled = false
|
||||
}
|
||||
|
||||
func updateNowPlayingInfo() {
|
||||
if let currentItem = player.currentItem {
|
||||
var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo ?? [:]
|
||||
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
|
||||
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
|
||||
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
func setGoogleAd(){
|
||||
/*
|
||||
Show google ads with dispatch queue.
|
||||
*/
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: { [weak self] in
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.8, execute: { [weak self] in
|
||||
guard let self else{return}
|
||||
AdReusable.sharedInstance.setupBannerAd(bannerView: self.bottomBannerView, in: vc.adView, adUnitID: K.GoogleAdIDs.themeTwo, viewController: self.vc)
|
||||
vc.adView.isHidden = false
|
||||
// vc.adView.isHidden = false
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Setup AV & Player
|
||||
|
||||
func setupAudioSession() {
|
||||
@@ -79,6 +159,7 @@ class WokaFMVM{
|
||||
playerItem = AVPlayerItem(url: url)
|
||||
player = AVPlayer(playerItem: playerItem)
|
||||
player.play()
|
||||
// setGoogleAd()
|
||||
}
|
||||
|
||||
func retryConnect(){
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23094" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina6_12" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23084"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
@@ -22,7 +21,7 @@
|
||||
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</view>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tru-CU-GHH">
|
||||
<rect key="frame" x="358" y="437" width="30" height="30"/>
|
||||
<rect key="frame" x="358" y="527" width="30" height="30"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="tru-CU-GHH" secondAttribute="height" multiplier="1:1" id="oBL-JT-l4l"/>
|
||||
</constraints>
|
||||
@@ -33,150 +32,158 @@
|
||||
<action selector="closeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="qEj-0u-joR"/>
|
||||
</connections>
|
||||
</button>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5fM-ca-UBK">
|
||||
<rect key="frame" x="0.0" y="472" width="393" height="380"/>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="BackgroundCloud" translatesAutoresizingMaskIntoConstraints="NO" id="jzM-eu-OKw">
|
||||
<rect key="frame" x="0.0" y="562" width="393" height="290"/>
|
||||
</imageView>
|
||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="WMk-dN-J34">
|
||||
<rect key="frame" x="0.0" y="562" width="393" height="290"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="BackgroundCloud" translatesAutoresizingMaskIntoConstraints="NO" id="jzM-eu-OKw">
|
||||
<rect key="frame" x="0.0" y="0.0" width="393" height="380"/>
|
||||
</imageView>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="MasilaLogo" translatesAutoresizingMaskIntoConstraints="NO" id="zge-fr-Eo7">
|
||||
<rect key="frame" x="0.0" y="0.0" width="393" height="60"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="60" id="zkY-tp-WGf"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="MasilaCharacter" translatesAutoresizingMaskIntoConstraints="NO" id="erp-13-s4m">
|
||||
<rect key="frame" x="0.0" y="30" width="393" height="150"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="150" id="1Ot-Jr-tNF"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" image="ComingSoonMasila" translatesAutoresizingMaskIntoConstraints="NO" id="RH0-xQ-zUi">
|
||||
<rect key="frame" x="0.0" y="240" width="393" height="30"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="30" id="2Gp-Xz-ex4"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hI6-1V-MUR">
|
||||
<rect key="frame" x="0.0" y="180" width="393" height="50"/>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5fM-ca-UBK">
|
||||
<rect key="frame" x="0.0" y="0.0" width="393" height="290"/>
|
||||
<subviews>
|
||||
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="V0i-Kx-TXO">
|
||||
<rect key="frame" x="100" y="0.0" width="193" height="50"/>
|
||||
<color key="backgroundColor" red="0.36862745099999999" green="0.1215686275" blue="0.76862745099999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<integer key="value" value="10"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="MasilaLogo" translatesAutoresizingMaskIntoConstraints="NO" id="zge-fr-Eo7">
|
||||
<rect key="frame" x="0.0" y="0.0" width="393" height="60"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="60" id="zkY-tp-WGf"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="MasilaCharacter" translatesAutoresizingMaskIntoConstraints="NO" id="erp-13-s4m">
|
||||
<rect key="frame" x="0.0" y="30" width="393" height="150"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="150" id="1Ot-Jr-tNF"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" image="ComingSoonMasila" translatesAutoresizingMaskIntoConstraints="NO" id="RH0-xQ-zUi">
|
||||
<rect key="frame" x="0.0" y="240" width="393" height="30"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="30" id="2Gp-Xz-ex4"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hI6-1V-MUR">
|
||||
<rect key="frame" x="0.0" y="180" width="393" height="50"/>
|
||||
<subviews>
|
||||
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="V0i-Kx-TXO">
|
||||
<rect key="frame" x="100" y="0.0" width="193" height="50"/>
|
||||
<color key="backgroundColor" red="0.36862745099999999" green="0.1215686275" blue="0.76862745099999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<integer key="value" value="10"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sGT-62-neK" userLabel="Vol-">
|
||||
<rect key="frame" x="110.00000000000001" y="4" width="50.666666666666671" height="42"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="sGT-62-neK" secondAttribute="height" multiplier="1.2:1" id="mCV-bc-UnD"/>
|
||||
</constraints>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||
<state key="normal" image="speaker.wave.1.fill" catalog="system"/>
|
||||
<connections>
|
||||
<action selector="volumeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="bZA-9P-p0X"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QCY-ib-bFw" userLabel="Vol+">
|
||||
<rect key="frame" x="232.66666666666666" y="4" width="50.333333333333343" height="42"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="QCY-ib-bFw" secondAttribute="height" multiplier="1.2:1" id="OCb-nI-KkI"/>
|
||||
</constraints>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||
<state key="normal" image="speaker.wave.3.fill" catalog="system"/>
|
||||
<connections>
|
||||
<action selector="volumeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="Eyb-hO-aXs"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JBl-cN-PnX">
|
||||
<rect key="frame" x="165.66666666666666" y="-6" width="62" height="62"/>
|
||||
<color key="backgroundColor" red="0.36862745098039218" green="0.12156862745098039" blue="0.76862745098039209" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="JBl-cN-PnX" secondAttribute="height" multiplier="1:1" id="OiK-qQ-wk0"/>
|
||||
</constraints>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||
<state key="normal" image="PlayButton"/>
|
||||
<connections>
|
||||
<action selector="playBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="4u5-dB-Ief"/>
|
||||
</connections>
|
||||
</button>
|
||||
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" animating="YES" style="medium" translatesAutoresizingMaskIntoConstraints="NO" id="cnz-PV-85Z">
|
||||
<rect key="frame" x="186.66666666666666" y="-6" width="20" height="62"/>
|
||||
<color key="color" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</activityIndicatorView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="QCY-ib-bFw" firstAttribute="leading" secondItem="JBl-cN-PnX" secondAttribute="trailing" constant="5" id="1q3-uP-XFR"/>
|
||||
<constraint firstAttribute="bottom" secondItem="QCY-ib-bFw" secondAttribute="bottom" constant="4" id="3na-Jl-Mir"/>
|
||||
<constraint firstAttribute="bottom" secondItem="JBl-cN-PnX" secondAttribute="bottom" constant="-6" id="CAg-4X-ZEf"/>
|
||||
<constraint firstItem="V0i-Kx-TXO" firstAttribute="trailing" secondItem="QCY-ib-bFw" secondAttribute="trailing" constant="10" id="DFl-LC-YaF"/>
|
||||
<constraint firstItem="V0i-Kx-TXO" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" id="DIF-bB-nkc"/>
|
||||
<constraint firstItem="V0i-Kx-TXO" firstAttribute="leading" secondItem="sGT-62-neK" secondAttribute="leading" constant="-10" id="DuH-FP-2PQ"/>
|
||||
<constraint firstItem="cnz-PV-85Z" firstAttribute="height" secondItem="JBl-cN-PnX" secondAttribute="height" id="QZw-Xw-8iF"/>
|
||||
<constraint firstAttribute="bottom" secondItem="V0i-Kx-TXO" secondAttribute="bottom" id="Syc-Zc-u10"/>
|
||||
<constraint firstItem="JBl-cN-PnX" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="-6" id="WOi-6K-hbI"/>
|
||||
<constraint firstItem="cnz-PV-85Z" firstAttribute="centerY" secondItem="JBl-cN-PnX" secondAttribute="centerY" id="a7t-X2-Rmc"/>
|
||||
<constraint firstAttribute="bottom" secondItem="sGT-62-neK" secondAttribute="bottom" constant="4" id="as0-w3-1mC"/>
|
||||
<constraint firstItem="cnz-PV-85Z" firstAttribute="centerX" secondItem="JBl-cN-PnX" secondAttribute="centerX" id="b1V-dm-PVx"/>
|
||||
<constraint firstItem="cnz-PV-85Z" firstAttribute="width" secondItem="JBl-cN-PnX" secondAttribute="width" multiplier="0.322581" id="fEs-qd-SsB"/>
|
||||
<constraint firstItem="sGT-62-neK" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="4" id="i92-so-DwA"/>
|
||||
<constraint firstItem="JBl-cN-PnX" firstAttribute="centerX" secondItem="hI6-1V-MUR" secondAttribute="centerX" id="nKc-hb-aUI"/>
|
||||
<constraint firstItem="JBl-cN-PnX" firstAttribute="leading" secondItem="sGT-62-neK" secondAttribute="trailing" constant="5" id="ugE-e5-LuP"/>
|
||||
<constraint firstAttribute="height" constant="50" id="w5o-m1-tFn"/>
|
||||
<constraint firstItem="QCY-ib-bFw" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="4" id="xPq-57-EFe"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sGT-62-neK" userLabel="Vol-">
|
||||
<rect key="frame" x="110.00000000000001" y="4" width="50.666666666666671" height="42"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="sGT-62-neK" secondAttribute="height" multiplier="1.2:1" id="mCV-bc-UnD"/>
|
||||
</constraints>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||
<state key="normal" image="speaker.wave.1.fill" catalog="system"/>
|
||||
<connections>
|
||||
<action selector="volumeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="bZA-9P-p0X"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QCY-ib-bFw" userLabel="Vol+">
|
||||
<rect key="frame" x="232.66666666666666" y="4" width="50.333333333333343" height="42"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="QCY-ib-bFw" secondAttribute="height" multiplier="1.2:1" id="OCb-nI-KkI"/>
|
||||
</constraints>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||
<state key="normal" image="speaker.wave.3.fill" catalog="system"/>
|
||||
<connections>
|
||||
<action selector="volumeBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="Eyb-hO-aXs"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JBl-cN-PnX">
|
||||
<rect key="frame" x="165.66666666666666" y="-6" width="62" height="62"/>
|
||||
<color key="backgroundColor" red="0.36862745098039218" green="0.12156862745098039" blue="0.76862745098039209" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="JBl-cN-PnX" secondAttribute="height" multiplier="1:1" id="OiK-qQ-wk0"/>
|
||||
</constraints>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||
<state key="normal" image="PlayButton"/>
|
||||
<connections>
|
||||
<action selector="playBtnTapped:" destination="Y6W-OH-hqX" eventType="touchUpInside" id="4u5-dB-Ief"/>
|
||||
</connections>
|
||||
</button>
|
||||
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" animating="YES" style="medium" translatesAutoresizingMaskIntoConstraints="NO" id="cnz-PV-85Z">
|
||||
<rect key="frame" x="186.66666666666666" y="-6" width="20" height="62"/>
|
||||
<color key="color" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</activityIndicatorView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="QCY-ib-bFw" firstAttribute="leading" secondItem="JBl-cN-PnX" secondAttribute="trailing" constant="5" id="1q3-uP-XFR"/>
|
||||
<constraint firstAttribute="bottom" secondItem="QCY-ib-bFw" secondAttribute="bottom" constant="4" id="3na-Jl-Mir"/>
|
||||
<constraint firstAttribute="bottom" secondItem="JBl-cN-PnX" secondAttribute="bottom" constant="-6" id="CAg-4X-ZEf"/>
|
||||
<constraint firstItem="V0i-Kx-TXO" firstAttribute="trailing" secondItem="QCY-ib-bFw" secondAttribute="trailing" constant="10" id="DFl-LC-YaF"/>
|
||||
<constraint firstItem="V0i-Kx-TXO" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" id="DIF-bB-nkc"/>
|
||||
<constraint firstItem="V0i-Kx-TXO" firstAttribute="leading" secondItem="sGT-62-neK" secondAttribute="leading" constant="-10" id="DuH-FP-2PQ"/>
|
||||
<constraint firstItem="cnz-PV-85Z" firstAttribute="height" secondItem="JBl-cN-PnX" secondAttribute="height" id="QZw-Xw-8iF"/>
|
||||
<constraint firstAttribute="bottom" secondItem="V0i-Kx-TXO" secondAttribute="bottom" id="Syc-Zc-u10"/>
|
||||
<constraint firstItem="JBl-cN-PnX" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="-6" id="WOi-6K-hbI"/>
|
||||
<constraint firstItem="cnz-PV-85Z" firstAttribute="centerY" secondItem="JBl-cN-PnX" secondAttribute="centerY" id="a7t-X2-Rmc"/>
|
||||
<constraint firstAttribute="bottom" secondItem="sGT-62-neK" secondAttribute="bottom" constant="4" id="as0-w3-1mC"/>
|
||||
<constraint firstItem="cnz-PV-85Z" firstAttribute="centerX" secondItem="JBl-cN-PnX" secondAttribute="centerX" id="b1V-dm-PVx"/>
|
||||
<constraint firstItem="cnz-PV-85Z" firstAttribute="width" secondItem="JBl-cN-PnX" secondAttribute="width" multiplier="0.322581" id="fEs-qd-SsB"/>
|
||||
<constraint firstItem="sGT-62-neK" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="4" id="i92-so-DwA"/>
|
||||
<constraint firstItem="JBl-cN-PnX" firstAttribute="centerX" secondItem="hI6-1V-MUR" secondAttribute="centerX" id="nKc-hb-aUI"/>
|
||||
<constraint firstItem="JBl-cN-PnX" firstAttribute="leading" secondItem="sGT-62-neK" secondAttribute="trailing" constant="5" id="ugE-e5-LuP"/>
|
||||
<constraint firstAttribute="height" constant="50" id="w5o-m1-tFn"/>
|
||||
<constraint firstItem="QCY-ib-bFw" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="top" constant="4" id="xPq-57-EFe"/>
|
||||
<constraint firstAttribute="trailing" secondItem="hI6-1V-MUR" secondAttribute="trailing" id="0HY-Ut-7vJ"/>
|
||||
<constraint firstItem="RH0-xQ-zUi" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="2OQ-XF-dHi"/>
|
||||
<constraint firstItem="erp-13-s4m" firstAttribute="top" secondItem="zge-fr-Eo7" secondAttribute="bottom" constant="-30" id="49c-35-bOB"/>
|
||||
<constraint firstItem="erp-13-s4m" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="6Ef-fm-os1"/>
|
||||
<constraint firstItem="hI6-1V-MUR" firstAttribute="top" secondItem="erp-13-s4m" secondAttribute="bottom" id="92j-Yc-yFG"/>
|
||||
<constraint firstItem="zge-fr-Eo7" firstAttribute="top" secondItem="5fM-ca-UBK" secondAttribute="top" id="QJQ-cF-Mdz"/>
|
||||
<constraint firstItem="hI6-1V-MUR" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="TDX-uI-H7Y"/>
|
||||
<constraint firstAttribute="bottom" secondItem="RH0-xQ-zUi" secondAttribute="bottom" constant="20" id="TSS-a7-w9J"/>
|
||||
<constraint firstItem="zge-fr-Eo7" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="U2h-lQ-CVw"/>
|
||||
<constraint firstItem="RH0-xQ-zUi" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="bottom" constant="10" id="Xyg-xc-QO3"/>
|
||||
<constraint firstAttribute="trailing" secondItem="erp-13-s4m" secondAttribute="trailing" id="shc-vX-eeD"/>
|
||||
<constraint firstAttribute="trailing" secondItem="zge-fr-Eo7" secondAttribute="trailing" id="vn4-mh-GIN"/>
|
||||
<constraint firstAttribute="trailing" secondItem="RH0-xQ-zUi" secondAttribute="trailing" id="xbH-kE-W5r"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IEh-tF-XpP">
|
||||
<rect key="frame" x="0.0" y="280" width="393" height="100"/>
|
||||
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IEh-tF-XpP">
|
||||
<rect key="frame" x="0.0" y="0.0" width="393" height="100"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="100" id="qDR-Bj-46Y"/>
|
||||
<constraint firstAttribute="height" constant="100" id="e7j-5I-ing"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="hI6-1V-MUR" secondAttribute="trailing" id="0HY-Ut-7vJ"/>
|
||||
<constraint firstItem="RH0-xQ-zUi" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="2OQ-XF-dHi"/>
|
||||
<constraint firstItem="erp-13-s4m" firstAttribute="top" secondItem="zge-fr-Eo7" secondAttribute="bottom" constant="-30" id="49c-35-bOB"/>
|
||||
<constraint firstAttribute="trailing" secondItem="jzM-eu-OKw" secondAttribute="trailing" id="4bH-FA-5z2"/>
|
||||
<constraint firstItem="jzM-eu-OKw" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="5cU-9F-DUz"/>
|
||||
<constraint firstItem="erp-13-s4m" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="6Ef-fm-os1"/>
|
||||
<constraint firstItem="hI6-1V-MUR" firstAttribute="top" secondItem="erp-13-s4m" secondAttribute="bottom" id="92j-Yc-yFG"/>
|
||||
<constraint firstAttribute="bottom" secondItem="IEh-tF-XpP" secondAttribute="bottom" id="JW7-KE-JzZ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="IEh-tF-XpP" secondAttribute="trailing" id="NEl-Op-BxQ"/>
|
||||
<constraint firstItem="zge-fr-Eo7" firstAttribute="top" secondItem="5fM-ca-UBK" secondAttribute="top" id="QJQ-cF-Mdz"/>
|
||||
<constraint firstItem="jzM-eu-OKw" firstAttribute="top" secondItem="5fM-ca-UBK" secondAttribute="top" id="SIn-TI-JeI"/>
|
||||
<constraint firstItem="hI6-1V-MUR" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="TDX-uI-H7Y"/>
|
||||
<constraint firstItem="zge-fr-Eo7" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="U2h-lQ-CVw"/>
|
||||
<constraint firstItem="RH0-xQ-zUi" firstAttribute="top" secondItem="hI6-1V-MUR" secondAttribute="bottom" constant="10" id="Xyg-xc-QO3"/>
|
||||
<constraint firstItem="IEh-tF-XpP" firstAttribute="top" secondItem="RH0-xQ-zUi" secondAttribute="bottom" constant="10" id="gak-Wd-ty2"/>
|
||||
<constraint firstItem="IEh-tF-XpP" firstAttribute="leading" secondItem="5fM-ca-UBK" secondAttribute="leading" id="nww-1h-oRH"/>
|
||||
<constraint firstAttribute="trailing" secondItem="erp-13-s4m" secondAttribute="trailing" id="shc-vX-eeD"/>
|
||||
<constraint firstAttribute="trailing" secondItem="zge-fr-Eo7" secondAttribute="trailing" id="vn4-mh-GIN"/>
|
||||
<constraint firstAttribute="bottom" secondItem="jzM-eu-OKw" secondAttribute="bottom" id="xHg-ht-8vd"/>
|
||||
<constraint firstAttribute="trailing" secondItem="RH0-xQ-zUi" secondAttribute="trailing" id="xbH-kE-W5r"/>
|
||||
<constraint firstAttribute="trailing" secondItem="5fM-ca-UBK" secondAttribute="trailing" id="FgH-U0-3Jj"/>
|
||||
<constraint firstItem="5fM-ca-UBK" firstAttribute="top" secondItem="WMk-dN-J34" secondAttribute="top" id="L5i-Iv-1Ti"/>
|
||||
<constraint firstItem="5fM-ca-UBK" firstAttribute="leading" secondItem="WMk-dN-J34" secondAttribute="leading" id="g1i-a3-Q43"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</stackView>
|
||||
</subviews>
|
||||
<viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
|
||||
<constraints>
|
||||
<constraint firstItem="5fM-ca-UBK" firstAttribute="trailing" secondItem="vDu-zF-Fre" secondAttribute="trailing" id="2Bi-iH-QlI"/>
|
||||
<constraint firstItem="jzM-eu-OKw" firstAttribute="leading" secondItem="WMk-dN-J34" secondAttribute="leading" id="55P-RC-j6r"/>
|
||||
<constraint firstItem="WMk-dN-J34" firstAttribute="leading" secondItem="vDu-zF-Fre" secondAttribute="leading" id="A1e-R2-ShV"/>
|
||||
<constraint firstItem="jzM-eu-OKw" firstAttribute="bottom" secondItem="WMk-dN-J34" secondAttribute="bottom" id="BGX-WH-oJv"/>
|
||||
<constraint firstItem="WMk-dN-J34" firstAttribute="top" secondItem="tru-CU-GHH" secondAttribute="bottom" constant="5" id="Hjg-vR-dHY"/>
|
||||
<constraint firstItem="ezz-dQ-HXQ" firstAttribute="leading" secondItem="vDu-zF-Fre" secondAttribute="leading" id="Kbz-3U-DoA"/>
|
||||
<constraint firstItem="5fM-ca-UBK" firstAttribute="top" secondItem="tru-CU-GHH" secondAttribute="bottom" constant="5" id="Ni3-dV-zLu"/>
|
||||
<constraint firstAttribute="trailing" secondItem="WMk-dN-J34" secondAttribute="trailing" id="Vb9-s1-Cff"/>
|
||||
<constraint firstAttribute="bottom" secondItem="ezz-dQ-HXQ" secondAttribute="bottom" id="YUf-EY-nOr"/>
|
||||
<constraint firstItem="jzM-eu-OKw" firstAttribute="top" secondItem="WMk-dN-J34" secondAttribute="top" id="ayN-LM-SJi"/>
|
||||
<constraint firstItem="ezz-dQ-HXQ" firstAttribute="top" secondItem="5EZ-qb-Rvc" secondAttribute="top" id="bP0-hF-9jU"/>
|
||||
<constraint firstItem="5fM-ca-UBK" firstAttribute="leading" secondItem="vDu-zF-Fre" secondAttribute="leading" id="coi-Hy-zVY"/>
|
||||
<constraint firstAttribute="bottom" secondItem="5fM-ca-UBK" secondAttribute="bottom" id="dGM-e4-c0F"/>
|
||||
<constraint firstAttribute="bottom" secondItem="WMk-dN-J34" secondAttribute="bottom" id="cHL-cD-Fge"/>
|
||||
<constraint firstItem="vDu-zF-Fre" firstAttribute="trailing" secondItem="tru-CU-GHH" secondAttribute="trailing" constant="5" id="k10-NI-GMP"/>
|
||||
<constraint firstItem="vDu-zF-Fre" firstAttribute="trailing" secondItem="ezz-dQ-HXQ" secondAttribute="trailing" id="rIn-7I-mUP"/>
|
||||
<constraint firstItem="jzM-eu-OKw" firstAttribute="trailing" secondItem="WMk-dN-J34" secondAttribute="trailing" id="zcH-Le-X3T"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
@@ -204,8 +211,5 @@
|
||||
<image name="PlayButton" width="42.666667938232422" height="42.666667938232422"/>
|
||||
<image name="speaker.wave.1.fill" catalog="system" width="128" height="104"/>
|
||||
<image name="speaker.wave.3.fill" catalog="system" width="128" height="84"/>
|
||||
<systemColor name="systemBackgroundColor">
|
||||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</systemColor>
|
||||
</resources>
|
||||
</document>
|
||||
|
||||
Reference in New Issue
Block a user