Compare commits

...
48 Commits
Author SHA1 Message Date
Florian Gabach aa41530d47 4.1.1 release 2020-01-29 15:59:50 +01:00
Florian Gabach 1ac46a4859 Changelog 2020-01-29 15:59:22 +01:00
Florian Gabach 2c02475a49 Bump swift version & fix build 2020-01-29 15:59:01 +01:00
Florian Gabach 752558b420 4.1.0 release 2020-01-29 15:52:39 +01:00
Florian Gabach 1af6fa81f0 SwiftUI readme exemple 2020-01-29 15:51:46 +01:00
Florian Gabach 37c07f099a Prepare v4.1.0 2020-01-29 15:49:51 +01:00
Florian Gabach 612bb4ca11 Merge pull request #5 from SambaTV/master
SwiftUI support
2020-01-29 15:46:20 +01:00
Doron Katz e6fcda22fc Added SwiftUI support 2020-01-28 10:39:04 -08:00
Doron Katz f9282dcef2 Made init for struct public accessible 2020-01-28 10:21:38 -08:00
Doron Katz 8e47206f83 Made classes open instead of public, to access via SwiftUI 2020-01-28 10:21:17 -08:00
Florian Gabach aca50feac8 4.0.2 release 2019-11-22 17:55:05 +01:00
Florian Gabach bdc6b5b6dd Fix typo 2019-11-22 17:52:29 +01:00
Florian Gabach 846edcd8c1 Trigger scan on every push 2019-11-22 17:51:13 +01:00
Florian Gabach e9192698e9 Fix lane's name 2019-11-22 17:46:47 +01:00
Florian Gabach 226b1e3219 Fix build & Actions workflow 2019-11-22 17:43:59 +01:00
Florian Gabach 0f4a0dc5ad Add Github Action config file 2019-11-22 17:10:39 +01:00
Florian Gabach 7eb1e95fd6 README Cleanup 2019-11-21 17:20:39 +01:00
Florian Gabach b38c71af0b Changelog 2019-11-11 17:28:17 +01:00
Florian Gabach 4a34866bfc 4.0.1 release 2019-11-11 17:25:02 +01:00
Florian Gabach dca1bd740d Fix SMP file 2019-11-11 17:19:43 +01:00
Florian Gabach 73adcdcdad 4.0.0 release 2019-11-11 17:13:53 +01:00
Florian Gabach e75d19aac6 6.0.0 release 2019-11-11 17:12:27 +01:00
Florian Gabach 7a1565d631 5.0.0 release 2019-11-11 17:10:27 +01:00
Florian Gabach 15bdd515e7 4.0.0 release 2019-11-11 17:06:38 +01:00
Florian Gabach cc51d8fa12 Dark mode & layout fix 2019-11-11 16:56:30 +01:00
Florian Gabach fcc1b6f893 SPM Support 2019-11-11 16:52:36 +01:00
Florian Gabach 2d989f3791 Bump changelog 2019-09-30 17:16:58 +02:00
Florian Gabach f5d6b49efe 3.2.1 release 2019-09-30 17:13:39 +02:00
Florian Gabach 81d14e0abf Remove swift-version file 2019-09-30 17:13:09 +02:00
Florian Gabach 443b32f5fe Bump to Swift 5.0 2019-09-30 17:12:28 +02:00
Florian Gabach 27ed32b7e1 Fix fastfile variable 2018-12-10 19:49:16 +01:00
Florian Gabach 5da43391f5 3.2.0 release 2018-12-10 19:47:31 +01:00
Florian Gabach ee9f7efe68 Update fastlane file 2018-12-10 19:46:24 +01:00
Florian Gabach 0dbf658de9 Small code refactoring 2018-12-10 17:22:28 +01:00
Florian Gabach 016099a7c3 Add fastlane automation 2018-12-10 17:22:05 +01:00
Florian Gabach db3f5b2062 Improve exemple project 2018-12-10 17:21:54 +01:00
Florian Gabach 24c47fbcab Folder organisation 2018-10-29 11:52:43 +01:00
Florian Gabach 11f73c553a Clean & fix background color 2018-10-29 11:51:56 +01:00
Florian Gabach a778f03d8f Code refactoring 2018-10-24 18:44:12 +02:00
Florian Gabach 7dd51b88b8 Bump Swift version 2018-09-29 09:52:32 +02:00
Florian Gabach fe086e3d34 Bump to 3.0.0 2018-09-29 09:48:07 +02:00
Florian Gabach c5947fa41b Swift 4.2 2018-09-29 09:47:21 +02:00
Florian Gabach 8ad819052c Bump to 2.1.2 2018-02-26 14:30:51 +01:00
Florian Gabach 318d3e1f8e Use DispatchGroup for download licences 2018-02-26 14:22:37 +01:00
Florian Gabach a7a6a1b315 Clean 2018-02-22 17:12:06 +01:00
Florian Gabach 96a45035a9 Update README.md 2017-12-26 14:15:15 +01:00
Florian Gabach 003ca5c285 Add framework.zip 2017-12-10 15:22:27 +01:00
Florian Gabach bc2e69440c Bump to 2.1.1 2017-12-10 15:18:17 +01:00
93 changed files with 1274 additions and 1971 deletions
+15
View File
@@ -0,0 +1,15 @@
name: Build
on: [push]
jobs:
build:
runs-on: macOS-latest
steps:
- uses: actions/checkout@v1
- name: Fastlane Action
uses: maierj/fastlane-action@v1.0.0
with:
lane: scan_project
+1
View File
@@ -40,4 +40,5 @@ Carthage/
# Cocoapods # Cocoapods
Pods/ Pods/
fastlane/report.xml
-1
View File
@@ -1 +0,0 @@
4.0
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
+56
View File
@@ -1,5 +1,61 @@
Changelog Changelog
========== ==========
### 4.1.1
- Fix build
### 4.1.0
- Add SwiftUI support (thanks to doronkatz)
### 4.0.2
- Fix pod release
- Add Github workflow
### 4.0.1
- Fix SPM
### 4.0.0
- Swift 5.1
- Add Catalyst support
- Add SPM support
- Dark mode fix for background
- Layout fix for child controller and autolayout extension
### 3.2.1
- Swift 5
- Remove swift-version file
### 3.2.0
- Small refactoring
- Add fastlane for pods release
### 3.1.1
- Fix background color
### 3.1.0
- Code cleanup
### 3.0.0
- Swift 4.2
### 2.1.2
- Use DispatchGroup for download
### 2.1.1
- Hide close button when push the controller
### 2.1.0 ### 2.1.0
- Add push transition with `pushOpenSourceController(from: self)` - Add push transition with `pushOpenSourceController(from: self)`
+1
View File
@@ -6,4 +6,5 @@ Contributors to the codebase :
| Name | Github handle | Mail | | Name | Github handle | Mail |
| ------------- |------------- | ----- | | ------------- |------------- | ----- |
| David Lari | DavidLari | / | | David Lari | DavidLari | / |
| Doron Katz | | David Lari | DavidLari | / |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.com.OpenSourceController.OpenSourceController-iOS</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
@@ -1,234 +0,0 @@
// Generated by Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgcc-compat"
#if !defined(__has_include)
# define __has_include(x) 0
#endif
#if !defined(__has_attribute)
# define __has_attribute(x) 0
#endif
#if !defined(__has_feature)
# define __has_feature(x) 0
#endif
#if !defined(__has_warning)
# define __has_warning(x) 0
#endif
#if __has_attribute(external_source_symbol)
# define SWIFT_STRINGIFY(str) #str
# define SWIFT_MODULE_NAMESPACE_PUSH(module_name) _Pragma(SWIFT_STRINGIFY(clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in=module_name, generated_declaration))), apply_to=any(function, enum, objc_interface, objc_category, objc_protocol))))
# define SWIFT_MODULE_NAMESPACE_POP _Pragma("clang attribute pop")
#else
# define SWIFT_MODULE_NAMESPACE_PUSH(module_name)
# define SWIFT_MODULE_NAMESPACE_POP
#endif
#if __has_include(<swift/objc-prologue.h>)
# include <swift/objc-prologue.h>
#endif
#pragma clang diagnostic ignored "-Wauto-import"
#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#if !defined(SWIFT_TYPEDEFS)
# define SWIFT_TYPEDEFS 1
# if __has_include(<uchar.h>)
# include <uchar.h>
# elif !defined(__cplusplus) || __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
# endif
typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif
#if !defined(SWIFT_CLASS_PROPERTY)
# if __has_feature(objc_class_property)
# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
# else
# define SWIFT_CLASS_PROPERTY(...)
# endif
#endif
#if __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if __has_attribute(swift_name)
# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
#else
# define SWIFT_COMPILE_NAME(X)
#endif
#if __has_attribute(objc_method_family)
# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
#else
# define SWIFT_METHOD_FAMILY(X)
#endif
#if __has_attribute(noescape)
# define SWIFT_NOESCAPE __attribute__((noescape))
#else
# define SWIFT_NOESCAPE
#endif
#if __has_attribute(warn_unused_result)
# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
# define SWIFT_WARN_UNUSED_RESULT
#endif
#if __has_attribute(noreturn)
# define SWIFT_NORETURN __attribute__((noreturn))
#else
# define SWIFT_NORETURN
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_ENUM_EXTRA)
# define SWIFT_ENUM_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if __has_attribute(objc_subclassing_restricted)
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# else
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif
#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif
#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if __has_attribute(objc_designated_initializer)
# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
# define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#if !defined(SWIFT_ENUM_ATTR)
# if defined(__has_attribute) && __has_attribute(enum_extensibility)
# define SWIFT_ENUM_ATTR __attribute__((enum_extensibility(open)))
# else
# define SWIFT_ENUM_ATTR
# endif
#endif
#if !defined(SWIFT_ENUM)
# define SWIFT_ENUM(_type, _name) enum _name : _type _name; enum SWIFT_ENUM_ATTR SWIFT_ENUM_EXTRA _name : _type
# if __has_feature(generalized_swift_name)
# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR SWIFT_ENUM_EXTRA _name : _type
# else
# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) SWIFT_ENUM(_type, _name)
# endif
#endif
#if !defined(SWIFT_UNAVAILABLE)
# define SWIFT_UNAVAILABLE __attribute__((unavailable))
#endif
#if !defined(SWIFT_UNAVAILABLE_MSG)
# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
#endif
#if !defined(SWIFT_AVAILABILITY)
# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
#endif
#if !defined(SWIFT_DEPRECATED)
# define SWIFT_DEPRECATED __attribute__((deprecated))
#endif
#if !defined(SWIFT_DEPRECATED_MSG)
# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
#endif
#if __has_feature(attribute_diagnose_if_objc)
# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
#else
# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
#endif
#if __has_feature(modules)
@import ObjectiveC;
@import UIKit;
@import Foundation;
@import CoreGraphics;
#endif
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#pragma clang diagnostic ignored "-Wduplicate-method-arg"
#if __has_warning("-Wpragma-clang-attribute")
# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
#endif
#pragma clang diagnostic ignored "-Wunknown-pragmas"
#pragma clang diagnostic ignored "-Wnullability"
SWIFT_MODULE_NAMESPACE_PUSH("OpenSourceController")
SWIFT_CLASS("_TtC20OpenSourceController17LicenceDownloader")
@interface LicenceDownloader : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
SWIFT_CLASS("_TtC20OpenSourceController11LicenceFile")
@interface LicenceFile : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
@end
SWIFT_CLASS("_TtC20OpenSourceController20OpenSourceController")
@interface OpenSourceController : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
@class NSCoder;
SWIFT_CLASS("_TtC20OpenSourceController23OpenSourceTableViewCell")
@interface OpenSourceTableViewCell : UITableViewCell
- (nonnull instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString * _Nullable)reuseIdentifier OBJC_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER;
- (void)setSelected:(BOOL)selected animated:(BOOL)animated;
- (void)layoutSubviews;
@end
@class UITableView;
@class NSBundle;
SWIFT_CLASS("_TtC20OpenSourceController24OpenSourceViewController")
@interface OpenSourceViewController : UITableViewController
- (void)viewDidLoad;
- (NSInteger)numberOfSectionsInTableView:(UITableView * _Nonnull)tableView SWIFT_WARN_UNUSED_RESULT;
- (NSInteger)tableView:(UITableView * _Nonnull)tableView numberOfRowsInSection:(NSInteger)section SWIFT_WARN_UNUSED_RESULT;
- (UITableViewCell * _Nonnull)tableView:(UITableView * _Nonnull)tableView cellForRowAtIndexPath:(NSIndexPath * _Nonnull)indexPath SWIFT_WARN_UNUSED_RESULT;
- (CGFloat)tableView:(UITableView * _Nonnull)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath * _Nonnull)indexPath SWIFT_WARN_UNUSED_RESULT;
- (nonnull instancetype)initWithStyle:(UITableViewStyle)style OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil OBJC_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER;
@end
SWIFT_MODULE_NAMESPACE_POP
#pragma clang diagnostic pop
Binary file not shown.
@@ -1,4 +0,0 @@
framework module OpenSourceController {
header "OpenSourceController-Swift.h"
requires objc
}
Binary file not shown.
@@ -7,21 +7,49 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
7622F02C23796B67001B4F5D /* CHANGELOG.md in Resources */ = {isa = PBXBuildFile; fileRef = 7622F02B23796B67001B4F5D /* CHANGELOG.md */; };
7622F02E2379B559001B4F5D /* Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7622F02D2379B559001B4F5D /* Style.swift */; };
7627B06221807C4B0057FFBB /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 7627B06121807C4B0057FFBB /* README.md */; };
76D7F28121BEB3A0004B74CB /* OpenSourceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F26F21BEB3A0004B74CB /* OpenSourceController.swift */; };
76D7F28221BEB3A0004B74CB /* OpenSourceControllerConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27021BEB3A0004B74CB /* OpenSourceControllerConfig.swift */; };
76D7F28321BEB3A0004B74CB /* Array+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27221BEB3A0004B74CB /* Array+Extensions.swift */; };
76D7F28421BEB3A0004B74CB /* UIViewController+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27321BEB3A0004B74CB /* UIViewController+Extensions.swift */; };
76D7F28521BEB3A0004B74CB /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27421BEB3A0004B74CB /* UIView+Extensions.swift */; };
76D7F28621BEB3A0004B74CB /* Reusable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27521BEB3A0004B74CB /* Reusable.swift */; };
76D7F28721BEB3A0004B74CB /* UITableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27621BEB3A0004B74CB /* UITableView+Extensions.swift */; };
76D7F28821BEB3A0004B74CB /* OpenSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27821BEB3A0004B74CB /* OpenSourceViewController.swift */; };
76D7F28921BEB3A0004B74CB /* LicenceListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27921BEB3A0004B74CB /* LicenceListViewController.swift */; };
76D7F28A21BEB3A0004B74CB /* OpenSourceTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27A21BEB3A0004B74CB /* OpenSourceTableViewCell.swift */; };
76D7F28B21BEB3A0004B74CB /* LoadingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27B21BEB3A0004B74CB /* LoadingViewController.swift */; };
76D7F28C21BEB3A0004B74CB /* HTTPDataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27D21BEB3A0004B74CB /* HTTPDataLoader.swift */; };
76D7F28D21BEB3A0004B74CB /* LicenceFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F27F21BEB3A0004B74CB /* LicenceFile.swift */; };
76D7F28E21BEB3A0004B74CB /* LicenceLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F28021BEB3A0004B74CB /* LicenceLoader.swift */; };
76EAA8651E93F2CC009A41DA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8641E93F2CC009A41DA /* AppDelegate.swift */; }; 76EAA8651E93F2CC009A41DA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8641E93F2CC009A41DA /* AppDelegate.swift */; };
76EAA8671E93F2CC009A41DA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8661E93F2CC009A41DA /* ViewController.swift */; }; 76EAA8671E93F2CC009A41DA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8661E93F2CC009A41DA /* ViewController.swift */; };
76EAA86A1E93F2CC009A41DA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 76EAA8681E93F2CC009A41DA /* Main.storyboard */; }; 76EAA86A1E93F2CC009A41DA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 76EAA8681E93F2CC009A41DA /* Main.storyboard */; };
76EAA86C1E93F2CC009A41DA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EAA86B1E93F2CC009A41DA /* Assets.xcassets */; }; 76EAA86C1E93F2CC009A41DA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 76EAA86B1E93F2CC009A41DA /* Assets.xcassets */; };
76EAA86F1E93F2CC009A41DA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 76EAA86D1E93F2CC009A41DA /* LaunchScreen.storyboard */; }; 76EAA86F1E93F2CC009A41DA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 76EAA86D1E93F2CC009A41DA /* LaunchScreen.storyboard */; };
76EAA8881E93F666009A41DA /* OpenSourceTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8871E93F666009A41DA /* OpenSourceTableViewCell.swift */; };
76EAA88D1E93F675009A41DA /* LicenceDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA88A1E93F675009A41DA /* LicenceDownloader.swift */; };
76EAA88E1E93F675009A41DA /* LicenceFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA88B1E93F675009A41DA /* LicenceFile.swift */; };
76EAA88F1E93F675009A41DA /* OpenSourceControllerConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA88C1E93F675009A41DA /* OpenSourceControllerConfig.swift */; };
76EAA8911E93F67B009A41DA /* Array+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8901E93F67B009A41DA /* Array+Extensions.swift */; };
76EAA8941E93F681009A41DA /* OpenSourceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8921E93F681009A41DA /* OpenSourceController.swift */; };
76EAA8951E93F681009A41DA /* OpenSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8931E93F681009A41DA /* OpenSourceViewController.swift */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
7622F02A23796A81001B4F5D /* OpenSourceControllerDemo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OpenSourceControllerDemo.entitlements; sourceTree = "<group>"; };
7622F02B23796B67001B4F5D /* CHANGELOG.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = CHANGELOG.md; path = ../CHANGELOG.md; sourceTree = "<group>"; };
7622F02D2379B559001B4F5D /* Style.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Style.swift; sourceTree = "<group>"; };
7627B06121807C4B0057FFBB /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
76D7F26F21BEB3A0004B74CB /* OpenSourceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenSourceController.swift; sourceTree = "<group>"; };
76D7F27021BEB3A0004B74CB /* OpenSourceControllerConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenSourceControllerConfig.swift; sourceTree = "<group>"; };
76D7F27221BEB3A0004B74CB /* Array+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Extensions.swift"; sourceTree = "<group>"; };
76D7F27321BEB3A0004B74CB /* UIViewController+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Extensions.swift"; sourceTree = "<group>"; };
76D7F27421BEB3A0004B74CB /* UIView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Extensions.swift"; sourceTree = "<group>"; };
76D7F27521BEB3A0004B74CB /* Reusable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Reusable.swift; sourceTree = "<group>"; };
76D7F27621BEB3A0004B74CB /* UITableView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITableView+Extensions.swift"; sourceTree = "<group>"; };
76D7F27821BEB3A0004B74CB /* OpenSourceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenSourceViewController.swift; sourceTree = "<group>"; };
76D7F27921BEB3A0004B74CB /* LicenceListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LicenceListViewController.swift; sourceTree = "<group>"; };
76D7F27A21BEB3A0004B74CB /* OpenSourceTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenSourceTableViewCell.swift; sourceTree = "<group>"; };
76D7F27B21BEB3A0004B74CB /* LoadingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadingViewController.swift; sourceTree = "<group>"; };
76D7F27D21BEB3A0004B74CB /* HTTPDataLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPDataLoader.swift; sourceTree = "<group>"; };
76D7F27F21BEB3A0004B74CB /* LicenceFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LicenceFile.swift; sourceTree = "<group>"; };
76D7F28021BEB3A0004B74CB /* LicenceLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LicenceLoader.swift; sourceTree = "<group>"; };
76EAA8611E93F2CC009A41DA /* OpenSourceControllerDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenSourceControllerDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 76EAA8611E93F2CC009A41DA /* OpenSourceControllerDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenSourceControllerDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
76EAA8641E93F2CC009A41DA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 76EAA8641E93F2CC009A41DA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
76EAA8661E93F2CC009A41DA /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; }; 76EAA8661E93F2CC009A41DA /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
@@ -29,13 +57,6 @@
76EAA86B1E93F2CC009A41DA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 76EAA86B1E93F2CC009A41DA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
76EAA86E1E93F2CC009A41DA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 76EAA86E1E93F2CC009A41DA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
76EAA8701E93F2CC009A41DA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 76EAA8701E93F2CC009A41DA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
76EAA8871E93F666009A41DA /* OpenSourceTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceTableViewCell.swift; path = ../../Sources/View/OpenSourceTableViewCell.swift; sourceTree = "<group>"; };
76EAA88A1E93F675009A41DA /* LicenceDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceDownloader.swift; path = ../../Sources/Model/LicenceDownloader.swift; sourceTree = "<group>"; };
76EAA88B1E93F675009A41DA /* LicenceFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceFile.swift; path = ../../Sources/Model/LicenceFile.swift; sourceTree = "<group>"; };
76EAA88C1E93F675009A41DA /* OpenSourceControllerConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceControllerConfig.swift; path = ../../Sources/Model/OpenSourceControllerConfig.swift; sourceTree = "<group>"; };
76EAA8901E93F67B009A41DA /* Array+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Array+Extensions.swift"; path = "../../Sources/Extensions/Array+Extensions.swift"; sourceTree = "<group>"; };
76EAA8921E93F681009A41DA /* OpenSourceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceController.swift; path = ../../Sources/Controller/OpenSourceController.swift; sourceTree = "<group>"; };
76EAA8931E93F681009A41DA /* OpenSourceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceViewController.swift; path = ../../Sources/Controller/OpenSourceViewController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@@ -49,10 +70,68 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
76D7F26E21BEB3A0004B74CB /* Sources */ = {
isa = PBXGroup;
children = (
76D7F26F21BEB3A0004B74CB /* OpenSourceController.swift */,
76D7F27021BEB3A0004B74CB /* OpenSourceControllerConfig.swift */,
76D7F27121BEB3A0004B74CB /* Utils */,
76D7F27721BEB3A0004B74CB /* Controller */,
76D7F27C21BEB3A0004B74CB /* Loader */,
76D7F27E21BEB3A0004B74CB /* Model */,
);
name = Sources;
path = ../Sources;
sourceTree = "<group>";
};
76D7F27121BEB3A0004B74CB /* Utils */ = {
isa = PBXGroup;
children = (
76D7F27221BEB3A0004B74CB /* Array+Extensions.swift */,
76D7F27321BEB3A0004B74CB /* UIViewController+Extensions.swift */,
76D7F27421BEB3A0004B74CB /* UIView+Extensions.swift */,
76D7F27521BEB3A0004B74CB /* Reusable.swift */,
76D7F27621BEB3A0004B74CB /* UITableView+Extensions.swift */,
7622F02D2379B559001B4F5D /* Style.swift */,
);
path = Utils;
sourceTree = "<group>";
};
76D7F27721BEB3A0004B74CB /* Controller */ = {
isa = PBXGroup;
children = (
76D7F27821BEB3A0004B74CB /* OpenSourceViewController.swift */,
76D7F27921BEB3A0004B74CB /* LicenceListViewController.swift */,
76D7F27A21BEB3A0004B74CB /* OpenSourceTableViewCell.swift */,
76D7F27B21BEB3A0004B74CB /* LoadingViewController.swift */,
);
path = Controller;
sourceTree = "<group>";
};
76D7F27C21BEB3A0004B74CB /* Loader */ = {
isa = PBXGroup;
children = (
76D7F27D21BEB3A0004B74CB /* HTTPDataLoader.swift */,
76D7F28021BEB3A0004B74CB /* LicenceLoader.swift */,
);
path = Loader;
sourceTree = "<group>";
};
76D7F27E21BEB3A0004B74CB /* Model */ = {
isa = PBXGroup;
children = (
76D7F27F21BEB3A0004B74CB /* LicenceFile.swift */,
);
path = Model;
sourceTree = "<group>";
};
76EAA8581E93F2CC009A41DA = { 76EAA8581E93F2CC009A41DA = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7627B06121807C4B0057FFBB /* README.md */,
7622F02B23796B67001B4F5D /* CHANGELOG.md */,
76EAA8631E93F2CC009A41DA /* OpenSourceControllerDemo */, 76EAA8631E93F2CC009A41DA /* OpenSourceControllerDemo */,
76D7F26E21BEB3A0004B74CB /* Sources */,
76EAA8621E93F2CC009A41DA /* Products */, 76EAA8621E93F2CC009A41DA /* Products */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
@@ -68,9 +147,9 @@
76EAA8631E93F2CC009A41DA /* OpenSourceControllerDemo */ = { 76EAA8631E93F2CC009A41DA /* OpenSourceControllerDemo */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7622F02A23796A81001B4F5D /* OpenSourceControllerDemo.entitlements */,
76EAA8641E93F2CC009A41DA /* AppDelegate.swift */, 76EAA8641E93F2CC009A41DA /* AppDelegate.swift */,
76EAA8661E93F2CC009A41DA /* ViewController.swift */, 76EAA8661E93F2CC009A41DA /* ViewController.swift */,
76EAA8891E93F66A009A41DA /* Sources */,
76EAA8681E93F2CC009A41DA /* Main.storyboard */, 76EAA8681E93F2CC009A41DA /* Main.storyboard */,
76EAA86D1E93F2CC009A41DA /* LaunchScreen.storyboard */, 76EAA86D1E93F2CC009A41DA /* LaunchScreen.storyboard */,
76EAA86B1E93F2CC009A41DA /* Assets.xcassets */, 76EAA86B1E93F2CC009A41DA /* Assets.xcassets */,
@@ -79,20 +158,6 @@
path = OpenSourceControllerDemo; path = OpenSourceControllerDemo;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
76EAA8891E93F66A009A41DA /* Sources */ = {
isa = PBXGroup;
children = (
76EAA8921E93F681009A41DA /* OpenSourceController.swift */,
76EAA8931E93F681009A41DA /* OpenSourceViewController.swift */,
76EAA8901E93F67B009A41DA /* Array+Extensions.swift */,
76EAA88A1E93F675009A41DA /* LicenceDownloader.swift */,
76EAA88B1E93F675009A41DA /* LicenceFile.swift */,
76EAA88C1E93F675009A41DA /* OpenSourceControllerConfig.swift */,
76EAA8871E93F666009A41DA /* OpenSourceTableViewCell.swift */,
);
name = Sources;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@@ -120,20 +185,20 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 0830; LastSwiftUpdateCheck = 0830;
LastUpgradeCheck = 0900; LastUpgradeCheck = 1100;
ORGANIZATIONNAME = OpenSourceController; ORGANIZATIONNAME = OpenSourceController;
TargetAttributes = { TargetAttributes = {
76EAA8601E93F2CC009A41DA = { 76EAA8601E93F2CC009A41DA = {
CreatedOnToolsVersion = 8.3; CreatedOnToolsVersion = 8.3;
DevelopmentTeam = 62PP362QNQ; DevelopmentTeam = XEHEC9B46E;
LastSwiftMigration = 0900; LastSwiftMigration = 1100;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
}; };
}; };
buildConfigurationList = 76EAA85C1E93F2CC009A41DA /* Build configuration list for PBXProject "OpenSourceControllerDemo" */; buildConfigurationList = 76EAA85C1E93F2CC009A41DA /* Build configuration list for PBXProject "OpenSourceControllerDemo" */;
compatibilityVersion = "Xcode 3.2"; compatibilityVersion = "Xcode 3.2";
developmentRegion = English; developmentRegion = en;
hasScannedForEncodings = 0; hasScannedForEncodings = 0;
knownRegions = ( knownRegions = (
en, en,
@@ -155,7 +220,9 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
76EAA86F1E93F2CC009A41DA /* LaunchScreen.storyboard in Resources */, 76EAA86F1E93F2CC009A41DA /* LaunchScreen.storyboard in Resources */,
7622F02C23796B67001B4F5D /* CHANGELOG.md in Resources */,
76EAA86C1E93F2CC009A41DA /* Assets.xcassets in Resources */, 76EAA86C1E93F2CC009A41DA /* Assets.xcassets in Resources */,
7627B06221807C4B0057FFBB /* README.md in Resources */,
76EAA86A1E93F2CC009A41DA /* Main.storyboard in Resources */, 76EAA86A1E93F2CC009A41DA /* Main.storyboard in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@@ -167,15 +234,23 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
76EAA88D1E93F675009A41DA /* LicenceDownloader.swift in Sources */, 76D7F28721BEB3A0004B74CB /* UITableView+Extensions.swift in Sources */,
76EAA88E1E93F675009A41DA /* LicenceFile.swift in Sources */, 76D7F28521BEB3A0004B74CB /* UIView+Extensions.swift in Sources */,
76EAA8951E93F681009A41DA /* OpenSourceViewController.swift in Sources */, 76D7F28221BEB3A0004B74CB /* OpenSourceControllerConfig.swift in Sources */,
76EAA8881E93F666009A41DA /* OpenSourceTableViewCell.swift in Sources */, 76D7F28321BEB3A0004B74CB /* Array+Extensions.swift in Sources */,
76EAA8911E93F67B009A41DA /* Array+Extensions.swift in Sources */, 7622F02E2379B559001B4F5D /* Style.swift in Sources */,
76EAA8941E93F681009A41DA /* OpenSourceController.swift in Sources */,
76EAA8671E93F2CC009A41DA /* ViewController.swift in Sources */, 76EAA8671E93F2CC009A41DA /* ViewController.swift in Sources */,
76EAA88F1E93F675009A41DA /* OpenSourceControllerConfig.swift in Sources */, 76D7F28921BEB3A0004B74CB /* LicenceListViewController.swift in Sources */,
76D7F28C21BEB3A0004B74CB /* HTTPDataLoader.swift in Sources */,
76D7F28A21BEB3A0004B74CB /* OpenSourceTableViewCell.swift in Sources */,
76D7F28E21BEB3A0004B74CB /* LicenceLoader.swift in Sources */,
76D7F28821BEB3A0004B74CB /* OpenSourceViewController.swift in Sources */,
76D7F28621BEB3A0004B74CB /* Reusable.swift in Sources */,
76EAA8651E93F2CC009A41DA /* AppDelegate.swift in Sources */, 76EAA8651E93F2CC009A41DA /* AppDelegate.swift in Sources */,
76D7F28D21BEB3A0004B74CB /* LicenceFile.swift in Sources */,
76D7F28421BEB3A0004B74CB /* UIViewController+Extensions.swift in Sources */,
76D7F28B21BEB3A0004B74CB /* LoadingViewController.swift in Sources */,
76D7F28121BEB3A0004B74CB /* OpenSourceController.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -205,6 +280,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
@@ -215,6 +291,7 @@
CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES; CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
@@ -222,6 +299,7 @@
CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_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_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@@ -263,6 +341,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
@@ -273,6 +352,7 @@
CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES; CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
@@ -280,6 +360,7 @@
CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_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_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@@ -314,13 +395,15 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = 62PP362QNQ; CODE_SIGN_ENTITLEMENTS = OpenSourceControllerDemo/OpenSourceControllerDemo.entitlements;
DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES;
DEVELOPMENT_TEAM = XEHEC9B46E;
INFOPLIST_FILE = OpenSourceControllerDemo/Info.plist; INFOPLIST_FILE = OpenSourceControllerDemo/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.fg.OpenSourceControllerDemo; PRODUCT_BUNDLE_IDENTIFIER = com.fg.OpenSourceControllerDemo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_SWIFT3_OBJC_INFERENCE = Default; SUPPORTS_MACCATALYST = YES;
SWIFT_VERSION = 4.0; SWIFT_VERSION = 5.0;
}; };
name = Debug; name = Debug;
}; };
@@ -328,13 +411,15 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = 62PP362QNQ; CODE_SIGN_ENTITLEMENTS = OpenSourceControllerDemo/OpenSourceControllerDemo.entitlements;
DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES;
DEVELOPMENT_TEAM = XEHEC9B46E;
INFOPLIST_FILE = OpenSourceControllerDemo/Info.plist; INFOPLIST_FILE = OpenSourceControllerDemo/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.fg.OpenSourceControllerDemo; PRODUCT_BUNDLE_IDENTIFIER = com.fg.OpenSourceControllerDemo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_SWIFT3_OBJC_INFERENCE = Default; SUPPORTS_MACCATALYST = YES;
SWIFT_VERSION = 4.0; SWIFT_VERSION = 5.0;
}; };
name = Release; name = Release;
}; };
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -4,5 +4,7 @@
<dict> <dict>
<key>BuildSystemType</key> <key>BuildSystemType</key>
<string>Latest</string> <string>Latest</string>
<key>PreviewsEnabled</key>
<false/>
</dict> </dict>
</plist> </plist>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0900" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -26,8 +26,16 @@
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "76EAA8601E93F2CC009A41DA"
BuildableName = "OpenSourceControllerDemo.app"
BlueprintName = "OpenSourceControllerDemo"
ReferencedContainer = "container:OpenSourceControllerDemo.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables> <Testables>
<TestableReference <TestableReference
skipped = "NO"> skipped = "NO">
@@ -40,23 +48,11 @@
</BuildableReference> </BuildableReference>
</TestableReference> </TestableReference>
</Testables> </Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "76EAA8601E93F2CC009A41DA"
BuildableName = "OpenSourceControllerDemo.app"
BlueprintName = "OpenSourceControllerDemo"
ReferencedContainer = "container:OpenSourceControllerDemo.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
@@ -73,8 +69,6 @@
ReferencedContainer = "container:OpenSourceControllerDemo.xcodeproj"> ReferencedContainer = "container:OpenSourceControllerDemo.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release" buildConfiguration = "Release"
@@ -13,8 +13,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow? var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch. // Override point for customization after application launch.
return true return true
} }
@@ -40,7 +39,5 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func applicationWillTerminate(_ application: UIApplication) { func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
} }
} }
@@ -3,61 +3,61 @@
{ {
"size" : "20x20", "size" : "20x20",
"idiom" : "iphone", "idiom" : "iphone",
"filename" : "logo 8-1.png", "filename" : "logo 7-3 2 2-2.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"size" : "20x20", "size" : "20x20",
"idiom" : "iphone", "idiom" : "iphone",
"filename" : "logo 8.png", "filename" : "logo 7-3 2 2-1.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"size" : "29x29", "size" : "29x29",
"idiom" : "iphone", "idiom" : "iphone",
"filename" : "logo 9-1.png", "filename" : "logo 7-3 2 2.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"size" : "29x29", "size" : "29x29",
"idiom" : "iphone", "idiom" : "iphone",
"filename" : "logo 9.png", "filename" : "logo 7-3 2-4.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"size" : "40x40", "size" : "40x40",
"idiom" : "iphone", "idiom" : "iphone",
"filename" : "logo 10-3.png", "filename" : "logo 7-3 2-3.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"size" : "40x40", "size" : "40x40",
"idiom" : "iphone", "idiom" : "iphone",
"filename" : "logo 10-2.png", "filename" : "logo 7-3 2-2.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"size" : "60x60", "size" : "60x60",
"idiom" : "iphone", "idiom" : "iphone",
"filename" : "logo 10-1.png", "filename" : "logo 7-3 2-1.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"size" : "60x60", "size" : "60x60",
"idiom" : "iphone", "idiom" : "iphone",
"filename" : "logo 10.png", "filename" : "logo 7-3 2.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"size" : "20x20", "size" : "20x20",
"idiom" : "ipad", "idiom" : "ipad",
"filename" : "logo 4-1.png", "filename" : "logo 7-5.png",
"scale" : "1x" "scale" : "1x"
}, },
{ {
"size" : "20x20", "size" : "20x20",
"idiom" : "ipad", "idiom" : "ipad",
"filename" : "logo 4.png", "filename" : "logo 7-4.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "logo 7-3 2 2 2-2.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "logo 7-3 2 2 2-1.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "logo 7-3 2 2 2.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11134" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
@@ -16,7 +20,20 @@
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Logo" translatesAutoresizingMaskIntoConstraints="NO" id="AmH-DA-KFE">
<rect key="frame" x="87.5" y="233.5" width="200" height="200"/>
<constraints>
<constraint firstAttribute="height" constant="200" id="TkH-v5-gZa"/>
<constraint firstAttribute="width" constant="200" id="b8V-t1-IPP"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="AmH-DA-KFE" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="K8c-8t-pu8"/>
<constraint firstItem="AmH-DA-KFE" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="dMd-Ag-82A"/>
</constraints>
</view> </view>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -24,4 +41,7 @@
<point key="canvasLocation" x="53" y="375"/> <point key="canvasLocation" x="53" y="375"/>
</scene> </scene>
</scenes> </scenes>
<resources>
<image name="Logo" width="1024" height="1024"/>
</resources>
</document> </document>
@@ -1,16 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="fdz-at-fDg">
<device id="retina4_7" orientation="portrait"> <device id="retina4_7" orientation="portrait" appearance="light"/>
<adaptation id="fullscreen"/>
</device>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15509"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--View Controller--> <!--Demo-->
<scene sceneID="tne-QT-ifu"> <scene sceneID="tne-QT-ifu">
<objects> <objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModule="OpenSourceControllerDemo" customModuleProvider="target" sceneMemberID="viewController"> <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="OpenSourceControllerDemo" customModuleProvider="target" sceneMemberID="viewController">
@@ -23,25 +20,61 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="LI4-fC-2Ry"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="LI4-fC-2Ry">
<rect key="frame" x="23" y="318" width="328" height="30"/> <rect key="frame" x="23" y="318.5" width="329" height="30"/>
<state key="normal" title="Show me"/> <state key="normal" title="Show me (push)">
<color key="titleColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/>
</state>
<connections> <connections>
<action selector="showOpenSource:" destination="BYZ-38-t0r" eventType="touchUpInside" id="vmT-jj-Xvr"/> <action selector="pushOpenSourceController:" destination="BYZ-38-t0r" eventType="touchUpInside" id="Exu-2l-lfA"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="wfq-WN-CRo">
<rect key="frame" x="23" y="356" width="329" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="LLB-12-8xE"/>
</constraints>
<state key="normal" title="Show me (present)">
<color key="titleColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/>
</state>
<connections>
<action selector="presentOpenSourceController:" destination="BYZ-38-t0r" eventType="touchUpInside" id="SoS-HF-0LZ"/>
</connections> </connections>
</button> </button>
</subviews> </subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<color key="tintColor" red="0.0" green="0.58980089430000004" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints> <constraints>
<constraint firstItem="wfq-WN-CRo" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" constant="7" id="7s5-n0-5gS"/>
<constraint firstAttribute="trailingMargin" secondItem="wfq-WN-CRo" secondAttribute="trailing" constant="7" id="Qvn-Hu-Pci"/>
<constraint firstItem="LI4-fC-2Ry" firstAttribute="centerY" secondItem="8bC-Xf-vdC" secondAttribute="centerY" id="jXk-ZK-0PF"/> <constraint firstItem="LI4-fC-2Ry" firstAttribute="centerY" secondItem="8bC-Xf-vdC" secondAttribute="centerY" id="jXk-ZK-0PF"/>
<constraint firstItem="wfq-WN-CRo" firstAttribute="top" secondItem="LI4-fC-2Ry" secondAttribute="bottom" constant="7.5" id="ncu-07-cO6"/>
<constraint firstItem="LI4-fC-2Ry" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" constant="7" id="q0g-Cs-CVt"/> <constraint firstItem="LI4-fC-2Ry" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" constant="7" id="q0g-Cs-CVt"/>
<constraint firstItem="LI4-fC-2Ry" firstAttribute="centerX" secondItem="8bC-Xf-vdC" secondAttribute="centerX" id="wVV-oT-zRH"/> <constraint firstItem="LI4-fC-2Ry" firstAttribute="centerX" secondItem="8bC-Xf-vdC" secondAttribute="centerX" id="wVV-oT-zRH"/>
</constraints> </constraints>
</view> </view>
<navigationItem key="navigationItem" id="0ga-4U-IeA"/> <navigationItem key="navigationItem" title="Demo" id="0ga-4U-IeA"/>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="476" y="138.98050974512745"/> <point key="canvasLocation" x="1754.4000000000001" y="138.98050974512745"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="mMO-Hp-rx0">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="fdz-at-fDg" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="gcV-6a-gYe">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="v9Q-2O-OOv"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="sjw-k6-nEt" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="815.20000000000005" y="138.98050974512745"/>
</scene> </scene>
</scenes> </scenes>
</document> </document>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
@@ -14,23 +14,15 @@ class ViewController: UIViewController {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
} }
// MARK: - Action // MARK: - Action
/// Handle button click & show the controller with licences private func buildOpenSourceController() -> OpenSourceController {
@IBAction func showOpenSource(_ sender: Any) {
// Create controller
let openSourceVC = OpenSourceController() let openSourceVC = OpenSourceController()
// Apply some customisation if you want // Apply some customisation if you want
//self.controllerCustomUI(openSourceVC: openSourceVC) //self.applyCustomUI(openSourceVC: openSourceVC)
// Init with LicenceFile object // Init with LicenceFile object
openSourceVC.licences = [LicenceFile(title: "FacebookImagePicker", openSourceVC.licences = [LicenceFile(title: "FacebookImagePicker",
@@ -43,35 +35,41 @@ class ViewController: UIViewController {
url: "https://raw.githubusercontent.com/nickoneill/PermissionScope/master/LICENSE"), url: "https://raw.githubusercontent.com/nickoneill/PermissionScope/master/LICENSE"),
LicenceFile(title: "EasyTipView", LicenceFile(title: "EasyTipView",
url: "https://raw.githubusercontent.com/teodorpatras/EasyTipView/master/LICENSE"), url: "https://raw.githubusercontent.com/teodorpatras/EasyTipView/master/LICENSE"),
LicenceFile(title: "ReachabilitySwift", LicenceFile(title: "FakeAdress",
url: "https://raw.githubusercontent.com/ashleymills/Reachability.swift/master/LICENSE"), url: "https://fake.com/fake/LICENCE"),
LicenceFile(title: "KeychainAccess", LicenceFile(title: "KeychainAccess",
url: "https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/LICENSE")] url: "https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/LICENSE")]
// Present controller return openSourceVC
}
@IBAction func pushOpenSourceController(_ sender: Any) {
let openSourceVC = self.buildOpenSourceController()
openSourceVC.pushOpenSourceController(from: self) openSourceVC.pushOpenSourceController(from: self)
} }
// Customization @IBAction func presentOpenSourceController(_ sender: Any) {
let openSourceVC = self.buildOpenSourceController()
openSourceVC.presentOpenSourceController(from: self)
}
fileprivate func controllerCustomUI(openSourceVC: OpenSourceController) { // MARK: - Customization
fileprivate func applyCustomUI(openSourceVC: OpenSourceController) {
// Navigation bar title // Navigation bar title
openSourceVC.config.title = "MyCustomTitle" openSourceVC.config.title = "MyCustomTitle"
// Navigation bar tint color
openSourceVC.config.uiConfig.barTintColor = UIColor.red
// Close button color // Close button color
openSourceVC.config.uiConfig.closeButtonColor = UIColor.white openSourceVC.config.uiConfig.closeButtonColor = UIColor.green
// BackgroundColor // BackgroundColor
openSourceVC.config.uiConfig.backgroundColor = UIColor.red.withAlphaComponent(0.6) openSourceVC.config.uiConfig.backgroundColor = UIColor.red.withAlphaComponent(0.6)
// Licence text color // Licence text color
openSourceVC.config.uiConfig.licenceTextColor = UIColor.white openSourceVC.config.uiConfig.licenceTextColor = UIColor.green
// Navigation bar title color // Navigation bar title color
openSourceVC.config.uiConfig.titleColor = UIColor.white openSourceVC.config.uiConfig.titleColor = UIColor.green
// Licence cell background color // Licence cell background color
openSourceVC.config.uiConfig.licenceBackgroundColor = UIColor.red openSourceVC.config.uiConfig.licenceBackgroundColor = UIColor.red
+4
View File
@@ -0,0 +1,4 @@
source "https://rubygems.org"
gem "cocoapods"
gem "fastlane"
Binary file not shown.
+2 -1
View File
@@ -1,6 +1,6 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'OpenSourceController' s.name = 'OpenSourceController'
s.version = '2.1.0' s.version = '4.1.1'
s.summary = 'Display all the librarys licence used in your application. Enjoy !' s.summary = 'Display all the librarys licence used in your application. Enjoy !'
s.description = 'Display a screen with all licence used in your apply can be painful to maintain. OpenSourceController was built to respond to this problem. OpenSourceController is a simple parser to display the licences which are used in your application.' s.description = 'Display a screen with all licence used in your apply can be painful to maintain. OpenSourceController was built to respond to this problem. OpenSourceController is a simple parser to display the licences which are used in your application.'
s.homepage = 'https://github.com/floriangbh/OpenSourceController' s.homepage = 'https://github.com/floriangbh/OpenSourceController'
@@ -9,4 +9,5 @@ s.author = { 'Florian Gabach' => 'florian.gabach@gmail.com' }
s.source = { :git => 'https://github.com/floriangbh/OpenSourceController.git', :tag => s.version.to_s } s.source = { :git => 'https://github.com/floriangbh/OpenSourceController.git', :tag => s.version.to_s }
s.ios.deployment_target = '9.0' s.ios.deployment_target = '9.0'
s.source_files = 'Sources/**/*' s.source_files = 'Sources/**/*'
s.swift_versions = ['5.0']
end end
+102 -50
View File
@@ -8,13 +8,21 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
52D6D9871BEFF229002C0205 /* OpenSourceController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52D6D97C1BEFF229002C0205 /* OpenSourceController.framework */; }; 52D6D9871BEFF229002C0205 /* OpenSourceController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52D6D97C1BEFF229002C0205 /* OpenSourceController.framework */; };
76EAA8441E93EDA5009A41DA /* OpenSourceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8421E93EDA5009A41DA /* OpenSourceController.swift */; }; 76229B7D2180AD9F00A61697 /* HTTPDataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76229B7C2180AD9F00A61697 /* HTTPDataLoader.swift */; };
76EAA8451E93EDA5009A41DA /* OpenSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8431E93EDA5009A41DA /* OpenSourceViewController.swift */; }; 76229B802180ADA800A61697 /* OpenSourceControllerConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76229B7E2180ADA800A61697 /* OpenSourceControllerConfig.swift */; };
76EAA8481E93EDB3009A41DA /* Array+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8471E93EDB3009A41DA /* Array+Extensions.swift */; }; 76229B812180ADA800A61697 /* OpenSourceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76229B7F2180ADA800A61697 /* OpenSourceController.swift */; };
76EAA84E1E93EDCD009A41DA /* LicenceDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA84B1E93EDCD009A41DA /* LicenceDownloader.swift */; }; 769FD9D121871DEC00FB5A53 /* OpenSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769FD9CD21871DEC00FB5A53 /* OpenSourceViewController.swift */; };
769FD9D221871DEC00FB5A53 /* LicenceListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769FD9CE21871DEC00FB5A53 /* LicenceListViewController.swift */; };
769FD9D321871DEC00FB5A53 /* LoadingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769FD9CF21871DEC00FB5A53 /* LoadingViewController.swift */; };
769FD9D421871DEC00FB5A53 /* OpenSourceTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769FD9D021871DEC00FB5A53 /* OpenSourceTableViewCell.swift */; };
76B7980F238844F300009193 /* LicenceLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B7980E238844F300009193 /* LicenceLoader.swift */; };
76B79811238845D300009193 /* Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B79810238845D300009193 /* Style.swift */; };
76D7F24521BEB18A004B74CB /* UITableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24021BEB18A004B74CB /* UITableView+Extensions.swift */; };
76D7F24621BEB18A004B74CB /* Reusable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24121BEB18A004B74CB /* Reusable.swift */; };
76D7F24721BEB18A004B74CB /* UIViewController+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24221BEB18A004B74CB /* UIViewController+Extensions.swift */; };
76D7F24821BEB18A004B74CB /* Array+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24321BEB18A004B74CB /* Array+Extensions.swift */; };
76D7F24921BEB18A004B74CB /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24421BEB18A004B74CB /* UIView+Extensions.swift */; };
76EAA84F1E93EDCD009A41DA /* LicenceFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA84C1E93EDCD009A41DA /* LicenceFile.swift */; }; 76EAA84F1E93EDCD009A41DA /* LicenceFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA84C1E93EDCD009A41DA /* LicenceFile.swift */; };
76EAA8501E93EDCD009A41DA /* OpenSourceControllerConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA84D1E93EDCD009A41DA /* OpenSourceControllerConfig.swift */; };
76EAA8531E93EDF0009A41DA /* OpenSourceTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8521E93EDF0009A41DA /* OpenSourceTableViewCell.swift */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@@ -30,13 +38,21 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
52D6D97C1BEFF229002C0205 /* OpenSourceController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenSourceController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 52D6D97C1BEFF229002C0205 /* OpenSourceController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenSourceController.framework; sourceTree = BUILT_PRODUCTS_DIR; };
52D6D9861BEFF229002C0205 /* OpenSourceController-iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OpenSourceController-iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 52D6D9861BEFF229002C0205 /* OpenSourceController-iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OpenSourceController-iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
76EAA8421E93EDA5009A41DA /* OpenSourceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceController.swift; path = Sources/Controller/OpenSourceController.swift; sourceTree = "<group>"; }; 76229B7C2180AD9F00A61697 /* HTTPDataLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HTTPDataLoader.swift; path = Sources/Loader/HTTPDataLoader.swift; sourceTree = "<group>"; };
76EAA8431E93EDA5009A41DA /* OpenSourceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceViewController.swift; path = Sources/Controller/OpenSourceViewController.swift; sourceTree = "<group>"; }; 76229B7E2180ADA800A61697 /* OpenSourceControllerConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceControllerConfig.swift; path = Sources/OpenSourceControllerConfig.swift; sourceTree = "<group>"; };
76EAA8471E93EDB3009A41DA /* Array+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Array+Extensions.swift"; path = "Sources/Extensions/Array+Extensions.swift"; sourceTree = "<group>"; }; 76229B7F2180ADA800A61697 /* OpenSourceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceController.swift; path = Sources/OpenSourceController.swift; sourceTree = "<group>"; };
76EAA84B1E93EDCD009A41DA /* LicenceDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceDownloader.swift; path = Sources/Model/LicenceDownloader.swift; sourceTree = "<group>"; }; 769FD9CD21871DEC00FB5A53 /* OpenSourceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceViewController.swift; path = Sources/Controller/OpenSourceViewController.swift; sourceTree = "<group>"; };
769FD9CE21871DEC00FB5A53 /* LicenceListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceListViewController.swift; path = Sources/Controller/LicenceListViewController.swift; sourceTree = "<group>"; };
769FD9CF21871DEC00FB5A53 /* LoadingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoadingViewController.swift; path = Sources/Controller/LoadingViewController.swift; sourceTree = "<group>"; };
769FD9D021871DEC00FB5A53 /* OpenSourceTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceTableViewCell.swift; path = Sources/Controller/OpenSourceTableViewCell.swift; sourceTree = "<group>"; };
76B7980E238844F300009193 /* LicenceLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceLoader.swift; path = Sources/Loader/LicenceLoader.swift; sourceTree = "<group>"; };
76B79810238845D300009193 /* Style.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Style.swift; path = Sources/Utils/Style.swift; sourceTree = "<group>"; };
76D7F24021BEB18A004B74CB /* UITableView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UITableView+Extensions.swift"; path = "Sources/Utils/UITableView+Extensions.swift"; sourceTree = "<group>"; };
76D7F24121BEB18A004B74CB /* Reusable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Reusable.swift; path = Sources/Utils/Reusable.swift; sourceTree = "<group>"; };
76D7F24221BEB18A004B74CB /* UIViewController+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Extensions.swift"; path = "Sources/Utils/UIViewController+Extensions.swift"; sourceTree = "<group>"; };
76D7F24321BEB18A004B74CB /* Array+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Array+Extensions.swift"; path = "Sources/Utils/Array+Extensions.swift"; sourceTree = "<group>"; };
76D7F24421BEB18A004B74CB /* UIView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+Extensions.swift"; path = "Sources/Utils/UIView+Extensions.swift"; sourceTree = "<group>"; };
76EAA84C1E93EDCD009A41DA /* LicenceFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceFile.swift; path = Sources/Model/LicenceFile.swift; sourceTree = "<group>"; }; 76EAA84C1E93EDCD009A41DA /* LicenceFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceFile.swift; path = Sources/Model/LicenceFile.swift; sourceTree = "<group>"; };
76EAA84D1E93EDCD009A41DA /* OpenSourceControllerConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceControllerConfig.swift; path = Sources/Model/OpenSourceControllerConfig.swift; sourceTree = "<group>"; };
76EAA8521E93EDF0009A41DA /* OpenSourceTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceTableViewCell.swift; path = Sources/View/OpenSourceTableViewCell.swift; sourceTree = "<group>"; };
AD2FAA261CD0B6D800659CF4 /* OpenSourceController.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OpenSourceController.plist; sourceTree = "<group>"; }; AD2FAA261CD0B6D800659CF4 /* OpenSourceController.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OpenSourceController.plist; sourceTree = "<group>"; };
AD2FAA281CD0B6E100659CF4 /* OpenSourceControllerTests.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OpenSourceControllerTests.plist; sourceTree = "<group>"; }; AD2FAA281CD0B6E100659CF4 /* OpenSourceControllerTests.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OpenSourceControllerTests.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
@@ -87,50 +103,58 @@
path = Configs; path = Configs;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
76EAA8461E93EDA9009A41DA /* Controller */ = { 76229B702180AD7700A61697 /* Model */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
76EAA8421E93EDA5009A41DA /* OpenSourceController.swift */, 76EAA84C1E93EDCD009A41DA /* LicenceFile.swift */,
76EAA8431E93EDA5009A41DA /* OpenSourceViewController.swift */,
); );
name = Controller; name = Model;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
76EAA8491E93EDBB009A41DA /* Extensions */ = { 76229B7B2180AD8E00A61697 /* Loader */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
76EAA8471E93EDB3009A41DA /* Array+Extensions.swift */, 76229B7C2180AD9F00A61697 /* HTTPDataLoader.swift */,
76B7980E238844F300009193 /* LicenceLoader.swift */,
); );
name = Extensions; name = Loader;
sourceTree = "<group>";
};
76EAA8491E93EDBB009A41DA /* Utils */ = {
isa = PBXGroup;
children = (
76D7F24321BEB18A004B74CB /* Array+Extensions.swift */,
76D7F24121BEB18A004B74CB /* Reusable.swift */,
76D7F24021BEB18A004B74CB /* UITableView+Extensions.swift */,
76D7F24421BEB18A004B74CB /* UIView+Extensions.swift */,
76B79810238845D300009193 /* Style.swift */,
76D7F24221BEB18A004B74CB /* UIViewController+Extensions.swift */,
);
name = Utils;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
76EAA84A1E93EDC0009A41DA /* Sources */ = { 76EAA84A1E93EDC0009A41DA /* Sources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
76EAA8511E93EDD2009A41DA /* Model */, 76229B7F2180ADA800A61697 /* OpenSourceController.swift */,
76EAA8541E93EDF3009A41DA /* View */, 76229B7E2180ADA800A61697 /* OpenSourceControllerConfig.swift */,
76EAA8461E93EDA9009A41DA /* Controller */, 76229B7B2180AD8E00A61697 /* Loader */,
76EAA8491E93EDBB009A41DA /* Extensions */, 76229B702180AD7700A61697 /* Model */,
76EAA8511E93EDD2009A41DA /* Controller */,
76EAA8491E93EDBB009A41DA /* Utils */,
); );
name = Sources; name = Sources;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
76EAA8511E93EDD2009A41DA /* Model */ = { 76EAA8511E93EDD2009A41DA /* Controller */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
76EAA84B1E93EDCD009A41DA /* LicenceDownloader.swift */, 769FD9CE21871DEC00FB5A53 /* LicenceListViewController.swift */,
76EAA84C1E93EDCD009A41DA /* LicenceFile.swift */, 769FD9CF21871DEC00FB5A53 /* LoadingViewController.swift */,
76EAA84D1E93EDCD009A41DA /* OpenSourceControllerConfig.swift */, 769FD9D021871DEC00FB5A53 /* OpenSourceTableViewCell.swift */,
769FD9CD21871DEC00FB5A53 /* OpenSourceViewController.swift */,
); );
name = Model; name = Controller;
sourceTree = "<group>";
};
76EAA8541E93EDF3009A41DA /* View */ = {
isa = PBXGroup;
children = (
76EAA8521E93EDF0009A41DA /* OpenSourceTableViewCell.swift */,
);
name = View;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
DD7502721C68FC1B006590AF /* Frameworks */ = { DD7502721C68FC1B006590AF /* Frameworks */ = {
@@ -205,25 +229,29 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 0720; LastSwiftUpdateCheck = 0720;
LastUpgradeCheck = 0900; LastUpgradeCheck = 1100;
ORGANIZATIONNAME = OpenSourceController; ORGANIZATIONNAME = OpenSourceController;
TargetAttributes = { TargetAttributes = {
52D6D97B1BEFF229002C0205 = { 52D6D97B1BEFF229002C0205 = {
CreatedOnToolsVersion = 7.1; CreatedOnToolsVersion = 7.1;
LastSwiftMigration = 0830; DevelopmentTeam = XEHEC9B46E;
LastSwiftMigration = 1100;
ProvisioningStyle = Automatic;
}; };
52D6D9851BEFF229002C0205 = { 52D6D9851BEFF229002C0205 = {
CreatedOnToolsVersion = 7.1; CreatedOnToolsVersion = 7.1;
LastSwiftMigration = ""; DevelopmentTeam = XEHEC9B46E;
LastSwiftMigration = 1130;
}; };
}; };
}; };
buildConfigurationList = 52D6D9761BEFF229002C0205 /* Build configuration list for PBXProject "OpenSourceController" */; buildConfigurationList = 52D6D9761BEFF229002C0205 /* Build configuration list for PBXProject "OpenSourceController" */;
compatibilityVersion = "Xcode 6.3"; compatibilityVersion = "Xcode 6.3";
developmentRegion = English; developmentRegion = en;
hasScannedForEncodings = 0; hasScannedForEncodings = 0;
knownRegions = ( knownRegions = (
en, en,
Base,
); );
mainGroup = 52D6D9721BEFF229002C0205; mainGroup = 52D6D9721BEFF229002C0205;
productRefGroup = 52D6D97D1BEFF229002C0205 /* Products */; productRefGroup = 52D6D97D1BEFF229002C0205 /* Products */;
@@ -258,13 +286,21 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
76EAA84E1E93EDCD009A41DA /* LicenceDownloader.swift in Sources */, 76D7F24921BEB18A004B74CB /* UIView+Extensions.swift in Sources */,
76229B7D2180AD9F00A61697 /* HTTPDataLoader.swift in Sources */,
76D7F24621BEB18A004B74CB /* Reusable.swift in Sources */,
769FD9D221871DEC00FB5A53 /* LicenceListViewController.swift in Sources */,
76B79811238845D300009193 /* Style.swift in Sources */,
769FD9D121871DEC00FB5A53 /* OpenSourceViewController.swift in Sources */,
76D7F24721BEB18A004B74CB /* UIViewController+Extensions.swift in Sources */,
76EAA84F1E93EDCD009A41DA /* LicenceFile.swift in Sources */, 76EAA84F1E93EDCD009A41DA /* LicenceFile.swift in Sources */,
76EAA8441E93EDA5009A41DA /* OpenSourceController.swift in Sources */, 76D7F24521BEB18A004B74CB /* UITableView+Extensions.swift in Sources */,
76EAA8481E93EDB3009A41DA /* Array+Extensions.swift in Sources */, 769FD9D421871DEC00FB5A53 /* OpenSourceTableViewCell.swift in Sources */,
76EAA8531E93EDF0009A41DA /* OpenSourceTableViewCell.swift in Sources */, 76D7F24821BEB18A004B74CB /* Array+Extensions.swift in Sources */,
76EAA8501E93EDCD009A41DA /* OpenSourceControllerConfig.swift in Sources */, 76229B812180ADA800A61697 /* OpenSourceController.swift in Sources */,
76EAA8451E93EDA5009A41DA /* OpenSourceViewController.swift in Sources */, 769FD9D321871DEC00FB5A53 /* LoadingViewController.swift in Sources */,
76B7980F238844F300009193 /* LicenceLoader.swift in Sources */,
76229B802180ADA800A61697 /* OpenSourceControllerConfig.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -290,6 +326,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
@@ -298,12 +335,14 @@
CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES; CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_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_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@@ -347,6 +386,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
@@ -355,12 +395,14 @@
CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES; CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_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_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@@ -398,8 +440,11 @@
buildSettings = { buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES; APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CODE_SIGN_STYLE = Automatic;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = XEHEC9B46E;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
@@ -410,9 +455,10 @@
ONLY_ACTIVE_ARCH = NO; ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = "com.OpenSourceController.OpenSourceController-iOS"; PRODUCT_BUNDLE_IDENTIFIER = "com.OpenSourceController.OpenSourceController-iOS";
PRODUCT_NAME = OpenSourceController; PRODUCT_NAME = OpenSourceController;
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0; SWIFT_VERSION = 5.0;
}; };
name = Debug; name = Debug;
}; };
@@ -421,8 +467,11 @@
buildSettings = { buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES; APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CODE_SIGN_STYLE = Automatic;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = XEHEC9B46E;
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
@@ -432,9 +481,10 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.OpenSourceController.OpenSourceController-iOS"; PRODUCT_BUNDLE_IDENTIFIER = "com.OpenSourceController.OpenSourceController-iOS";
PRODUCT_NAME = OpenSourceController; PRODUCT_NAME = OpenSourceController;
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 4.0; SWIFT_VERSION = 5.0;
}; };
name = Release; name = Release;
}; };
@@ -443,12 +493,13 @@
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
DEVELOPMENT_TEAM = XEHEC9B46E;
INFOPLIST_FILE = Configs/OpenSourceControllerTests.plist; INFOPLIST_FILE = Configs/OpenSourceControllerTests.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.OpenSourceController.OpenSourceController-iOS-Tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.OpenSourceController.OpenSourceController-iOS-Tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0; SWIFT_VERSION = 5.0;
}; };
name = Debug; name = Debug;
}; };
@@ -457,12 +508,13 @@
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
DEVELOPMENT_TEAM = XEHEC9B46E;
INFOPLIST_FILE = Configs/OpenSourceControllerTests.plist; INFOPLIST_FILE = Configs/OpenSourceControllerTests.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.OpenSourceController.OpenSourceController-iOS-Tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.OpenSourceController.OpenSourceController-iOS-Tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0; SWIFT_VERSION = 5.0;
}; };
name = Release; name = Release;
}; };
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0900" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -26,9 +26,17 @@
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES"> codeCoverageEnabled = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "52D6D97B1BEFF229002C0205"
BuildableName = "OpenSourceController.framework"
BlueprintName = "OpenSourceController-iOS"
ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables> <Testables>
<TestableReference <TestableReference
skipped = "NO"> skipped = "NO">
@@ -41,23 +49,11 @@
</BuildableReference> </BuildableReference>
</TestableReference> </TestableReference>
</Testables> </Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "52D6D97B1BEFF229002C0205"
BuildableName = "OpenSourceController.framework"
BlueprintName = "OpenSourceController-iOS"
ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
@@ -73,8 +69,6 @@
ReferencedContainer = "container:OpenSourceController.xcodeproj"> ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference> </BuildableReference>
</MacroExpansion> </MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release" buildConfiguration = "Release"
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0900" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -26,9 +26,17 @@
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES"> codeCoverageEnabled = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "52D6DA0E1BF000BD002C0205"
BuildableName = "OpenSourceController.framework"
BlueprintName = "OpenSourceController-macOS"
ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables> <Testables>
<TestableReference <TestableReference
skipped = "NO"> skipped = "NO">
@@ -41,23 +49,11 @@
</BuildableReference> </BuildableReference>
</TestableReference> </TestableReference>
</Testables> </Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "52D6DA0E1BF000BD002C0205"
BuildableName = "OpenSourceController.framework"
BlueprintName = "OpenSourceController-macOS"
ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
@@ -73,8 +69,6 @@
ReferencedContainer = "container:OpenSourceController.xcodeproj"> ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference> </BuildableReference>
</MacroExpansion> </MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release" buildConfiguration = "Release"
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0900" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -26,9 +26,17 @@
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES"> codeCoverageEnabled = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "52D6D9EF1BEFFFBE002C0205"
BuildableName = "OpenSourceController.framework"
BlueprintName = "OpenSourceController-tvOS"
ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables> <Testables>
<TestableReference <TestableReference
skipped = "NO"> skipped = "NO">
@@ -41,23 +49,11 @@
</BuildableReference> </BuildableReference>
</TestableReference> </TestableReference>
</Testables> </Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "52D6D9EF1BEFFFBE002C0205"
BuildableName = "OpenSourceController.framework"
BlueprintName = "OpenSourceController-tvOS"
ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
@@ -73,8 +69,6 @@
ReferencedContainer = "container:OpenSourceController.xcodeproj"> ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference> </BuildableReference>
</MacroExpansion> </MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release" buildConfiguration = "Release"
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0900" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -26,19 +26,15 @@
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES"> codeCoverageEnabled = "YES">
<Testables> <Testables>
</Testables> </Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
@@ -54,8 +50,6 @@
ReferencedContainer = "container:OpenSourceController.xcodeproj"> ReferencedContainer = "container:OpenSourceController.xcodeproj">
</BuildableReference> </BuildableReference>
</MacroExpansion> </MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release" buildConfiguration = "Release"
+18
View File
@@ -0,0 +1,18 @@
// swift-tools-version:5.1
import PackageDescription
let package = Package(
name: "OpenSourceController",
platforms: [.iOS(.v10)],
products: [
.library(name: "OpenSourceController", targets: ["OpenSourceController"])
],
targets: [
.target(
name: "OpenSourceController",
path: "",
sources: ["Sources"]
)
],
swiftLanguageVersions: [.v4, .v5]
)
+51 -39
View File
@@ -10,10 +10,10 @@
<p align="center"> <p align="center">
<a href="#features">Features</a> <a href="#features">Features</a>
• <a href="#installation">Installation</a>
• <a href="#usage">Usage</a> • <a href="#usage">Usage</a>
• <a href="#translation">Translation</a> • <a href="#translation">Translation</a>
• <a href="#customisation">Customisation</a> • <a href="#customisation">Customisation</a>
• <a href="#installation">Installation</a>
• <a href="#license">License</a> • <a href="#license">License</a>
</p> </p>
@@ -28,36 +28,11 @@ Display a screen with all licences used in your application can be painful to ma
- [x] Display tableView with licences used in your app - [x] Display tableView with licences used in your app
- [x] Download licence from an URL - [x] Download licence from an URL
## Todo (feel free to make PR)
- [ ] Download licence from Podfile (https://github.com/terflogag/OpenSourceController/issues/1)
- [ ] Download licence from Cartfile (https://github.com/terflogag/OpenSourceController/issues/2)
- [ ] Download licence from local file
- [ ] Unit & UI Test
## Requirements ## Requirements
* Xcode 9 * Xcode 11
* iOS 9.0+ target deployment * iOS 9.0+ target deployment
* Swift 3 or Swift 4 project * Swift 3, Swift 4 or Swift 5.1 project
## Installation
- To integrate OpenSourceController into your Xcode project using [CocoaPods](http://cocoapods.org), specify it in your Podfile :
```ruby
pod "OpenSourceController", '~> 2.0'
pod "OpenSourceController", '~> 1.0.8' # Swift 3.1 version
```
- To integrate OpenSourceController into your Xcode project using [Carthage](https://github.com/Carthage/Carthage), specify it in your Cartfile :
```ruby
github "floriangbh/OpenSourceController" ~> 2.0
github "floriangbh/OpenSourceController" ~> 1.0.8 # Swift 3.1 version
```
## Usage ## Usage
@@ -75,9 +50,9 @@ let openSourceVC = OpenSourceController()
// Init with LicenceFile object // Init with LicenceFile object
openSourceVC.licences = [LicenceFile(title: "FacebookImagePicker", openSourceVC.licences = [LicenceFile(title: "FacebookImagePicker",
url: "https://raw.githubusercontent.com/terflogag/FacebookImagePicker/master/LICENSE"), url: "https://raw.githubusercontent.com/terflogag/FacebookImagePicker/master/LICENSE"),
LicenceFile(title: "JSQMessagesViewController", LicenceFile(title: "JSQMessagesViewController",
url: "https://raw.githubusercontent.com/jessesquires/JSQMessagesViewController/develop/LICENSE")] url: "https://raw.githubusercontent.com/jessesquires/JSQMessagesViewController/develop/LICENSE")]
// Present controller // Present controller
openSourceVC.presentOpenSourceController(from: self) openSourceVC.presentOpenSourceController(from: self)
@@ -86,6 +61,30 @@ openSourceVC.presentOpenSourceController(from: self)
openSourceVC.pushOpenSourceController(from: self) openSourceVC.pushOpenSourceController(from: self)
``` ```
With SwiftUI :
```swift
struct OpenSourceView: UIViewControllerRepresentable {
@available(iOS 13, *)
public func updateUIViewController(_ uiViewController: OpenSourceViewController, context: UIViewControllerRepresentableContext<OpenSourceView>) {
//
}
@available(iOS 13, *)
public func makeUIViewController(context: UIViewControllerRepresentableContext<OpenSourceView>) -> OpenSourceViewController {
let openSourceVC = OpenSourceViewController(licences:
[LicenceFile(title: "FacebookImagePicker",
url: "https://raw.githubusercontent.com/terflogag/FacebookImagePicker/master/LICENSE"),
LicenceFile(title: "JSQMessagesViewController",
url: "https://raw.githubusercontent.com/jessesquires/JSQMessagesViewController/develop/LICENSE")],
showCloseButton: true,
configuration: OpenSourceControllerConfig(),
licenceLoader: LicenceLoader())
return openSourceVC
}
}
```
## Customisation ## Customisation
You can apply some customisation. To do it you can use the OpenSourceControllerConfig structure like this : You can apply some customisation. To do it you can use the OpenSourceControllerConfig structure like this :
@@ -94,9 +93,6 @@ You can apply some customisation. To do it you can use the OpenSourceControllerC
// Navigation bar title // Navigation bar title
openSourceVC.config.title = "MyCustomTitle" openSourceVC.config.title = "MyCustomTitle"
// Navigation bar tint color
openSourceVC.config.uiConfig.barTintColor = UIColor.red
// Close button color // Close button color
openSourceVC.config.uiConfig.closeButtonColor = UIColor.white openSourceVC.config.uiConfig.closeButtonColor = UIColor.white
@@ -124,13 +120,29 @@ OpenSourceController is currently write in english. If you need translation for
"Unable to load this licence." = "<your_translation>"; "Unable to load this licence." = "<your_translation>";
``` ```
## Applications ## Installation
Some applications already use this controller like : - To integrate OpenSourceController into your Xcode project using [Swift Packet Manager](https://github.com/apple/swift-package-manager), specify this url in Xcode : `https://github.com/floriangbh/OpenSourceController`
- [Troll Generator](https://itunes.apple.com/fr/app/troll-generator/id1038097542?mt=8)
- [Giraf](https://itunes.apple.com/fr/app/giraf/id1136592561?mt=8)
What about yours ? If your application also use this library, feel free to contact me or make pull request on the README 😁 - To integrate OpenSourceController into your Xcode project using [CocoaPods](http://cocoapods.org), specify it in your Podfile :
```ruby
pod "OpenSourceController", '~> 3.0.0' # Swift 4.2 Version
pod "OpenSourceController", '~> 2.0' # Swift 4.0 Version
pod "OpenSourceController", '~> 1.0.8' # Swift 3.1 version
```
- To integrate OpenSourceController into your Xcode project using [Carthage](https://github.com/Carthage/Carthage), specify it in your Cartfile :
```ruby
github "floriangbh/OpenSourceController" ~> 3.0.0 # Swift 4.2 version
github "floriangbh/OpenSourceController" ~> 2.0 # Swift 4.0 version
github "floriangbh/OpenSourceController" ~> 1.0.8 # Swift 3.1 version
```
## Author ## Author
@@ -0,0 +1,75 @@
//
// LicenceListViewController.swift
// OpenSourceControllerDemo
//
// Created by Florian Gabach on 23/10/2018.
// Copyright © 2018 OpenSourceController. All rights reserved.
//
#if !os(macOS)
import UIKit
#else
import AppKit
#endif
open class LicenceListViewController: UITableViewController {
// MARK: - Var
fileprivate var config: OpenSourceControllerConfig
fileprivate var downloadedLicence: [LicenceFile]
// MARK: - Lifecyle
init(downloadedLicence: [LicenceFile], config: OpenSourceControllerConfig) {
self.config = config
self.downloadedLicence = downloadedLicence
super.init(style: .plain)
}
required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override open func viewDidLoad() {
super.viewDidLoad()
self.prepareTableView()
}
// MARK: - Prepare
fileprivate func prepareTableView() {
self.tableView.tableFooterView = UIView()
self.tableView.register(cellType: OpenSourceTableViewCell.self)
self.tableView.dataSource = self
self.tableView.delegate = self
self.tableView.separatorStyle = .singleLine
self.tableView.backgroundColor = self.config.uiConfig.backgroundColor
}
}
extension LicenceListViewController {
// MARK: - Table View Data Source
override open func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override open func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.downloadedLicence.count
}
override open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: OpenSourceTableViewCell = tableView.dequeueReusableCell(for: indexPath)
guard let licence = self.downloadedLicence.get(at: indexPath.row) else { return cell }
cell.configure(licence: licence, config: self.config)
return cell
}
override open func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
}
@@ -0,0 +1,48 @@
//
// LoadingViewController.swift
// OpenSourceControllerDemo
//
// Created by Florian Gabach on 23/10/2018.
// Copyright © 2018 OpenSourceController. All rights reserved.
//
import UIKit
open class LoadingViewController: UIViewController {
// MARK: - Var
fileprivate lazy var activityIndicator: UIActivityIndicatorView = {
let activityIndicator = UIActivityIndicatorView()
if #available(iOS 13.0, *) {
activityIndicator.style = UIActivityIndicatorView.Style.medium
} else {
activityIndicator.style = UIActivityIndicatorView.Style.gray
}
activityIndicator.startAnimating()
return activityIndicator
}()
fileprivate var config: OpenSourceControllerConfig
// MARK: - Lifecycle
init(configuration: OpenSourceControllerConfig) {
self.config = configuration
super.init(nibName: nil, bundle: nil)
}
required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override open func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = self.config.uiConfig.backgroundColor
self.view.addSubview(self.activityIndicator)
self.activityIndicator.translatesAutoresizingMaskIntoConstraints = false
self.activityIndicator.pinCenter(to: self.view)
}
}
@@ -1,57 +0,0 @@
//
// OpenSourceController.swift
// Pods
//
// Created by Florian Gabach on 05/02/2017.
import UIKit
public class OpenSourceController: NSObject {
// Contains list of licence object
open var licences: [LicenceFile]?
// Configuration
open var config = OpenSourceControllerConfig()
/// Present OpenSourceViewController embbeded in navigation controller
///
/// - Parameter from: the source controller
open func presentOpenSourceController(from: UIViewController) {
// Create open source controller
let licenceController = OpenSourceViewController()
// Init licence
licenceController.licences = self.licences
// Init config
licenceController.config = self.config
// Embed in navigation controller
let navController = UINavigationController(rootViewController: licenceController)
// Present controller
from.present(navController, animated: true)
}
/// Push OpenSourceViewController from navigation controller
///
/// - Parameter from: the source controller
open func pushOpenSourceController(from: UIViewController) {
// Create open source controller
let licenceController = OpenSourceViewController()
// Init licence
licenceController.licences = self.licences
// Init config
licenceController.config = self.config
// Push controller
guard let navigationController = from.navigationController else {
print("Source controller isn't embeded in navigation controller. Can't push.")
return
}
navigationController.pushViewController(licenceController, animated: true)
}
}
@@ -0,0 +1,37 @@
//
// OpenSourceTableViewCell.swift
// Pods
//
// Created by Florian Gabach on 05/02/2017.
import UIKit
open class OpenSourceTableViewCell: UITableViewCell, Reusable {
// MARK: - Lifecycle
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .default, reuseIdentifier: reuseIdentifier)
self.prepareCellComponent()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
// MARK: - Prepare
func prepareCellComponent() {
self.textLabel?.numberOfLines = 0
self.accessoryType = .none
self.selectionStyle = .none
}
// MARK: - Configure
func configure(licence: LicenceFile, config: OpenSourceControllerConfig) {
self.textLabel?.attributedText = licence.attributedContent
self.textLabel?.textColor = config.uiConfig.licenceTextColor
self.backgroundColor = config.uiConfig.licenceBackgroundColor
}
}
+55 -169
View File
@@ -6,200 +6,86 @@
import UIKit import UIKit
class OpenSourceViewController: UITableViewController { open class OpenSourceViewController: UIViewController {
// MARK: - Var // MARK: - Var
/// Loading indicator fileprivate var showCloseButton: Bool
fileprivate lazy var indicator: UIActivityIndicatorView = {
let indicator = UIActivityIndicatorView(frame:CGRect(x: 0, fileprivate var licences: [LicenceFile]
y: 0,
width: 40, fileprivate var licenceLoader: LicenceLoader
height: 40) )
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray fileprivate var config: OpenSourceControllerConfig
indicator.hidesWhenStopped = true
indicator.backgroundColor = UIColor.clear fileprivate lazy var loadingController = {
indicator.color = UIColor.black return LoadingViewController(configuration: config)
return indicator
}() }()
/// TableViewCell identifier fileprivate lazy var closeButton: UIBarButtonItem = {
private let reuseIdentifier = "openSourceCell" let closeButton = UIBarButtonItem(barButtonSystemItem: .stop, target: self, action: #selector(self.closePicker))
closeButton.tintColor = self.config.uiConfig.closeButtonColor
/// Contains all licence object before downloaded return closeButton
internal var licences: [LicenceFile]? }()
// Controller configuration for customization
internal var config = OpenSourceControllerConfig()
/// Contains all licences object after downloaded
fileprivate var downloadedLicence: [LicenceFile]? {
didSet {
// Update UI
DispatchQueue.main.async { [weak self] in
self?.stopLoading()
self?.tableView.reloadData()
}
}
}
// MARK: - Lifecyle // MARK: - Lifecyle
override func viewDidLoad() { public init(licences: [LicenceFile],
showCloseButton: Bool,
configuration: OpenSourceControllerConfig,
licenceLoader: LicenceLoader) {
self.licenceLoader = licenceLoader
self.licences = licences
self.showCloseButton = showCloseButton
self.config = configuration
super.init(nibName: nil, bundle: nil)
}
required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override open func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
// Prepare controller self.title = self.config.title
self.prepare()
self.view.backgroundColor = self.config.uiConfig.backgroundColor
self.prepareCloseButton()
self.prepareStyle()
self.add(self.loadingController)
self.prepareLicences()
} }
// MARK: - Prepare // MARK: - Prepare
/// Prepare controller
fileprivate func prepare() {
self.prepareTableView()
self.prepareActivityIndicator()
self.prepareCloseButton()
self.prepareStyle()
self.prepareLicences()
}
/// Download licences
fileprivate func prepareLicences() {
self.startLoading()
// Retrieve licence
guard let licences = self.licences else {
print("No licences found.")
return
}
// Download licence
LicenceDownloader.downloadLicences(licences: licences,
config: self.config) { () in
// Update licences
self.downloadedLicence = self.licences
}
}
/// Init tableView dataSource, delegate, bar button & title
fileprivate func prepareTableView() {
// Common init
self.tableView.tableFooterView = UIView()
self.tableView.register(OpenSourceTableViewCell.self, forCellReuseIdentifier: self.reuseIdentifier)
self.title = self.config.title
self.tableView.register(OpenSourceTableViewCell.self,
forCellReuseIdentifier: self.reuseIdentifier)
self.tableView.dataSource = self
self.tableView.delegate = self
self.tableView.separatorStyle = .singleLine
// Apply background color from configuration if needed
if let backgroundColor = self.config.uiConfig.backgroundColor {
self.tableView.backgroundColor = backgroundColor
}
}
/// Prepare controller style
fileprivate func prepareStyle() { fileprivate func prepareStyle() {
// Apply navigation bar tint color if needed let titleColor = self.config.uiConfig.titleColor
if let tintColor = self.config.uiConfig.barTintColor { let attribut = [NSAttributedString.Key.foregroundColor: titleColor]
self.navigationController?.navigationBar.barTintColor = tintColor self.navigationController?.navigationBar.titleTextAttributes = attribut
} }
// Applu navigation bar text color if needed fileprivate func prepareLicences() {
if let textColor = self.config.uiConfig.titleColor { self.licenceLoader.downloadLicences(licences: licences, config: config) { [weak self] in
let attribut = [NSAttributedStringKey.foregroundColor: textColor] guard let strongSelf = self else { return }
self.navigationController?.navigationBar.titleTextAttributes = attribut let listController = LicenceListViewController(downloadedLicence: strongSelf.licences, config: strongSelf.config)
strongSelf.loadingController.remove()
strongSelf.add(listController)
} }
} }
/// Prepare close button on navigation bar
fileprivate func prepareCloseButton() { fileprivate func prepareCloseButton() {
// Close button (on the right corner of navigation bar) if showCloseButton {
let closeButton = UIBarButtonItem(barButtonSystemItem: .stop, self.navigationItem.rightBarButtonItem = closeButton
target: self,
action: #selector(self.closePicker))
closeButton.tintColor = config.uiConfig.closeButtonColor ?? UIColor.black
self.navigationItem.rightBarButtonItem = closeButton
}
// MARK: - Loading indicator
/// Prepare UIActivityIndicatorView and display it at the center of the view
fileprivate func prepareActivityIndicator() {
// Add to view
self.view.addSubview(indicator)
// Apply constraint
self.indicator.translatesAutoresizingMaskIntoConstraints = false
self.indicator.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
let topConstraint = self.navigationController?.navigationBar.frame.size.height ?? 0.0
self.indicator.bottomAnchor.constraint(equalTo: view.topAnchor, constant: topConstraint).isActive=true
}
/// Start loading : start the loader animation
fileprivate func startLoading() {
self.indicator.startAnimating()
self.indicator.isHidden = false
// Disable scroll
self.tableView.isScrollEnabled = false
}
/// Stop loading : stop and hide the loader
fileprivate func stopLoading() {
self.indicator.stopAnimating()
self.indicator.isHidden = true
// Enable scroll
self.tableView.isScrollEnabled = true
}
// MARK: - Table View Data Source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.downloadedLicence?.count ?? 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: self.reuseIdentifier,
for: indexPath) as? OpenSourceTableViewCell
// Init cell
if cell == nil {
cell = OpenSourceTableViewCell(style: UITableViewCellStyle.default,
reuseIdentifier: self.reuseIdentifier)
} }
// Configure the cell with licence
if let licence = self.downloadedLicence?.get(at: indexPath.row) {
cell?.configure(licence: licence, config: self.config)
}
return cell!
}
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
// Automatic dimension
return UITableViewAutomaticDimension
} }
// MARK: - Action // MARK: - Action
/// Handler for click on close button
@objc fileprivate func closePicker() { @objc fileprivate func closePicker() {
self.dismissController() self.dismiss(animated: true, completion: nil)
}
// MARK: - Navigation
/// Dismiss the OpenSourceController
func dismissController() {
DispatchQueue.main.async { [weak self] in
self?.dismiss(animated: true, completion: nil)
}
} }
} }
+23
View File
@@ -0,0 +1,23 @@
//
// LicenceHTTPLoader.swift
// OpenSourceControllerDemo
//
// Created by Florian Gabach on 24/10/2018.
// Copyright © 2018 OpenSourceController. All rights reserved.
//
import Foundation
open class HTTPDataLoader {
func loadData(fromUrl url: String, completion: @escaping (Data?) -> Void) {
if let url = URL(string: url) {
let task = URLSession.shared.dataTask(with: url) { (data, _, error) in
if error != nil {
print("OpenSourceController error : \(error?.localizedDescription ?? "") from url : \(url)")
}
completion(data)
}
task.resume()
}
}
}
@@ -6,32 +6,32 @@
import UIKit import UIKit
class LicenceDownloader: NSObject { open class LicenceLoader {
/// Download every licence /// Download every licence
/// ///
/// - Parameters: /// - Parameters:
/// - licences: array which contains licence model model /// - licences: array which contains licence model model
/// - completion: end downloading completion /// - completion: end downloading completion
class func downloadLicences(licences: [LicenceFile], func downloadLicences(licences: [LicenceFile],
config: OpenSourceControllerConfig, config: OpenSourceControllerConfig,
completion: @escaping () -> Void) { completion: @escaping () -> Void) {
// Number of licences let licenceGroupe = DispatchGroup()
let licenceCount = licences.count
// Already licence downloaded
var alreadyDownloaded = 0
// Download licence's detail for every lience // Download licence's detail for every lience
for licence in licences { for licence in licences {
licence.downloadLicenceDetail(config: config, completion: { () in licenceGroupe.enter()
alreadyDownloaded += 1
// If this is the last licence, perfom completion licence.downloadLicenceDetail(config: config, completion: { () in
if licenceCount == alreadyDownloaded { licenceGroupe.leave()
completion()
}
}) })
} }
// When everything is downloaded
licenceGroupe.notify(queue: .main) {
completion()
}
}
public init() {
} }
} }
+17 -18
View File
@@ -6,7 +6,7 @@
import UIKit import UIKit
public class LicenceFile: NSObject { open class LicenceFile {
// MARK- Var // MARK- Var
@@ -19,6 +19,16 @@ public class LicenceFile: NSObject {
/// Library's licence /// Library's licence
var detail: String? var detail: String?
/// Build attributed text
lazy var attributedContent: NSAttributedString = {
let libraryTitleAttribut = [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: UIFont.systemFontSize + 2)]
let libraryLicenceAttribut = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: UIFont.systemFontSize)]
let libraryTitle = NSMutableAttributedString(string: self.title ?? "", attributes: libraryTitleAttribut)
libraryTitle.append(NSAttributedString(string: "\n\n"))
libraryTitle.append(NSAttributedString(string: self.detail ?? "", attributes: libraryLicenceAttribut))
return libraryTitle
}()
// MARK- Init // MARK- Init
/// Licence initializer /// Licence initializer
@@ -29,8 +39,7 @@ public class LicenceFile: NSObject {
public init(title: String, url: String) { public init(title: String, url: String) {
self.title = title self.title = title
self.url = url self.url = url
self.detail = NSLocalizedString("Unable to load this licence file.", self.detail = NSLocalizedString("Unable to load this licence file.", comment: "")
comment: "")
} }
/// Download licence detail /// Download licence detail
@@ -38,22 +47,12 @@ public class LicenceFile: NSObject {
/// - Parameter completion: end of download handler /// - Parameter completion: end of download handler
func downloadLicenceDetail(config: OpenSourceControllerConfig, func downloadLicenceDetail(config: OpenSourceControllerConfig,
completion: @escaping () -> Void) { completion: @escaping () -> Void) {
if let url = URL(string: self.url) { let licenceHTTPLoader = HTTPDataLoader()
let task = URLSession.shared.dataTask(with: url) { (data, _, _) in licenceHTTPLoader.loadData(fromUrl: self.url) { (data) in
if let data = data, if let data = data, let html = String(data: data, encoding: String.Encoding.utf8) {
let html = String(data: data, encoding: String.Encoding.utf8) { self.detail = html
// Update licence model
self.detail = html
// Log
if config.verbose {
print("Licence for \(self.title ?? "") downloaded with success.")
}
}
completion()
} }
task.resume() completion()
} }
} }
} }
+49
View File
@@ -0,0 +1,49 @@
//
// OpenSourceController.swift
// Pods
//
// Created by Florian Gabach on 05/02/2017.
import UIKit
#if canImport(SwiftUI)
import SwiftUI
#endif
open class OpenSourceController: NSObject {
// Contains list of licence object
open var licences: [LicenceFile] = []
// Open source controller Configuration object
open var config = OpenSourceControllerConfig()
/// Present OpenSourceViewController embbeded in navigation controller
///
/// - Parameter from: the source controller
open func presentOpenSourceController(from: UIViewController) {
let loader: LicenceLoader = LicenceLoader()
let licenceController = OpenSourceViewController(licences: licences,
showCloseButton: true,
configuration: config,
licenceLoader: loader)
let navController = UINavigationController(rootViewController: licenceController)
from.present(navController, animated: true)
}
/// Push OpenSourceViewController from navigation controller
///
/// - Parameter from: the source controller
open func pushOpenSourceController(from: UIViewController) {
let loader: LicenceLoader = LicenceLoader()
let licenceController = OpenSourceViewController(licences: licences,
showCloseButton: false,
configuration: config,
licenceLoader: loader)
guard let navigationController = from.navigationController else {
assertionFailure("Source controller isn't embeded in navigation controller. Can't push.")
return
}
navigationController.pushViewController(licenceController, animated: true)
}
}
@@ -11,23 +11,21 @@ public struct OpenSourceControllerConfig {
/// Sub-stuct holding configuration relevant to UI presentation ! /// Sub-stuct holding configuration relevant to UI presentation !
public struct UIConfig { public struct UIConfig {
/// Will be applied to the navigation bar
public var barTintColor: UIColor?
/// Will be applied to the navigation bar /// Will be applied to the navigation bar
public var backgroundColor: UIColor? public var backgroundColor: UIColor = Style.background
/// Will be applied to licence text /// Will be applied to licence text
public var licenceBackgroundColor: UIColor? public var licenceBackgroundColor: UIColor = Style.background
/// Will be applied to the navigation bar /// Will be applied to the navigation bar
public var closeButtonColor: UIColor? public var closeButtonColor: UIColor = Style.label
/// Will be applied to licence text /// Will be applied to licence text
public var licenceTextColor: UIColor? public var licenceTextColor: UIColor = Style.label
/// Will be applied to licence text /// Will be applied to licence text
public var titleColor: UIColor? public var titleColor: UIColor = Style.label
} }
/// Will be applied to the navigation bar title /// Will be applied to the navigation bar title
@@ -37,5 +35,8 @@ public struct OpenSourceControllerConfig {
public var verbose: Bool = false public var verbose: Bool = false
/// UI-specific configuration. /// UI-specific configuration.
public init() {
}
public var uiConfig = UIConfig() public var uiConfig = UIConfig()
} }
@@ -8,13 +8,13 @@ import Foundation
extension Array { extension Array {
/// Get an index safely // MARK: - Helper
func get(at index: Int) -> Element? { func get(at index: Int) -> Element? {
guard index >= 0 guard index >= 0
&& index < count else { && index < count else {
return nil return nil
} }
return self[index] return self[index]
} }
} }
+19
View File
@@ -0,0 +1,19 @@
//
// Reusable.swift
// OpenSourceControllerDemo
//
// Created by Florian Gabach on 10/12/2018.
// Copyright © 2018 OpenSourceController. All rights reserved.
//
import Foundation
public protocol Reusable: class {
static var reuseIdentifier: String { get }
}
public extension Reusable {
static var reuseIdentifier: String {
return String(describing: self)
}
}
+27
View File
@@ -0,0 +1,27 @@
//
// UIColor+Extension.swift
// OpenSourceControllerDemo
//
// Created by Florian Gabach on 11/11/2019.
// Copyright © 2019 OpenSourceController. All rights reserved.
//
import UIKit
struct Style {
static var background: UIColor {
if #available(iOS 13.0, *) {
return UIColor.systemBackground
} else {
return UIColor.black
}
}
static var label: UIColor {
if #available(iOS 13.0, *) {
return UIColor.label
} else {
return UIColor.black
}
}
}
@@ -0,0 +1,28 @@
//
// UITableView+Extensions.swift
// OpenSourceControllerDemo
//
// Created by Florian Gabach on 10/12/2018.
// Copyright © 2018 OpenSourceController. All rights reserved.
//
import UIKit
extension UITableView {
open func register<T: UITableViewCell>(cellType: T.Type)
where T: Reusable {
self.register(cellType.self, forCellReuseIdentifier: cellType.reuseIdentifier)
}
open func dequeueReusableCell<T: UITableViewCell>(for indexPath: IndexPath, cellType: T.Type = T.self) -> T
where T: Reusable {
guard let cell = self.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier, for: indexPath) as? T else {
fatalError(
"Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self). "
+ "Check that the reuseIdentifier is set properly in your XIB/Storyboard "
+ "and that you registered the cell beforehand"
)
}
return cell
}
}
+26
View File
@@ -0,0 +1,26 @@
//
// File.swift
// OpenSourceControllerDemo
//
// Created by Florian Gabach on 23/10/2018.
// Copyright © 2018 OpenSourceController. All rights reserved.
//
import UIKit
extension UIView {
// MARK: - Layout
func pinEdges(to other: UIView, withBorderSize size: CGFloat = 0.0) {
self.leadingAnchor.constraint(equalTo: other.leadingAnchor, constant: size).isActive = true
self.trailingAnchor.constraint(equalTo: other.trailingAnchor, constant: size).isActive = true
self.topAnchor.constraint(equalTo: other.topAnchor, constant: size).isActive = true
self.bottomAnchor.constraint(equalTo: other.bottomAnchor, constant: -size).isActive = true
}
func pinCenter(to other: UIView) {
self.centerXAnchor.constraint(equalTo: other.centerXAnchor).isActive = true
self.centerYAnchor.constraint(equalTo: other.centerYAnchor).isActive = true
}
}
@@ -0,0 +1,30 @@
//
// UIViewController+Extensions.swift
// OpenSourceControllerDemo
//
// Created by Florian Gabach on 23/10/2018.
// Copyright © 2018 OpenSourceController. All rights reserved.
//
import UIKit
extension UIViewController {
// MARK: - Child
func add(_ child: UIViewController) {
self.addChild(child)
self.view.addSubview(child.view)
view.pinEdges(to: child.view)
child.didMove(toParent: self)
}
func remove() {
guard parent != nil else {
return
}
self.willMove(toParent: nil)
self.removeFromParent()
self.view.removeFromSuperview()
}
}
@@ -1,69 +0,0 @@
//
// OpenSourceTableViewCell.swift
// Pods
//
// Created by Florian Gabach on 05/02/2017.
import UIKit
class OpenSourceTableViewCell: UITableViewCell {
// MARK: - Lifecycle
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: .default,
reuseIdentifier: reuseIdentifier)
// Prepare cell
self.prepareCellComponent()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
override func layoutSubviews() {
super.layoutSubviews()
}
// MARK: - Prepare
func prepareCellComponent() {
// Text
self.textLabel?.numberOfLines = 0
// Common init
self.accessoryType = .none
self.selectionStyle = .none
}
// MARK: - Configure
/// Initialize the cell content with Licence model
///
/// - Parameter licence: the licence model
func configure(licence: LicenceFile, config: OpenSourceControllerConfig) {
// Build attributed text
let libraryTitleAttribut = [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: UIFont.systemFontSize + 2)]
let libraryLicenceAttribut = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: UIFont.systemFontSize)]
let libraryTitle = NSMutableAttributedString(string: licence.title ?? "",
attributes: libraryTitleAttribut)
libraryTitle.append(NSAttributedString(string: "\n\n"))
libraryTitle.append(NSAttributedString(string: licence.detail ?? "",
attributes: libraryLicenceAttribut))
// Set text
self.textLabel?.attributedText = libraryTitle
self.textLabel?.textColor = config.uiConfig.licenceTextColor
// Background
if let backgroundColor = config.uiConfig.licenceBackgroundColor {
self.backgroundColor = backgroundColor
}
}
}
+6
View File
@@ -0,0 +1,6 @@
# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app
# apple_id("[[APPLE_ID]]") # Your Apple email address
# For more information about the Appfile, see:
# https://docs.fastlane.tools/advanced/#appfile
+36
View File
@@ -0,0 +1,36 @@
# Usage : bundle exec fastlane ios (patch | minor | major)
default_platform(:ios)
platform :ios do
desc "Release a new version with a patch bump_type"
lane :patch do
release("patch")
end
desc "Release a new version with a minor bump_type"
lane :minor do
release("minor")
end
desc "Release a new version with a major bump_type"
lane :major do
release("major")
end
desc "Scan the project"
lane :scan_project do
scan(scheme: "OpenSourceController-iOS")
end
def release(type)
podspec_name = "OpenSourceController.podspec"
pod_lib_lint(use_bundle_exec: false)
version = version_bump_podspec(path: podspec_name, bump_type: type)
git_add(path: podspec_name)
git_commit(path: [podspec_name], message: "#{version} release")
add_git_tag(tag: "#{version}")
push_to_git_remote
pod_push(use_bundle_exec: false)
end
end
+44
View File
@@ -0,0 +1,44 @@
fastlane documentation
================
# Installation
Make sure you have the latest version of the Xcode command line tools installed:
```
xcode-select --install
```
Install _fastlane_ using
```
[sudo] gem install fastlane -NV
```
or alternatively using `brew cask install fastlane`
# Available Actions
## iOS
### ios patch
```
fastlane ios patch
```
Release a new version with a patch bump_type
### ios minor
```
fastlane ios minor
```
Release a new version with a minor bump_type
### ios major
```
fastlane ios major
```
Release a new version with a major bump_type
### ios buildproject
```
fastlane ios buildproject
```
Build the project
----
This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run.
More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
+126
View File
@@ -0,0 +1,126 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test Results | xcpretty</title>
<style type="text/css">
body { font-family:Avenir Next, Helvetica Neue, sans-serif; color: #4A4A4A; background-color: #F0F3FB; margin:0;}
h1 { font-weight: normal; font-size: 24px; margin: 10px 0 0 0;}
h3 { font-weight: normal; margin: 2px; font-size: 1.1em;}
header { position: fixed;width: 100%;background: rgba(249, 254, 255, 0.9);margin: 0;padding: 10px;}
header:before, header:after { content:""; display:table;}
header:after { clear:both;}
a:link { color: #A1D761;}
footer { clear: both;position: relative;z-index: 10;height: 40px;margin-top: -10px; margin-left:30px; font-size:12px;}
table { width:100%; border-collapse: collapse;}
tr td:first-child { width:7%}
.left { float: left; margin-left:30px;}
.right { float: right; margin-right: 40px; margin-top: 0; margin-bottom:0;}
.test-suite { margin: 0 0 30px 0;}
.test-suite > .heading { font-family:Menlo, Monaco, monospace; font-weight: bold; border-color: #A1D761; background-color: #B8E986; border-width: 1px;}
.test-suite.failing > .heading { border-color: #C84F5E; background-color: #E58591;}
.test-suite > .heading > .title { margin-top: 4px; margin-left: 10px;}
.tests { overflow: scroll;margin: 0 30px 0 60px;}
.test, .test-suite > .heading { height: 30px; overflow: hidden; margin: 0 30px;}
.test, .test-suite > .heading { border-width: 1px; border-collapse: collapse; border-style: solid; }
.test { margin-left: 30px; border-top:none;}
.test.failing { border-color: #C84F5E; background-color: #F4DDE0;}
.test.passing { border-color: #A1D761;}
.test.failing { background-color: #E7A1AA;}
.test.passing { background-color: #CAF59F;}
.test.failing.odd { background-color: #EEC7CC;}
.test.passing.odd { background-color: #E5FBCF;}
.details.failing { background-color: #F4DDE0; border: 1px solid #C84F5E;}
.details.passing { background-color: #E5F4DC; border: 1px solid #A1D761;}
.test .test-detail:last-child { padding-bottom: 8px;}
.test .title { float: left; font-size: 0.9em; margin-top: 8px; font-family: Menlo, Monaco, monospace;}
.test .time { float: left;margin: 4px 10px 0 20px;}
.test-detail { font-family:Menlo, Monaco, monospace; font-size: 0.9em; margin: 5px 0 5px 0px;}
.screenshots { height: auto; overflow: hidden; padding: 4px 4px 0 4px; background-color: #B8E986; border: #A1D761; border-width: 0 1px; border-style: solid; }
.screenshots.failing { border-color: #C84F5E; background-color: #E58591; }
.screenshot { max-height: 60px; float: left; transition: max-height 0.2s; margin: 0 4px 4px 0 }
.screenshot.selected { max-height: 568px; }
#test-suites { display: inline-block; width: 100%;margin-top:100px;}
#segment-bar { margin-top: 10px;margin-left: 14px;float:right;}
#segment-bar a:first-child { border-radius: 9px 0 0 9px; border-right: none;}
#segment-bar a:last-child { border-radius: 0 9px 9px 0; border-left: none;}
#segment-bar > a { color: #565656; border: 2px solid #7B7B7B; width: 80px; font-weight: bold; display:inline-block;text-align:center; font-weight: normal;}
#segment-bar > a.selected { background-color: #979797; color: #F0F3FB;}
#counters { float: left;margin: 10px;text-align: right;}
#counters h2 { font-size: 16px; font-family: Avenir, sans-serif; font-weight: lighter; display:inline;}
#counters .number { font-size: 20px;}
#fail-count { color: #D0021B; margin-left:10px;}
@media (max-width: 640px) {
h1, #counters, #segment-bar { margin: 5px auto; text-align:center;}
header, #segment-bar { width: 100%; position: relative; background:none;}
.left, .right { float:none; margin:0;}
#test-suites { margin-top: 0;}
#counters { float:none;}
}
</style>
<script type="text/javascript">
var hide = function(element) { element.style.display = 'none';}
var show = function(element) { element.style.display = '';}
var isHidden = function(element) { return element.style.display == 'none';}
var isSelected = function(element) { return element.classList.contains("selected");}
var deselect = function(element) { return element.classList.remove("selected");}
var select = function(element) { return element.classList.add("selected");}
var toggle = function(element) { isHidden(element) ? show(element) : hide(element);};
var toggleTests = function(heading) { toggle(heading.parentNode.children[1]);};
var toggleDetails = function(detailClass) {
var details = document.querySelectorAll('.' + detailClass);
for (var i = details.length - 1; i >= 0; i--) { toggle(details[i]);};
};
var hideAll = function(collection) {
for (var i = collection.length - 1; i >= 0; i--) { hide(collection[i]); };
}
var showAll = function(collection) {
for (var i = collection.length - 1; i >= 0; i--) { show(collection[i]); };
}
var selectSegment = function(segment) {
if (isSelected(segment)) return;
var segments = document.querySelectorAll('#segment-bar > a');
for (var i = segments.length - 1; i >= 0; i--) { deselect(segments[i]);};
select(segment);
if (segment.id == "all-segment") {
showAll(document.querySelectorAll('.test-suite'));
showAll(document.querySelectorAll('.test'));
} else if (segment.id == "failing-segment") {
hideAll(document.querySelectorAll('.test.passing'));
showAll(document.querySelectorAll('.test.failing'));
hideAll(document.querySelectorAll('.test-suite.passing'));
showAll(document.querySelectorAll('.test-suite.failing'));
} else if (segment.id == "passing-segment") {
hideAll(document.querySelectorAll('.test.failing'));
showAll(document.querySelectorAll('.test.passing'));
hideAll(document.querySelectorAll('.test-suite.failing'));
showAll(document.querySelectorAll('.test-suite.passing'));
}
}
var toggleScreenshot = function(suiteName, index) {
var screenshot = document.getElementById("screenshot-" + suiteName + "-" + index);
isSelected(screenshot) ? deselect(screenshot) : select(screenshot);
}
</script>
</head>
<body>
<header>
<section class="left">
<h1>Test Results</h1>
</section>
<section class="right">
<section id="counters">
<h2 id="test-count"><span class="number">0</span> tests</h2>
</section>
<section id="segment-bar">
<a id="all-segment" onclick="selectSegment(this);" class="selected">All</a><a id="failing-segment" onclick="selectSegment(this);">Failing</a><a id="passing-segment" onclick="selectSegment(this);">Passing</a>
</section>
</section>
</header>
<section id="test-suites">
</section>
<footer>Report generated with <a href="https://github.com/supermarin/xcpretty">xcpretty</a></footer>
</body>
</html>
+2
View File
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<testsuites tests='0' failures='0'/>