diff --git a/bk2ch13p635activityView2/ch26p901activityView.xcodeproj/project.pbxproj b/bk2ch13p635activityView2/ch26p901activityView.xcodeproj/project.pbxproj new file mode 100644 index 000000000..f11f5f0c1 --- /dev/null +++ b/bk2ch13p635activityView2/ch26p901activityView.xcodeproj/project.pbxproj @@ -0,0 +1,289 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 3217DF21199688DF001092A9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3217DF20199688DF001092A9 /* ViewController.swift */; }; + 3219EB3C1BB0F58E0037939C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3219EB3B1BB0F58E0037939C /* AppDelegate.swift */; settings = {ASSET_TAGS = (); }; }; + 3219EB3E1BB0F5B10037939C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3219EB3D1BB0F5B10037939C /* LaunchScreen.storyboard */; settings = {ASSET_TAGS = (); }; }; + C97D40F61822B36D002DFE75 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C97D40F41822B36D002DFE75 /* Main.storyboard */; }; + C97D40FB1822B36D002DFE75 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C97D40FA1822B36D002DFE75 /* Assets.xcassets */; }; + C97D41231822B626002DFE75 /* sunglasses.png in Resources */ = {isa = PBXBuildFile; fileRef = C97D41221822B626002DFE75 /* sunglasses.png */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 3217DF20199688DF001092A9 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 3219EB3B1BB0F58E0037939C /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 3219EB3D1BB0F5B10037939C /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + C97D40DF1822B36D002DFE75 /* ch26p901activityView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ch26p901activityView.app; sourceTree = BUILT_PRODUCTS_DIR; }; + C97D40EA1822B36D002DFE75 /* ch26p901activityView-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ch26p901activityView-Info.plist"; sourceTree = ""; }; + C97D40F51822B36D002DFE75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + C97D40FA1822B36D002DFE75 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + C97D41221822B626002DFE75 /* sunglasses.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sunglasses.png; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C97D40DC1822B36D002DFE75 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C97D40D61822B36D002DFE75 = { + isa = PBXGroup; + children = ( + C97D40E81822B36D002DFE75 /* ch26p901activityView */, + C97D40E01822B36D002DFE75 /* Products */, + ); + sourceTree = ""; + }; + C97D40E01822B36D002DFE75 /* Products */ = { + isa = PBXGroup; + children = ( + C97D40DF1822B36D002DFE75 /* ch26p901activityView.app */, + ); + name = Products; + sourceTree = ""; + }; + C97D40E81822B36D002DFE75 /* ch26p901activityView */ = { + isa = PBXGroup; + children = ( + 3219EB3B1BB0F58E0037939C /* AppDelegate.swift */, + C97D40F41822B36D002DFE75 /* Main.storyboard */, + 3217DF20199688DF001092A9 /* ViewController.swift */, + C97D41221822B626002DFE75 /* sunglasses.png */, + C97D40FA1822B36D002DFE75 /* Assets.xcassets */, + 3219EB3D1BB0F5B10037939C /* LaunchScreen.storyboard */, + C97D40EA1822B36D002DFE75 /* ch26p901activityView-Info.plist */, + ); + path = ch26p901activityView; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + C97D40DE1822B36D002DFE75 /* ch26p901activityView */ = { + isa = PBXNativeTarget; + buildConfigurationList = C97D41111822B36D002DFE75 /* Build configuration list for PBXNativeTarget "ch26p901activityView" */; + buildPhases = ( + C97D40DB1822B36D002DFE75 /* Sources */, + C97D40DC1822B36D002DFE75 /* Frameworks */, + C97D40DD1822B36D002DFE75 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ch26p901activityView; + productName = ch26p901activityView; + productReference = C97D40DF1822B36D002DFE75 /* ch26p901activityView.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C97D40D71822B36D002DFE75 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = "Matt Neuburg"; + }; + buildConfigurationList = C97D40DA1822B36D002DFE75 /* Build configuration list for PBXProject "ch26p901activityView" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = C97D40D61822B36D002DFE75; + productRefGroup = C97D40E01822B36D002DFE75 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C97D40DE1822B36D002DFE75 /* ch26p901activityView */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + C97D40DD1822B36D002DFE75 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C97D40FB1822B36D002DFE75 /* Assets.xcassets in Resources */, + C97D41231822B626002DFE75 /* sunglasses.png in Resources */, + 3219EB3E1BB0F5B10037939C /* LaunchScreen.storyboard in Resources */, + C97D40F61822B36D002DFE75 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C97D40DB1822B36D002DFE75 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3217DF21199688DF001092A9 /* ViewController.swift in Sources */, + 3219EB3C1BB0F58E0037939C /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + C97D40F41822B36D002DFE75 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + C97D40F51822B36D002DFE75 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C97D410F1822B36D002DFE75 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + C97D41101822B36D002DFE75 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C97D41121822B36D002DFE75 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD)"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ch26p901activityView/ch26p901activityView-Prefix.pch"; + INFOPLIST_FILE = "ch26p901activityView/ch26p901activityView-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + ONLY_ACTIVE_ARCH = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + C97D41131822B36D002DFE75 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD)"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ch26p901activityView/ch26p901activityView-Prefix.pch"; + INFOPLIST_FILE = "ch26p901activityView/ch26p901activityView-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + ONLY_ACTIVE_ARCH = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C97D40DA1822B36D002DFE75 /* Build configuration list for PBXProject "ch26p901activityView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C97D410F1822B36D002DFE75 /* Debug */, + C97D41101822B36D002DFE75 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C97D41111822B36D002DFE75 /* Build configuration list for PBXNativeTarget "ch26p901activityView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C97D41121822B36D002DFE75 /* Debug */, + C97D41131822B36D002DFE75 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C97D40D71822B36D002DFE75 /* Project object */; +} diff --git a/bk2ch13p635activityView2/ch26p901activityView/AppDelegate.swift b/bk2ch13p635activityView2/ch26p901activityView/AppDelegate.swift new file mode 100644 index 000000000..dea9f4769 --- /dev/null +++ b/bk2ch13p635activityView2/ch26p901activityView/AppDelegate.swift @@ -0,0 +1,12 @@ +import UIKit + +@UIApplicationMain +class AppDelegate : UIResponder, UIApplicationDelegate { + var window : UIWindow? + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + + return true + } +} + diff --git a/bk2ch13p635activityView2/ch26p901activityView/Assets.xcassets/AppIcon.appiconset/Contents.json b/bk2ch13p635activityView2/ch26p901activityView/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..118c98f74 --- /dev/null +++ b/bk2ch13p635activityView2/ch26p901activityView/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/bk2ch13p635activityView2/ch26p901activityView/Assets.xcassets/LaunchImage.launchimage/Contents.json b/bk2ch13p635activityView2/ch26p901activityView/Assets.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 000000000..c79ebd3ad --- /dev/null +++ b/bk2ch13p635activityView2/ch26p901activityView/Assets.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "subtype" : "retina4", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/bk2ch13p635activityView2/ch26p901activityView/Base.lproj/Main.storyboard b/bk2ch13p635activityView2/ch26p901activityView/Base.lproj/Main.storyboard new file mode 100644 index 000000000..525e09666 --- /dev/null +++ b/bk2ch13p635activityView2/ch26p901activityView/Base.lproj/Main.storyboard @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bk2ch13p635activityView2/ch26p901activityView/LaunchScreen.storyboard b/bk2ch13p635activityView2/ch26p901activityView/LaunchScreen.storyboard new file mode 100644 index 000000000..2069654d0 --- /dev/null +++ b/bk2ch13p635activityView2/ch26p901activityView/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bk2ch13p635activityView2/ch26p901activityView/ViewController.swift b/bk2ch13p635activityView2/ch26p901activityView/ViewController.swift new file mode 100644 index 000000000..bfc2e8a72 --- /dev/null +++ b/bk2ch13p635activityView2/ch26p901activityView/ViewController.swift @@ -0,0 +1,71 @@ + + +import UIKit + +class MyProvider : UIActivityItemProvider { + override func item() -> AnyObject { + // time-consuming operation goes here + return "Coolness" + } +} + +class ViewController: UIViewController { + @IBAction func doButton (sender:AnyObject) { + // supply `self` so we will be queried separately for the item + // let avc = UIActivityViewController(activityItems:[self], applicationActivities:nil) + // supply an item provider so it can supply the data lazily + let avc = UIActivityViewController(activityItems:[MyProvider(placeholderItem: "")], applicationActivities:nil) + + avc.completionWithItemsHandler = { + (s: String?, ok: Bool, items: [AnyObject]?, err:NSError?) -> Void in + print("completed \(s) \(ok) \(items) \(err)") + } + avc.excludedActivityTypes = [ + UIActivityTypePostToFacebook, + UIActivityTypePostToTwitter, + UIActivityTypePostToWeibo, + UIActivityTypeMessage, + // UIActivityTypeMail, + UIActivityTypePrint, + UIActivityTypeCopyToPasteboard, + UIActivityTypeAssignToContact, + UIActivityTypeSaveToCameraRoll, + UIActivityTypeAddToReadingList, + UIActivityTypePostToFlickr, + UIActivityTypePostToVimeo, + UIActivityTypePostToTencentWeibo, + UIActivityTypeAirDrop, + UIActivityTypeOpenInIBooks, + "com.apple.mobilenotes.SharingExtension" // nope, can't exclude a sharing extension + ] + // avc.excludedActivityTypes = nil + self.presentViewController(avc, animated:true, completion:nil) + // on iPad this will be an action sheet and will need a source view or bar button item + if let pop = avc.popoverPresentationController { + let v = sender as! UIView + pop.sourceView = v + pop.sourceRect = v.bounds + } + } +} + +extension ViewController : UIActivityItemSource { + func activityViewControllerPlaceholderItem( + activityViewController: UIActivityViewController) + -> AnyObject { + return "" + } + func activityViewController( + activityViewController: UIActivityViewController, + itemForActivityType activityType: String) + -> AnyObject? { + print(activityType) + return "Coolness" + } + func activityViewController( + activityViewController: UIActivityViewController, + subjectForActivityType activityType: String?) -> String { + return "This is cool" + } +} + diff --git a/bk2ch13p635activityView2/ch26p901activityView/ch26p901activityView-Info.plist b/bk2ch13p635activityView2/ch26p901activityView/ch26p901activityView-Info.plist new file mode 100644 index 000000000..9a86cbe53 --- /dev/null +++ b/bk2ch13p635activityView2/ch26p901activityView/ch26p901activityView-Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.neuburg.matt.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + + diff --git a/bk2ch13p635activityView2/ch26p901activityView/sunglasses.png b/bk2ch13p635activityView2/ch26p901activityView/sunglasses.png new file mode 100644 index 000000000..4b5c976aa Binary files /dev/null and b/bk2ch13p635activityView2/ch26p901activityView/sunglasses.png differ diff --git a/bk2ch16p687AVQueuePlayer/ch29p952AVQueuePlayer/ViewController.swift b/bk2ch16p687AVQueuePlayer/ch29p952AVQueuePlayer/ViewController.swift index 976dc9807..1b0bd5615 100644 --- a/bk2ch16p687AVQueuePlayer/ch29p952AVQueuePlayer/ViewController.swift +++ b/bk2ch16p687AVQueuePlayer/ch29p952AVQueuePlayer/ViewController.swift @@ -33,7 +33,7 @@ class ViewController: UIViewController { var avplayer : AVPlayer! var qp : AVQueuePlayer! var items = [AVPlayerItem]() - var timer : NSTimer! + var ob : AnyObject! @IBOutlet var prog : UIProgressView! @IBOutlet var label : UILabel! @@ -143,6 +143,10 @@ class ViewController: UIViewController { self.curnum = 0 self.total = self.items.count + if self.ob != nil && self.qp != nil { + self.qp.removeTimeObserver(self.ob) + } + let seed = min(3,self.items.count) self.qp = AVQueuePlayer(items:Array(self.items.prefixUpTo(seed))) self.items = Array(self.items.suffixFrom(seed)) @@ -154,9 +158,8 @@ class ViewController: UIViewController { UIApplication.sharedApplication().beginReceivingRemoteControlEvents() - self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "timerFired:", userInfo: nil, repeats: true) - self.timer.tolerance = 0.1 - self.timer.fire() + self.ob = self.qp.addPeriodicTimeObserverForInterval(CMTimeMakeWithSeconds(0.5, 600), queue: nil, usingBlock: self.timerFired) + } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<()>) { @@ -166,9 +169,6 @@ class ViewController: UIViewController { } func changed() { - defer { - self.timer?.fire() - } guard let item = self.qp.currentItem else {return} self.curnum++ var arr = item.asset.commonMetadata @@ -196,19 +196,22 @@ class ViewController: UIViewController { self.qp.insertItem(newItem, afterItem:nil) // means "at end" } - func timerFired(sender:AnyObject) { + func timerFired(time:CMTime) { if let item = self.qp.currentItem { let asset = item.asset if asset.statusOfValueForKey("duration", error: nil) == .Loaded { - let cur = self.qp.currentTime() let dur = asset.duration - self.prog.progress = Float(CMTimeGetSeconds(cur)/CMTimeGetSeconds(dur)) + self.prog.setProgress(Float(time.seconds/dur.seconds), animated: false) self.prog.hidden = false } } else { + // none of this is executed; I need a way of learning when we are completely done + // or else I can just forget this feature self.label.text = "" self.prog.hidden = true - self.timer.invalidate() + self.qp.removeTimeObserver(self.ob) + self.ob = nil + print("removing observer") } }