From 4b6d32854c845cd6db887de9c8e53beb9f2a324b Mon Sep 17 00:00:00 2001 From: Matt Neuburg Date: Thu, 1 Oct 2015 12:00:35 -0700 Subject: [PATCH] add example of UIActivityItemProvider and UIActivityItemSource; use built-in AVPlayer time observer instead of NSTimer --- .../project.pbxproj | 289 ++++++++++++++++++ .../ch26p901activityView/AppDelegate.swift | 12 + .../AppIcon.appiconset/Contents.json | 38 +++ .../LaunchImage.launchimage/Contents.json | 23 ++ .../Base.lproj/Main.storyboard | 44 +++ .../LaunchScreen.storyboard | 27 ++ .../ch26p901activityView/ViewController.swift | 71 +++++ .../ch26p901activityView-Info.plist | 49 +++ .../ch26p901activityView/sunglasses.png | Bin 0 -> 27931 bytes .../ViewController.swift | 25 +- 10 files changed, 567 insertions(+), 11 deletions(-) create mode 100644 bk2ch13p635activityView2/ch26p901activityView.xcodeproj/project.pbxproj create mode 100644 bk2ch13p635activityView2/ch26p901activityView/AppDelegate.swift create mode 100644 bk2ch13p635activityView2/ch26p901activityView/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 bk2ch13p635activityView2/ch26p901activityView/Assets.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 bk2ch13p635activityView2/ch26p901activityView/Base.lproj/Main.storyboard create mode 100644 bk2ch13p635activityView2/ch26p901activityView/LaunchScreen.storyboard create mode 100644 bk2ch13p635activityView2/ch26p901activityView/ViewController.swift create mode 100644 bk2ch13p635activityView2/ch26p901activityView/ch26p901activityView-Info.plist create mode 100644 bk2ch13p635activityView2/ch26p901activityView/sunglasses.png 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 0000000000000000000000000000000000000000..4b5c976aaa809505e85da0145d57c19a02046f89 GIT binary patch literal 27931 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 z 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 { @@ -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") } }