Browse Source

Swift 4.2

master
Marco Schmickler 7 years ago
parent
commit
651e6fb36b
  1. 32
      .idea/codeStyles/Project.xml
  2. 2
      .idea/xcode.xml
  3. 1
      Podfile
  4. 32
      kplayer.xcodeproj/project.pbxproj
  5. 12
      kplayer/AppDelegate.swift
  6. 12
      kplayer/core/MediaItem.swift
  7. 12
      kplayer/core/NetworkManager.swift
  8. 52
      kplayer/detail/AVPlayerController.swift
  9. 28
      kplayer/detail/DetailViewController.swift
  10. 2
      kplayer/detail/ItemCell.swift
  11. 46
      kplayer/detail/VideoPlayerController.swift
  12. 6
      kplayer/master/MasterViewController.swift
  13. 14
      kplayer/photo/MediaPhotoController.swift
  14. 4
      kplayer/util/LayoutTools.swift
  15. 4
      kplayer/util/NetData.swift
  16. 4
      kplayer/util/ViewControllerExtensions.swift

32
.idea/codeStyles/Project.xml

@ -1,32 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<Objective-C-extensions>
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="ClassPredef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Class" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
</class>
<extensions>
<pair source="mm" header="h" fileNamingConvention="NONE" />
<pair source="cpp" header="h" fileNamingConvention="NONE" />
<pair source="c" header="h" fileNamingConvention="NONE" />
</extensions>
</Objective-C-extensions>
</code_scheme>
</component>

2
.idea/xcode.xml

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="XcodeMetaData" PROJECT_FILE="$PROJECT_DIR$/kplayer.xcworkspace" />
<component name="XcodeMetaData" PROJECT_FILE="$PROJECT_DIR$/kplayer.xcworkspace" SHOW_WORKSPACE_NOTIFICATIONS="true" COCOAPODS_PROJECT_EXCLUDED="true" />
</project>

1
Podfile

@ -16,6 +16,7 @@ target 'kplayer' do
pod 'Nimbus/Photos'
pod 'Nimbus/PagingScrollView'
pod 'BMPlayer', '0.8.6'
pod 'WebBrowser'
#pod 'AFNetworking', '~>2.1'
#pod 'Dollar', '6.1.0'
#pod 'Cent', '6.0.3'

32
kplayer.xcodeproj/project.pbxproj

@ -13,7 +13,6 @@
1C73640D928DE56D35175D39 /* UploadOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736260E748CF136FF37EA7 /* UploadOperation.swift */; };
1C73646F87B495A47D7943C7 /* NetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7369EC16B19B32B515169E /* NetData.swift */; };
1C736503B656C999E5E12081 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7365B06FA66294E99AC2D3 /* NetworkManager.swift */; };
1C73651E1241702E5032A8A4 /* scratch.txt in Resources */ = {isa = PBXBuildFile; fileRef = 1C736E3BE8EC464D6F5DC8FA /* scratch.txt */; };
1C73654C9EA6D255CFC039C5 /* NetworkHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73620D01687FB4F1811C5C /* NetworkHelper.swift */; };
1C7365885FAF292F2221ED44 /* MediaPhotoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73673DC671535E3A049F54 /* MediaPhotoController.swift */; };
1C73675C34BE0990D44570BE /* ItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736253AB7A95EA41B605B7 /* ItemModel.swift */; };
@ -29,7 +28,6 @@
1C736D16E81BA1FB325200E0 /* HanekeFetchOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7360744ABACC3557D05760 /* HanekeFetchOperation.swift */; };
1C736D24891597F2728230EE /* ImageLoadOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7360A94DBECA685ED8602F /* ImageLoadOperation.swift */; };
1C736D24B49451141CD4B64D /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7369F53095B7A4D65679C2 /* DetailViewController.swift */; };
1C736E1B6330FC91332F204D /* scratch2.txt in Resources */ = {isa = PBXBuildFile; fileRef = 1C7362A332872013B9B04CBB /* scratch2.txt */; };
1C736F6A223D4ADB2E1BA733 /* ItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736069C214E9522BB1BD97 /* ItemCell.swift */; };
1C736FB92B19FE17E4357C85 /* MediaItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73688DAB88F9360FB62A49 /* MediaItem.swift */; };
AA74B07A01F0E99E6DEC7D1B /* Pods_kplayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B75159FFCD5A882E6F167FE /* Pods_kplayer.framework */; };
@ -60,7 +58,6 @@
1C73620D01687FB4F1811C5C /* NetworkHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkHelper.swift; sourceTree = "<group>"; };
1C736253AB7A95EA41B605B7 /* ItemModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemModel.swift; sourceTree = "<group>"; };
1C736260E748CF136FF37EA7 /* UploadOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UploadOperation.swift; sourceTree = "<group>"; };
1C7362A332872013B9B04CBB /* scratch2.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scratch2.txt; sourceTree = "<group>"; };
1C73648CEC974A2500172064 /* ViewControllerExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewControllerExtensions.swift; sourceTree = "<group>"; };
1C7365B06FA66294E99AC2D3 /* NetworkManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = "<group>"; };
1C7367379DEE94EBF3FAFA78 /* VideoPlayerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerController.swift; sourceTree = "<group>"; };
@ -75,7 +72,6 @@
1C736D981F8315FFD7D40695 /* KBMPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KBMPlayer.swift; sourceTree = "<group>"; };
1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderCell.swift; sourceTree = "<group>"; };
1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = "<group>"; };
1C736E3BE8EC464D6F5DC8FA /* scratch.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scratch.txt; sourceTree = "<group>"; };
1C736F9338CE36708244D42A /* DataLoadOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoadOperation.swift; sourceTree = "<group>"; };
6D522F61736592330F481B4F /* Pods-kplayer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-kplayer.debug.xcconfig"; path = "Pods/Target Support Files/Pods-kplayer/Pods-kplayer.debug.xcconfig"; sourceTree = "<group>"; };
8B75159FFCD5A882E6F167FE /* Pods_kplayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_kplayer.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@ -228,9 +224,7 @@
1C73615846EE8B07DAAFD230 /* detail */,
1C7364808E72BFA7575E75E1 /* master */,
1C7363B608460DED4F522D1C /* photo */,
1C736E3BE8EC464D6F5DC8FA /* scratch.txt */,
1C736F3946A38499113D351A /* video */,
1C7362A332872013B9B04CBB /* scratch2.txt */,
);
path = kplayer;
sourceTree = "<group>";
@ -308,18 +302,18 @@
attributes = {
LastSwiftMigration = 0700;
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0920;
LastUpgradeCheck = 0940;
ORGANIZATIONNAME = "Marco Schmickler";
TargetAttributes = {
C98AF5CE1B124D6A00D196CC = {
CreatedOnToolsVersion = 6.3.1;
DevelopmentTeam = G9J99WBBN9;
LastSwiftMigration = 0820;
LastSwiftMigration = 1000;
ProvisioningStyle = Automatic;
};
C98AF5E81B124D6A00D196CC = {
CreatedOnToolsVersion = 6.3.1;
LastSwiftMigration = 0820;
LastSwiftMigration = 1000;
TestTargetID = C98AF5CE1B124D6A00D196CC;
};
};
@ -352,8 +346,6 @@
C98AF5E41B124D6A00D196CC /* LaunchScreen.xib in Resources */,
C98AF5E11B124D6A00D196CC /* Images.xcassets in Resources */,
1C736A5FA5BA53B2597F2ED7 /* Kirschkeks-256x256.png in Resources */,
1C73651E1241702E5032A8A4 /* scratch.txt in Resources */,
1C736E1B6330FC91332F204D /* scratch2.txt in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -381,6 +373,7 @@
"${BUILT_PRODUCTS_DIR}/NVActivityIndicatorView/NVActivityIndicatorView.framework",
"${BUILT_PRODUCTS_DIR}/Nimbus/Nimbus.framework",
"${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework",
"${BUILT_PRODUCTS_DIR}/WebBrowser/WebBrowser.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
@ -391,6 +384,7 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NVActivityIndicatorView.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nimbus.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebBrowser.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
@ -498,12 +492,14 @@
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@ -552,12 +548,14 @@
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@ -602,7 +600,8 @@
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 3.0;
SWIFT_SWIFT3_OBJC_INFERENCE = On;
SWIFT_VERSION = 4.2;
};
name = Debug;
};
@ -621,7 +620,8 @@
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 3.0;
SWIFT_SWIFT3_OBJC_INFERENCE = On;
SWIFT_VERSION = 4.2;
};
name = Release;
};
@ -641,7 +641,8 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_SWIFT3_OBJC_INFERENCE = On;
SWIFT_VERSION = 4.2;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/kplayer.app/kplayer";
};
name = Debug;
@ -658,7 +659,8 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "schmickler.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_SWIFT3_OBJC_INFERENCE = On;
SWIFT_VERSION = 4.2;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/kplayer.app/kplayer";
};
name = Release;

12
kplayer/AppDelegate.swift

@ -15,7 +15,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
let splitViewController = self.window!.rootViewController as! UISplitViewController
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
@ -118,7 +118,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog("Unresolved error \(error), \(error!.userInfo)")
NSLog("Unresolved error \(String(describing: error)), \(error!.userInfo)")
abort()
} catch {
fatalError()
@ -133,7 +133,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext()
var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
@ -142,15 +142,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
func saveContext () {
if let moc = self.managedObjectContext {
var error: NSError? = nil
if moc.hasChanges {
do {
try moc.save()
} catch let error1 as NSError {
error = error1
} catch let error as NSError {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog("Unresolved error \(error), \(error!.userInfo)")
NSLog("Unresolved error \(error), \(error.userInfo)")
abort()
}
}

12
kplayer/core/MediaItem.swift

@ -121,7 +121,7 @@ class MediaItem: CustomDebugStringConvertible {
let len = "/srv/samba/ren".count
let rootPostfix = (root as NSString).substring(from: len)
let tpath = "/srv/samba/ren/thumb\(rootPostfix)/\(path)\(name)"
let enc = tpath.addingPercentEscapes(using: String.Encoding.isoLatin1)!
let enc = tpath.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
return enc + "/"
}
@ -130,7 +130,7 @@ class MediaItem: CustomDebugStringConvertible {
Absolute URL, unter der das Thumbnail des Items abgerufen werden kann.
*/
var thumbUrlAbsolute: String {
let enc = thumbUrl!.addingPercentEscapes(using: String.Encoding.isoLatin1)!
let enc = thumbUrl!.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
return NetworkManager.sharedInstance.baseurl + "/service/download" + enc
}
@ -140,7 +140,7 @@ class MediaItem: CustomDebugStringConvertible {
var imageUrlAbsolute: String {
var imageUrl = thumbUrl!.replacingOccurrences(of: "_thumb.", with: ".")
imageUrl = imageUrl.replacingOccurrences(of: "?preview=true", with: "")
imageUrl = imageUrl.addingPercentEscapes(using: String.Encoding.isoLatin1)!
imageUrl = imageUrl.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
return NetworkManager.sharedInstance.baseurl + "/service/download" + imageUrl
}
@ -162,8 +162,8 @@ class MediaItem: CustomDebugStringConvertible {
*/
var fullPath: String {
let fpath = "\(root)/\(path)/\(name)"
let enc = fpath.addingPercentEscapes(using: String.Encoding.isoLatin1)
return enc!
let enc = fpath.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
return enc
}
var debugDescription: String {
@ -173,7 +173,7 @@ class MediaItem: CustomDebugStringConvertible {
var encodedDir: String? {
let dir = "\(root)/\(path)"
return dir.addingPercentEscapes(using: String.Encoding.isoLatin1)
return dir.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)
}
func superRoot() -> MediaItem {

12
kplayer/core/NetworkManager.swift

@ -28,11 +28,11 @@ class NetworkManager {
var root = rootParam
if root.contains("*") {
root = rootParam[rootParam.startIndex..<rootParam.range(of: "*")!.lowerBound]
root = String(rootParam[rootParam.startIndex..<rootParam.range(of: "*")!.lowerBound])
}
if root.endsWith("/") {
root = root[root.startIndex..<root.index(before: root.endIndex)]
root = String(root[root.startIndex..<root.index(before: root.endIndex)])
}
let url1 = baseurl + "/service/listvideos" + rootParam
let len = root.count
@ -77,11 +77,11 @@ class NetworkManager {
var root = rootParam
if root.contains("*") {
root = rootParam[rootParam.startIndex..<rootParam.range(of: "*")!.lowerBound]
root = String(rootParam[rootParam.startIndex..<rootParam.range(of: "*")!.lowerBound])
}
if root.endsWith("/") {
root = root[root.startIndex..<root.index(before: root.endIndex)]
root = String(root[root.startIndex..<root.index(before: root.endIndex)])
}
let url1 = baseurl + "/service/listpicdirs" + rootParam
@ -320,12 +320,12 @@ class NetworkManager {
if hashes.contains(pt) {
print("contained")
} else {
if let id = c.image, let imageData = UIImageJPEGRepresentation(id, 1.0) {
if let id = c.image, let imageData = id.jpegData(compressionQuality: 1.0) {
let op = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageData, path: p)
self.operationQueue.addOperation(op)
let thumb = id.scaleToSize(15 * 16, height: 15 * 9)
if let imageDataT = UIImageJPEGRepresentation(thumb, 1.0) {
if let imageDataT = thumb.jpegData(compressionQuality: 1.0) {
c.image = thumb
let opT = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageDataT, path: pt)
self.operationQueue.addOperation(opT)

52
kplayer/detail/AVPlayerController.swift

@ -11,14 +11,14 @@ import AVFoundation
protocol ItemController {
func setCurrentItem(item: MediaItem)
func setCompletionHandler(handler: @escaping ((Void) -> Void))
func setCompletionHandler(handler: @escaping (() -> Void))
}
class AVPlayerController: UIViewController, ItemController {
var player = KBMPlayer()
var currentItem: MediaItem?
var completionHandler: ((Void) -> Void)?
var completionHandler: (() -> Void)?
var buttons = Dictionary<UIButton, MediaItem>()
@ -51,11 +51,11 @@ class AVPlayerController: UIViewController, ItemController {
navigationItem.rightBarButtonItems = [barbutton!]
backButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(AVPlayerController.back(_:)))
speedButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItemStyle.plain, target: self, action: #selector(AVPlayerController.speed(_:)))
zoomButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItemStyle.plain, target: self, action: #selector(AVPlayerController.zoom(_:)))
aspectButton = UIBarButtonItem(title:"1", style:UIBarButtonItemStyle.plain, target: self, action: #selector(AVPlayerController.aspect(_:)))
speedButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.speed(_:)))
zoomButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.zoom(_:)))
aspectButton = UIBarButtonItem(title:"1", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.aspect(_:)))
playButton = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(AVPlayerController.startstop(_:)))
reviewButton = UIBarButtonItem(title:"Edit ", style:UIBarButtonItemStyle.plain, target: self, action: #selector(AVPlayerController.doEdit(_:)))
reviewButton = UIBarButtonItem(title:"Edit ", style:UIBarButtonItem.Style.plain, target: self, action: #selector(AVPlayerController.doEdit(_:)))
navigationItem.leftBarButtonItems = [backButton!, speedButton!, playButton!, zoomButton!, aspectButton!, reviewButton!]
@ -83,11 +83,11 @@ class AVPlayerController: UIViewController, ItemController {
currentItem = item
}
func setCompletionHandler(handler: @escaping ((Void) -> Void)) {
func setCompletionHandler(handler: @escaping (() -> Void)) {
completionHandler = handler
}
func doEdit(_ sender: AnyObject) {
@objc func doEdit(_ sender: AnyObject) {
if (!allowEdit) {
return
}
@ -102,7 +102,7 @@ class AVPlayerController: UIViewController, ItemController {
}
}
func startstop(_ sender: AnyObject) {
@objc func startstop(_ sender: AnyObject) {
if player.isPlaying {
player.pause()
}
@ -124,7 +124,7 @@ class AVPlayerController: UIViewController, ItemController {
print("play")
}
func zoom(_ sender: AnyObject) {
@objc func zoom(_ sender: AnyObject) {
zoomOption += 1
if zoomOption >= zoomOptions.count {
zoomOption = 0
@ -138,7 +138,7 @@ print("play")
print("zoom \(zoom)")
}
func aspect(_ sender: AnyObject) {
@objc func aspect(_ sender: AnyObject) {
aspect += 1
if aspect > 3 {
aspect = 1
@ -161,7 +161,7 @@ print("play")
aspectButton!.title = "\(aspect)"
}
func speed(_ sender: AnyObject) {
@objc func speed(_ sender: AnyObject) {
speedOption += 1
if speedOption >= speedOptions.count {
speedOption = 0
@ -208,7 +208,7 @@ print("finish")
if newItem.image != nil {
let icon = newItem.image!.scaleToSize(66.0, height: 44.0)
button.setBackgroundImage(icon, for: UIControlState());
button.setBackgroundImage(icon, for: UIControl.State());
} else {
if newItem.thumbUrl != nil {
let URL = Foundation.URL(string: newItem.thumbUrlAbsolute)!
@ -216,7 +216,7 @@ print("finish")
Shared.imageCache.fetch(URL: URL).onSuccess {
i in
let icon = i.scaleToSize(66.0, height: 44.0)
button.setBackgroundImage(icon, for: UIControlState.normal);
button.setBackgroundImage(icon, for: UIControl.State.normal);
}
}
}
@ -231,7 +231,7 @@ print("finish")
buttons[button] = newItem
}
func thumbnailClicked(_ source: UIButton) {
@objc func thumbnailClicked(_ source: UIButton) {
player.seek(buttons[source]!.time!)
// moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
@ -239,7 +239,7 @@ print("finish")
// print("goto \(buttons[source]!.time!) is \(moviePlayer!.currentPlaybackTime)")
}
func update() {
@objc func update() {
reviewButton!.title = currentItem!.name
@ -291,28 +291,28 @@ print("finish")
moviePlayer.addGestureRecognizer(twoFingersTwoTapsGesture)
let sR = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight))
sR.direction = UISwipeGestureRecognizerDirection.right
sR.direction = UISwipeGestureRecognizer.Direction.right
sR.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR)
let sL = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft))
sL.direction = UISwipeGestureRecognizerDirection.left
sL.direction = UISwipeGestureRecognizer.Direction.left
sL.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sL)
let sR2 = UISwipeGestureRecognizer(target: self, action: #selector(swipeDown))
sR2.direction = UISwipeGestureRecognizerDirection.down
sR2.direction = UISwipeGestureRecognizer.Direction.down
sR2.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR2)
let sR3 = UISwipeGestureRecognizer(target: self, action: #selector(swipeUp))
sR3.direction = UISwipeGestureRecognizerDirection.up
sR3.direction = UISwipeGestureRecognizer.Direction.up
sR3.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR3)
}
func swipeUp() {
@objc func swipeUp() {
print("u")
print("Type: \(currentItem!.type) Count: \(currentItem!.children.count) Index: \(index) Current: \(currentItem!.index)")
@ -349,7 +349,7 @@ print("finish")
}
func swipeRight() {
@objc func swipeRight() {
// print("r")
// player.currentPlaybackRate = Float(0.0)
// player.currentPlaybackTime = player.currentPlaybackTime - 30.0
@ -362,7 +362,7 @@ print("finish")
}
func swipeDown() {
@objc func swipeDown() {
print("d")
if !edit {
var newIndex = currentItem!.index - 1
@ -390,7 +390,7 @@ print("finish")
}
func swipeLeft() {
@objc func swipeLeft() {
print("l")
// player.currentPlaybackRate = Float(0.0)
// player.currentPlaybackTime = player.currentPlaybackTime + 30.0
@ -408,7 +408,7 @@ print("finish")
print("resumePlay")
}
func captureThumbnail() {
@objc func captureThumbnail() {
if edit {
let asset = player.playerLayer!.playerItem!.asset
@ -441,7 +441,7 @@ print("finish")
newItem.parent = currentItem!
currentItem!.children.append(newItem)
print(newItem.time)
print(newItem.time!)
addItemButton(newItem)
}

28
kplayer/detail/DetailViewController.swift

@ -57,11 +57,11 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
collectionView.delegate = self
collectionView.register(ItemCell.self, forCellWithReuseIdentifier: "Cell")
collectionView.backgroundColor = UIColor.lightGray
collectionView.register(HeaderCell.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HeaderView");
collectionView.register(HeaderCell.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "HeaderView");
view.addSubview(collectionView)
view.autoresizesSubviews = true
collectionView.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
collectionView.autoresizingMask = [UIView.AutoresizingMask.flexibleWidth, UIView.AutoresizingMask.flexibleHeight]
// Do any additional setup after loading the view, typically from a nib.
collectionView.reloadData()
@ -81,16 +81,16 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
}
}
func vplayer() {
@objc func vplayer() {
videoplayer = !videoplayer
}
func favorites() {
@objc func favorites() {
showFavoritesOnly = !showFavoritesOnly
collectionView.reloadData()
}
func overview() {
@objc func overview() {
let pc = MediaPhotoController()
var i = [MediaItem]()
@ -114,7 +114,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
}
}
func refreshItems(_ notification: Notification) {
@objc func refreshItems(_ notification: Notification) {
if notification.object == nil {
if self.collectionView != nil {
@ -163,8 +163,8 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
}
}
func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
if (gestureRecognizer.state != UIGestureRecognizerState.ended) {
@objc func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
if (gestureRecognizer.state != UIGestureRecognizer.State.ended) {
return;
}
let p = gestureRecognizer.location(in: self.collectionView);
@ -243,7 +243,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
viewForSupplementaryElementOfKind kind: String,
at indexPath: IndexPath) -> UICollectionReusableView {
switch kind {
case UICollectionElementKindSectionHeader:
case UICollectionView.elementKindSectionHeader:
let headerView =
collectionView.dequeueReusableSupplementaryView(ofKind: kind,
withReuseIdentifier: "HeaderView",
@ -276,7 +276,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
showVideo()
}
else {
let len = items.root.characters.count
let len = items.root.count
let url = NetworkManager.sharedInstance.baseurl + "/service/listfiles" + items.fullPath
print(items)
@ -291,9 +291,9 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
for s in json as! [String] {
if s.lowercased().hasSuffix(".jpg") {
let l = s.characters.count
let l = s.count
let name = NSURL(fileURLWithPath: s).lastPathComponent!
var pathlen = l - len - name.characters.count
var pathlen = l - len - name.count
// if (pathlen > 1000) {
print(pathlen)
@ -307,8 +307,8 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
let path = (s as NSString).substring(with: NSMakeRange(len + 1, pathlen - 2))
let folderName = NSURL(fileURLWithPath: path).lastPathComponent!
let fl = path.characters.count
let pfl = fl - folderName.characters.count
let fl = path.count
let pfl = fl - folderName.count
print("\(folderName) \(pfl)")
let fpath = s.substringLeft(pfl)

2
kplayer/detail/ItemCell.swift

@ -23,7 +23,7 @@ class ItemCell: UICollectionViewCell {
super.init(frame: frame)
image = UIImageView(frame: frame)
image.contentMode = UIViewContentMode.scaleAspectFit
image.contentMode = UIView.ContentMode.scaleAspectFit
autolayout(["imag": image],
constraints:

46
kplayer/detail/VideoPlayerController.swift

@ -32,7 +32,7 @@ class VideoPlayerController: UIViewController, ItemController {
var allowEdit = true
var index = 0
func setCompletionHandler(handler: @escaping ((Void) -> Void)) {
func setCompletionHandler(handler: @escaping (() -> Void)) {
completionHandler = handler
}
@ -43,9 +43,9 @@ class VideoPlayerController: UIViewController, ItemController {
navigationItem.rightBarButtonItems = [barbutton!]
backButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(VideoPlayerController.back(_:)))
speedButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItemStyle.plain, target: self, action: #selector(VideoPlayerController.speed(_:)))
speedButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItem.Style.plain, target: self, action: #selector(VideoPlayerController.speed(_:)))
playButton = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(VideoPlayerController.startstop(_:)))
reviewButton = UIBarButtonItem(title:"Edit ", style:UIBarButtonItemStyle.plain, target: self, action: #selector(VideoPlayerController.doEdit(_:)))
reviewButton = UIBarButtonItem(title:"Edit ", style:UIBarButtonItem.Style.plain, target: self, action: #selector(VideoPlayerController.doEdit(_:)))
navigationItem.leftBarButtonItems = [backButton!, playButton!, speedButton!, reviewButton!]
@ -59,7 +59,7 @@ class VideoPlayerController: UIViewController, ItemController {
currentItem = item
}
func doEdit(_ sender: AnyObject) {
@objc func doEdit(_ sender: AnyObject) {
if (!allowEdit) {
return
}
@ -74,7 +74,7 @@ class VideoPlayerController: UIViewController, ItemController {
}
}
func startstop(_ sender: AnyObject) {
@objc func startstop(_ sender: AnyObject) {
if moviePlayer!.playbackState == MPMoviePlaybackState.playing {
moviePlayer!.pause()
}
@ -90,7 +90,7 @@ class VideoPlayerController: UIViewController, ItemController {
print("play")
}
func speed(_ sender: AnyObject) {
@objc func speed(_ sender: AnyObject) {
speedOption += 1
if speedOption >= speedOptions.count {
speedOption = 0
@ -137,12 +137,12 @@ print("play")
}
}
func playerItemDidReachEnd(_ note: Notification) {
@objc func playerItemDidReachEnd(_ note: Notification) {
print("finish")
// Timer.scheduledTimer(timeInterval: 0.6, target: self, selector: #selector(update), userInfo: nil, repeats: false)
}
func showThumbnail(_ note: Notification) {
@objc func showThumbnail(_ note: Notification) {
let userInfo = note.userInfo! as NSDictionary
let thumbnail = userInfo.object(forKey: MPMoviePlayerThumbnailImageKey) as! UIImage
let time = userInfo.object(forKey: MPMoviePlayerThumbnailTimeKey) as! TimeInterval
@ -168,7 +168,7 @@ print("finish")
if newItem.image != nil {
let icon = newItem.image!.scaleToSize(66.0, height: 44.0)
button.setBackgroundImage(icon, for: UIControlState());
button.setBackgroundImage(icon, for: UIControl.State());
} else {
if newItem.thumbUrl != nil {
let URL = Foundation.URL(string: newItem.thumbUrlAbsolute)!
@ -176,7 +176,7 @@ print("finish")
Shared.imageCache.fetch(URL: URL).onSuccess {
i in
let icon = i.scaleToSize(66.0, height: 44.0)
button.setBackgroundImage(icon, for: UIControlState.normal);
button.setBackgroundImage(icon, for: UIControl.State.normal);
}
}
}
@ -191,7 +191,7 @@ print("finish")
buttons[button] = newItem
}
func thumbnailClicked(_ source: UIButton) {
@objc func thumbnailClicked(_ source: UIButton) {
moviePlayer!.currentPlaybackTime = buttons[source]!.time!
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
@ -199,7 +199,7 @@ print("finish")
print("goto \(buttons[source]!.time!) is \(moviePlayer!.currentPlaybackTime)")
}
func update() {
@objc func update() {
if let player = self.moviePlayer {
// if !(player.duration > 0.0) {
@ -233,7 +233,7 @@ print("finish")
}
}
func enteredFullscreen() {
@objc func enteredFullscreen() {
let mp = UIApplication.shared.keyWindow;
if let moviePlayerContainer = mp!.recursiveSearchForViewWithName("MPVideoContainerView") {
if (moviePlayerContainer.gestureRecognizers != nil) {
@ -243,7 +243,7 @@ print("finish")
}
}
func exitedFullscreen() {
@objc func exitedFullscreen() {
moviePlayer!.view.removeFromSuperview();
moviePlayer = nil;
NotificationCenter.default.removeObserver(self);
@ -257,28 +257,28 @@ print("finish")
moviePlayer.addGestureRecognizer(twoFingersTwoTapsGesture)
let sR = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight))
sR.direction = UISwipeGestureRecognizerDirection.right
sR.direction = UISwipeGestureRecognizer.Direction.right
sR.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR)
let sL = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft))
sL.direction = UISwipeGestureRecognizerDirection.left
sL.direction = UISwipeGestureRecognizer.Direction.left
sL.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sL)
let sR2 = UISwipeGestureRecognizer(target: self, action: #selector(swipeDown))
sR2.direction = UISwipeGestureRecognizerDirection.down
sR2.direction = UISwipeGestureRecognizer.Direction.down
sR2.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR2)
let sR3 = UISwipeGestureRecognizer(target: self, action: #selector(swipeUp))
sR3.direction = UISwipeGestureRecognizerDirection.up
sR3.direction = UISwipeGestureRecognizer.Direction.up
sR3.numberOfTouchesRequired = 1
moviePlayer.addGestureRecognizer(sR3)
}
func swipeUp() {
@objc func swipeUp() {
print("u")
if let player = self.moviePlayer {
print("Type: \(currentItem!.type) Count: \(currentItem!.children.count) Index: \(index) Current: \(currentItem!.index)")
@ -317,7 +317,7 @@ print("finish")
}
}
func swipeRight() {
@objc func swipeRight() {
print("r")
if let player = self.moviePlayer {
moviePlayer!.currentPlaybackRate = Float(0.0)
@ -331,7 +331,7 @@ print("finish")
}
}
func swipeDown() {
@objc func swipeDown() {
print("d")
if let player = self.moviePlayer {
@ -361,7 +361,7 @@ print("finish")
}
}
func swipeLeft() {
@objc func swipeLeft() {
print("l")
if let player = self.moviePlayer {
moviePlayer!.currentPlaybackRate = Float(0.0)
@ -380,7 +380,7 @@ print("finish")
print("resumePlay")
}
func twoFingersTwoTaps() {
@objc func twoFingersTwoTaps() {
if edit {
thumbnailTime = moviePlayer!.currentPlaybackTime
print("tap \(thumbnailTime)")

6
kplayer/master/MasterViewController.swift

@ -44,7 +44,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
if str.hasSuffix("*") {
let txt = str[str.startIndex ..< str.index(str.endIndex, offsetBy: -1)]
if let p = model.items[0].parent {
let neu = MediaItem(name: txt, path: p.path + "*" + txt, root: p.root, type: ItemType.DETAILS)
let neu = MediaItem(name: String(txt), path: p.path + "*" + txt, root: p.root, type: ItemType.DETAILS)
model.items.append(neu)
neu.parent = p
self.tableView.reloadData()
@ -281,7 +281,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
return false
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
}
}
@ -294,7 +294,7 @@ class MasterViewController: UITableViewController, UISearchResultsUpdating {
cell.textLabel!.text = object.path
}
cell.accessoryType = UITableViewCellAccessoryType.none
cell.accessoryType = UITableViewCell.AccessoryType.none
}
}

14
kplayer/photo/MediaPhotoController.swift

@ -150,7 +150,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
preview += "\(tu);"
}
preview = preview.addingPercentEscapes(using: String.Encoding.isoLatin1)!
preview = preview.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
let u2 = "\(NetworkManager.sharedInstance.baseurl)/service/preload?preview=\(preview)"
let u3 = URL(string: u2)
@ -182,7 +182,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
super.didReceiveMemoryWarning()
}
func shot() {
@objc func shot() {
let currentItem = items[photoAlbumView.centerPageIndex]
var imageUrl = currentItem.thumbUrl!.replacingOccurrences(of: "_thumb.jpg", with: ".jpg")
imageUrl = imageUrl.replacingOccurrences(of: "?preview=true", with: "")
@ -195,7 +195,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
}
}
func back() {
@objc func back() {
imageCache.removeAllObjects()
operationQueue.cancelAllOperations()
@ -206,7 +206,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
completionHandler!()
}
func slideShow() {
@objc func slideShow() {
slide += 1
if (slide > 2) {
slide = 0
@ -217,7 +217,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
}
}
func showItem() {
@objc func showItem() {
var nextItem = photoAlbumView.centerPageIndex + 1
if (nextItem >= (items).count) {
@ -234,7 +234,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
}
}
func play() {
@objc func play() {
let currentItem = items[photoAlbumView.centerPageIndex]
if (currentItem.type == ItemType.PICS) {
@ -429,7 +429,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
* You should always try to reuse pages by calling dequeueReusablePageWithIdentifier: on the
* paging scroll view before allocating a new page.
*/
func pagingScrollView(_ pagingScrollView: NIPagingScrollView, pageViewFor pageViewForIndex: Int) -> UIView {
func pagingScrollView(_ pagingScrollView: NIPagingScrollView, pageViewFor pageViewForIndex: Int) -> (UIView & NIPagingScrollViewPageProtocol)! {
let view = photoAlbumView.pagingScrollView(pagingScrollView, pageViewFor: pageViewForIndex) as! NIPhotoScrollView
view.maximumScale = 3;

4
kplayer/util/LayoutTools.swift

@ -27,13 +27,13 @@ public extension UIView {
if index + 1 < constraints.count && !(constraints[index + 1] is String) {
index += 1
let constr: NSArray = NSLayoutConstraint.constraints(withVisualFormat: c as! String,
options: constraints[index] as! NSLayoutFormatOptions,
options: constraints[index] as! NSLayoutConstraint.FormatOptions,
metrics: nil,
views: views) as NSArray
addConstraints(constr as! [NSLayoutConstraint])
} else {
let constr: NSArray = NSLayoutConstraint.constraints(withVisualFormat: c as! String,
options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) as NSArray
options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: views) as NSArray
addConstraints(constr as! [NSLayoutConstraint])
}
}

4
kplayer/util/NetData.swift

@ -42,12 +42,12 @@ class NetData
self.filename = filename
}
init(pngImage: UIImage, filename: String) {
data = UIImagePNGRepresentation(pngImage)!
data = pngImage.pngData()!
self.mimeType = MimeType.ImagePng
self.filename = filename
}
init(jpegImage: UIImage, compressionQuanlity: CGFloat, filename: String) {
data = UIImageJPEGRepresentation(jpegImage, compressionQuanlity)!
data = jpegImage.jpegData(compressionQuality: compressionQuanlity)!
self.mimeType = MimeType.ImageJpeg
self.filename = filename
}

4
kplayer/util/ViewControllerExtensions.swift

@ -30,7 +30,7 @@ public extension UIViewController {
}
func findChildController<T>(_ my: T.Type) -> T? {
for child in childViewControllers {
for child in children {
if let result = child as? T {
// (XXX)
return result
@ -59,7 +59,7 @@ public extension UIViewController {
func embedChildViewController(_ vc: UIViewController, inView: UIView) {
vc.view.frame = inView.bounds;
addChildViewController(vc);
addChild(vc);
inView.removeAllSubViews();
inView.addSubview(vc.view);
}

Loading…
Cancel
Save