├── SelectVideoAndConvert
├── GCMImagePicker
│ ├── add_01@2x.png
│ ├── add_01@3x.png
│ ├── GCMImagePickerController.h
│ ├── GCMCollectionViewController.h
│ ├── GCMGroupCell.h
│ ├── GCMAssetsGroupController.h
│ ├── GCMAssetModel.h
│ ├── GCMGroupCell.m
│ ├── GCMImagePickerController.m
│ ├── GCMAssetsGroupController.m
│ ├── GCMAssetModel.m
│ └── GCMCollectionViewController.m
├── ViewController.h
├── AppDelegate.h
├── main.m
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Base.lproj
│ ├── Main.storyboard
│ └── LaunchScreen.storyboard
├── Info.plist
├── ViewController.m
└── AppDelegate.m
├── SelectVideoAndConvert.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcuserdata
│ │ └── macavilang.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
├── xcuserdata
│ └── macavilang.xcuserdatad
│ │ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── SelectVideoAndConvert.xcscheme
└── project.pbxproj
├── SelectVideoAndConvertTests
├── Info.plist
└── SelectVideoAndConvertTests.m
├── SelectVideoAndConvertUITests
├── Info.plist
└── SelectVideoAndConvertUITests.m
└── README.md
/SelectVideoAndConvert/GCMImagePicker/add_01@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Snoopy008/SelectVideoAndConvert/HEAD/SelectVideoAndConvert/GCMImagePicker/add_01@2x.png
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/add_01@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Snoopy008/SelectVideoAndConvert/HEAD/SelectVideoAndConvert/GCMImagePicker/add_01@3x.png
--------------------------------------------------------------------------------
/SelectVideoAndConvert.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert.xcodeproj/project.xcworkspace/xcuserdata/macavilang.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Snoopy008/SelectVideoAndConvert/HEAD/SelectVideoAndConvert.xcodeproj/project.xcworkspace/xcuserdata/macavilang.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/SelectVideoAndConvert/ViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.h
3 | // SelectVideoAndConvert
4 | //
5 | // Created by macavilang on 16/7/4.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ViewController : UIViewController
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // SelectVideoAndConvert
4 | //
5 | // Created by macavilang on 16/7/4.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 |
16 | @end
17 |
18 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // SelectVideoAndConvert
4 | //
5 | // Created by macavilang on 16/7/4.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "AppDelegate.h"
11 |
12 | int main(int argc, char * argv[]) {
13 | @autoreleasepool {
14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMImagePickerController.h:
--------------------------------------------------------------------------------
1 | //
2 | // GCMImagePickerController.h
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface GCMImagePickerController : UINavigationController
12 |
13 | @property (nonatomic,copy) void(^didFinishSelectImageModels)(NSMutableArray *models);
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMCollectionViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // GCMCollectionViewController.h
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @class ALAssetsGroup;
12 | @interface GCMCollectionViewController : UICollectionViewController
13 |
14 | @property (nonatomic,strong) ALAssetsGroup *group;
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMGroupCell.h:
--------------------------------------------------------------------------------
1 | //
2 | // GCMGroupCell.h
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface GCMGroupCell : UITableViewCell
13 |
14 | @property (nonatomic,strong) ALAssetsGroup *group;
15 | + (instancetype)groupCell:(UITableView *)tableView;
16 | @end
17 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMAssetsGroupController.h:
--------------------------------------------------------------------------------
1 | //
2 | // GCMAssetsGroupController.h
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @class ALAssetsLibrary;
12 | @interface GCMAssetsGroupController : UITableViewController
13 |
14 | @property (nonatomic,strong) ALAssetsLibrary *assetsLibrary;
15 | @property (nonatomic,strong) NSMutableArray *groups;
16 |
17 | @end
18 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMAssetModel.h:
--------------------------------------------------------------------------------
1 | //
2 | // GCMAssetModel.h
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface GCMAssetModel : NSObject
12 |
13 | @property (nonatomic,strong) UIImage *thumbnail;//缩略图
14 | @property (nonatomic,copy) NSURL *imageURL;//原图url,是AssetURL
15 | @property (nonatomic,assign) BOOL isSelected;//是否被选中
16 |
17 | @property (nonatomic,assign) BOOL isImage;//是否是图片
18 | @property (nonatomic,copy) NSString *sandboxPath;//文件存储在本地的路径
19 | @property (nonatomic,copy) NSString *fileName;//文件名
20 | @property (nonatomic,copy) NSData *fileData;//文件的NSData
21 | - (void)originalImage:(void (^)(UIImage *image))returnImage;//获取原图
22 |
23 | - (void) convertVideoWithModel:(GCMAssetModel *) model;
24 | @end
25 |
--------------------------------------------------------------------------------
/SelectVideoAndConvertTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/SelectVideoAndConvertUITests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert.xcodeproj/xcuserdata/macavilang.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | SelectVideoAndConvert.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 4A4799121D2A5FEC0037A9DD
16 |
17 | primary
18 |
19 |
20 | 4A47992B1D2A5FEC0037A9DD
21 |
22 | primary
23 |
24 |
25 | 4A4799361D2A5FEC0037A9DD
26 |
27 | primary
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/SelectVideoAndConvertTests/SelectVideoAndConvertTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // SelectVideoAndConvertTests.m
3 | // SelectVideoAndConvertTests
4 | //
5 | // Created by macavilang on 16/7/4.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface SelectVideoAndConvertTests : XCTestCase
12 |
13 | @end
14 |
15 | @implementation SelectVideoAndConvertTests
16 |
17 | - (void)setUp {
18 | [super setUp];
19 | // Put setup code here. This method is called before the invocation of each test method in the class.
20 | }
21 |
22 | - (void)tearDown {
23 | // Put teardown code here. This method is called after the invocation of each test method in the class.
24 | [super tearDown];
25 | }
26 |
27 | - (void)testExample {
28 | // This is an example of a functional test case.
29 | // Use XCTAssert and related functions to verify your tests produce the correct results.
30 | }
31 |
32 | - (void)testPerformanceExample {
33 | // This is an example of a performance test case.
34 | [self measureBlock:^{
35 | // Put the code you want to measure the time of here.
36 | }];
37 | }
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "29x29",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "40x40",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "40x40",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "60x60",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "60x60",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "ipad",
35 | "size" : "29x29",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "ipad",
40 | "size" : "29x29",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "40x40",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "40x40",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "76x76",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "76x76",
61 | "scale" : "2x"
62 | }
63 | ],
64 | "info" : {
65 | "version" : 1,
66 | "author" : "xcode"
67 | }
68 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SelectVideoAndConvert
2 |
3 | Sorry,一直没来得及写说明文档,导致加了很多同行的QQ。
4 |
5 |
6 | 运行demo后你会发现界面一片空白,这是正常的。我用的触发方法是touchesBegan,所以你只需点击空白界面就会有反应。
7 |
8 | 每个人的需求会不一样,这也是我没把它做成framework的原因
9 |
10 | 在GCMGroupCell.m里,allAssets代表所有相册文件,allPhotos代表所有图片,allVideos代表所有视频
11 | ```
12 | [group setAssetsFilter:[ALAssetsFilter allAssets]];
13 | ```
14 | 在GCMCollectionViewController.m里,只需要注意这个方法,根据需要把对应的注释掉
15 | ```
16 | - (void)setGroup:(ALAssetsGroup *)group{
17 | _group = group;
18 | [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
19 | if (asset == nil) return ;
20 | GCMAssetModel *model = [[GCMAssetModel alloc] init];
21 | if (![[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {//不是图片
22 | model.thumbnail = [UIImage imageWithCGImage:asset.thumbnail];
23 | model.imageURL = asset.defaultRepresentation.url;
24 | model.isImage = NO;
25 | [self.assetModels addObject:model];
26 | }else{//图片
27 | model.thumbnail = [UIImage imageWithCGImage:asset.thumbnail];
28 | model.imageURL = asset.defaultRepresentation.url;
29 | model.isImage = YES;
30 | [self.assetModels addObject:model];
31 | }
32 | }];
33 |
34 | }
35 | ```
36 | 视频压缩部分我就不做解说了,简书上对应有所说明
37 |
38 | 注:视频上传部分代码里没有,不过我已经将你所需要上传data放在Model里了,你拿着Model和接口对接一下就可以了。
39 | 请使用真机调试。
40 | 请认真看本人简书里《iOS存储之沙盒存储常用方法》这篇文章,这篇文章与这个功能的实现有莫大的关系,所以请务必要看。
41 |
42 |
--------------------------------------------------------------------------------
/SelectVideoAndConvertUITests/SelectVideoAndConvertUITests.m:
--------------------------------------------------------------------------------
1 | //
2 | // SelectVideoAndConvertUITests.m
3 | // SelectVideoAndConvertUITests
4 | //
5 | // Created by macavilang on 16/7/4.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface SelectVideoAndConvertUITests : XCTestCase
12 |
13 | @end
14 |
15 | @implementation SelectVideoAndConvertUITests
16 |
17 | - (void)setUp {
18 | [super setUp];
19 |
20 | // Put setup code here. This method is called before the invocation of each test method in the class.
21 |
22 | // In UI tests it is usually best to stop immediately when a failure occurs.
23 | self.continueAfterFailure = NO;
24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
25 | [[[XCUIApplication alloc] init] launch];
26 |
27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
28 | }
29 |
30 | - (void)tearDown {
31 | // Put teardown code here. This method is called after the invocation of each test method in the class.
32 | [super tearDown];
33 | }
34 |
35 | - (void)testExample {
36 | // Use recording to get started writing UI tests.
37 | // Use XCTAssert and related functions to verify your tests produce the correct results.
38 | }
39 |
40 | @end
41 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UISupportedInterfaceOrientations
34 |
35 | UIInterfaceOrientationPortrait
36 | UIInterfaceOrientationLandscapeLeft
37 | UIInterfaceOrientationLandscapeRight
38 |
39 | UISupportedInterfaceOrientations~ipad
40 |
41 | UIInterfaceOrientationPortrait
42 | UIInterfaceOrientationPortraitUpsideDown
43 | UIInterfaceOrientationLandscapeLeft
44 | UIInterfaceOrientationLandscapeRight
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMGroupCell.m:
--------------------------------------------------------------------------------
1 | //
2 | // GCMGroupCell.m
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import "GCMGroupCell.h"
10 | #define MARGIN 10
11 |
12 | @implementation GCMGroupCell
13 |
14 | + (instancetype)groupCell:(UITableView *)tableView{
15 | NSString *reusedId = @"groupCell";
16 | GCMGroupCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedId];
17 | if (cell == nil) {
18 | cell = [[self alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusedId];
19 | }
20 | return cell;
21 | }
22 | - (void)setGroup:(ALAssetsGroup *)group{
23 | //中文
24 | NSString *groupName = [group valueForProperty:ALAssetsGroupPropertyName];
25 | if ([groupName isEqualToString:@"Camera Roll"]) {
26 | groupName = @"相机";
27 | } else if ([groupName isEqualToString:@"My Photo Stream"]) {
28 | groupName = @"我的照片";
29 | }
30 | //设置属性
31 |
32 |
33 | [group setAssetsFilter:[ALAssetsFilter allVideos]];//这里区分是所有相册文件还是图片或视频
34 |
35 |
36 |
37 | NSInteger groupCount = [group numberOfAssets];
38 | self.textLabel.text = [NSString stringWithFormat:@"%@ (%ld)",groupName, (long)groupCount];
39 | UIImage *image =[UIImage imageWithCGImage:group.posterImage] ;
40 | [self.imageView setImage:image];
41 | self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
42 | }
43 |
44 |
45 | - (void)layoutSubviews{
46 | [super layoutSubviews];
47 | CGFloat cellHeight = self.frame.size.height - 2 * MARGIN;
48 | self.imageView.frame = CGRectMake(MARGIN, MARGIN, cellHeight, cellHeight);
49 | }
50 |
51 | @end
52 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/ViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.m
3 | // SelectVideoAndConvert
4 | //
5 | // Created by macavilang on 16/7/4.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import "ViewController.h"
10 | #import "GCMImagePickerController.h"
11 | #import "GCMAssetModel.h"
12 |
13 | //生成随机数
14 | #define RandomNum (arc4random() % 9999999999999999)
15 |
16 | @interface ViewController ()
17 |
18 | @end
19 |
20 | @implementation ViewController
21 | {
22 | NSMutableArray *videoModelArray;
23 | }
24 |
25 | - (void)viewDidLoad {
26 | [super viewDidLoad];
27 | // Do any additional setup after loading the view, typically from a nib.
28 | videoModelArray = [NSMutableArray array];
29 | }
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | //触发方法
39 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
40 | GCMImagePickerController *picker = [[GCMImagePickerController alloc] init];
41 | //返回选中的原图
42 | [picker setDidFinishSelectImageModels:^(NSMutableArray *models) {
43 | NSLog(@"原图%@",models);
44 | for (GCMAssetModel *videoModel in models) {
45 | videoModel.fileName = [NSString stringWithFormat:@"%ld.mp4",RandomNum];
46 |
47 | //转码压缩存储至本地(如果想修改存储路径和压缩比例看方法内部)
48 | [videoModel convertVideoWithModel:videoModel];
49 |
50 | //所有数据都在模型数组里,想要的数据具体看模型,模型(GCMAssetModel)里面写的很清楚
51 | //解码是异步的,但指针始终指向videoModel这个对象,所以在这边打印fileData可能为null,这是正常现象,过十几秒fileData就有数据了。
52 | [videoModelArray addObject:videoModel];
53 | }
54 | }];
55 | [self presentViewController:picker animated:YES completion:nil];
56 | }
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | - (void)didReceiveMemoryWarning {
67 | [super didReceiveMemoryWarning];
68 | // Dispose of any resources that can be recreated.
69 | }
70 |
71 | @end
72 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // SelectVideoAndConvert
4 | //
5 | // Created by macavilang on 16/7/4.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 |
11 | @interface AppDelegate ()
12 |
13 | @end
14 |
15 | @implementation AppDelegate
16 |
17 |
18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
19 | // Override point for customization after application launch.
20 | return YES;
21 | }
22 |
23 | - (void)applicationWillResignActive:(UIApplication *)application {
24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
25 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
26 | }
27 |
28 | - (void)applicationDidEnterBackground:(UIApplication *)application {
29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
31 | }
32 |
33 | - (void)applicationWillEnterForeground:(UIApplication *)application {
34 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
35 | }
36 |
37 | - (void)applicationDidBecomeActive:(UIApplication *)application {
38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
39 | }
40 |
41 | - (void)applicationWillTerminate:(UIApplication *)application {
42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
43 | }
44 |
45 | @end
46 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMImagePickerController.m:
--------------------------------------------------------------------------------
1 | //
2 | // GCMImagePickerController.m
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import "GCMImagePickerController.h"
10 | #import "GCMAssetsGroupController.h"
11 |
12 | @interface GCMImagePickerController ()
13 |
14 | @property (nonatomic,strong) GCMAssetsGroupController *assetsGroupVC;
15 |
16 | @end
17 |
18 | @implementation GCMImagePickerController
19 |
20 | - (void)viewDidLoad {
21 | [super viewDidLoad];
22 |
23 | }
24 |
25 | - (instancetype)init{
26 |
27 | if (self = [super initWithRootViewController:self.assetsGroupVC]) {
28 | UINavigationBar *navBar = [UINavigationBar appearance];
29 | //导航条背景色
30 | navBar.barTintColor = [UIColor redColor];
31 |
32 | }
33 | return self;
34 | }
35 |
36 |
37 | - (instancetype)initWithRootViewController:(UIViewController *)rootViewController{
38 | return [self init];
39 | }
40 | - (GCMAssetsGroupController *)assetsGroupVC{
41 | if (_assetsGroupVC == nil) {
42 | _assetsGroupVC = [[GCMAssetsGroupController alloc] init];
43 | UILabel *titleLabel = [[UILabel alloc] init];
44 | titleLabel.textColor = [UIColor whiteColor];
45 | titleLabel.textAlignment = NSTextAlignmentCenter;
46 | titleLabel.text = @"选择相册";
47 | titleLabel.font = [UIFont systemFontOfSize:22];
48 | [titleLabel sizeToFit];
49 | _assetsGroupVC.navigationItem.titleView = titleLabel;
50 |
51 |
52 | UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 60, 30)];
53 | [backButton setTitle:@" 返回" forState:UIControlStateNormal];
54 | [backButton setImage:[UIImage imageNamed:@"nav_back"] forState:UIControlStateNormal];
55 | [backButton addTarget:self action:@selector(dismiss) forControlEvents:UIControlEventTouchUpInside];
56 | UIBarButtonItem *leftButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
57 |
58 |
59 | _assetsGroupVC.navigationItem.leftBarButtonItem = leftButtonItem;
60 | }
61 | return _assetsGroupVC;
62 | }
63 |
64 |
65 | - (void)dismiss{
66 | [self dismissViewControllerAnimated:YES completion:nil];
67 | }
68 |
69 | @end
70 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMAssetsGroupController.m:
--------------------------------------------------------------------------------
1 | //
2 | // GCMAssetsGroupController.m
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import "GCMAssetsGroupController.h"
10 | #import "GCMGroupCell.h"
11 | #import "GCMCollectionViewController.h"
12 | #import
13 |
14 |
15 | @interface GCMAssetsGroupController ()
16 |
17 | @end
18 |
19 | @implementation GCMAssetsGroupController
20 |
21 |
22 | - (ALAssetsLibrary *)assetsLibrary{
23 | if (_assetsLibrary == nil) {
24 | _assetsLibrary = [[ALAssetsLibrary alloc] init];
25 | }
26 | return _assetsLibrary;
27 | }
28 | - (NSMutableArray *)groups{
29 | if (_groups == nil) {
30 | _groups = [NSMutableArray array];
31 | dispatch_async(dispatch_get_main_queue(), ^{
32 | [self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
33 | if(group){
34 | [_groups addObject:group];
35 | [self.tableView reloadData];
36 | }
37 | } failureBlock:^(NSError *error) {
38 | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"访问相册失败" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil];
39 | [alertView show];
40 | }];
41 | });
42 | }
43 | return _groups;
44 | }
45 | - (void)viewDidLoad {
46 | [super viewDidLoad];
47 | self.tableView.tableFooterView = [[UIView alloc] init];
48 | self.tableView.separatorInset = UIEdgeInsetsZero;
49 |
50 | //返回按钮
51 | UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 80, 30)];
52 | [backButton setTitle:@" 返回相册" forState:UIControlStateNormal];
53 | [backButton setImage:[UIImage imageNamed:@"nav_back"] forState:UIControlStateNormal];
54 | UIBarButtonItem *leftButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
55 | self.navigationItem.backBarButtonItem = leftButtonItem;
56 | }
57 |
58 |
59 | #pragma mark - -----------------代理方法-----------------
60 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
61 | return self.groups.count;
62 | }
63 |
64 |
65 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
66 | GCMGroupCell *cell = [GCMGroupCell groupCell:tableView];
67 | ALAssetsGroup *group = [self.groups objectAtIndex:indexPath.row];
68 | cell.group = group;
69 | return cell;
70 | }
71 |
72 |
73 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
74 | return 108;
75 | }
76 |
77 |
78 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
79 | GCMCollectionViewController *collectionVC = [[GCMCollectionViewController alloc] init];
80 | collectionVC.group = self.groups[indexPath.row];
81 | [self.navigationController pushViewController:collectionVC animated:YES];
82 | }
83 |
84 | @end
85 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMAssetModel.m:
--------------------------------------------------------------------------------
1 | //
2 | // GCMAssetModel.m
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import "GCMAssetModel.h"
10 | #import
11 | #import
12 |
13 | @implementation GCMAssetModel
14 |
15 | - (void)originalImage:(void (^)(UIImage *))returnImage{
16 | ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init];
17 | [lib assetForURL:self.imageURL resultBlock:^(ALAsset *asset) {
18 | ALAssetRepresentation *rep = asset.defaultRepresentation;
19 | CGImageRef imageRef = rep.fullResolutionImage;
20 | UIImage *image = [UIImage imageWithCGImage:imageRef scale:rep.scale orientation:(UIImageOrientation)rep.orientation];
21 | if (image) {
22 | returnImage(image);
23 | }
24 | } failureBlock:^(NSError *error) {
25 |
26 | }];
27 | }
28 |
29 | - (void) convertVideoWithModel:(GCMAssetModel *) model
30 | {
31 |
32 | [self creatSandBoxFilePathIfNoExist];
33 | //保存至沙盒路径
34 | NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
35 | NSString *videoPath = [NSString stringWithFormat:@"%@/Video", pathDocuments];
36 | model.sandboxPath = [videoPath stringByAppendingPathComponent:model.fileName];
37 |
38 | //转码配置
39 | AVURLAsset *asset = [AVURLAsset URLAssetWithURL:model.imageURL options:nil];
40 |
41 | //AVAssetExportPresetMediumQuality可以更改,是枚举类型,官方有提供,更改该值可以改变视频的压缩比例
42 | AVAssetExportSession *exportSession= [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
43 | exportSession.shouldOptimizeForNetworkUse = YES;
44 | exportSession.outputURL = [NSURL fileURLWithPath:model.sandboxPath];
45 | //AVFileTypeMPEG4 文件输出类型,可以更改,是枚举类型,官方有提供,更改该值也可以改变视频的压缩比例
46 | exportSession.outputFileType = AVFileTypeMPEG4;
47 | [exportSession exportAsynchronouslyWithCompletionHandler:^{
48 | int exportStatus = exportSession.status;
49 | NSLog(@"%d",exportStatus);
50 | switch (exportStatus)
51 | {
52 | case AVAssetExportSessionStatusFailed:
53 | {
54 | // log error to text view
55 | NSError *exportError = exportSession.error;
56 | NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);
57 | break;
58 | }
59 | case AVAssetExportSessionStatusCompleted:
60 | {
61 | NSLog(@"视频转码成功");
62 | NSData *data = [NSData dataWithContentsOfFile:model.sandboxPath];
63 | model.fileData = data;
64 | }
65 | }
66 | }];
67 |
68 | }
69 |
70 |
71 | - (void)creatSandBoxFilePathIfNoExist
72 | {
73 | //沙盒路径
74 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
75 | NSString *documentDirectory = [paths objectAtIndex:0];
76 | NSLog(@"databse--->%@",documentDirectory);
77 |
78 | NSFileManager *fileManager = [[NSFileManager alloc] init];
79 | NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
80 | //创建目录
81 | NSString *createPath = [NSString stringWithFormat:@"%@/Video", pathDocuments];
82 | // 判断文件夹是否存在,如果不存在,则创建
83 | if (![[NSFileManager defaultManager] fileExistsAtPath:createPath]) {
84 | [fileManager createDirectoryAtPath:createPath withIntermediateDirectories:YES attributes:nil error:nil];
85 | } else {
86 | NSLog(@"FileImage is exists.");
87 | }
88 | }
89 |
90 | @end
91 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert.xcodeproj/xcuserdata/macavilang.xcuserdatad/xcschemes/SelectVideoAndConvert.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
43 |
49 |
50 |
51 |
52 |
53 |
59 |
60 |
61 |
62 |
63 |
64 |
74 |
76 |
82 |
83 |
84 |
85 |
86 |
87 |
93 |
95 |
101 |
102 |
103 |
104 |
106 |
107 |
110 |
111 |
112 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert/GCMImagePicker/GCMCollectionViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // GCMCollectionViewController.m
3 | // SelectMediumFile
4 | //
5 | // Created by macavilang on 16/6/28.
6 | // Copyright © 2016年 Snoopy. All rights reserved.
7 | //
8 |
9 | #import "GCMCollectionViewController.h"
10 | #import
11 | #import "GCMAssetModel.h"
12 | #import "GCMImagePickerController.h"
13 | #import
14 | static const NSInteger MARGIN = 10;
15 | static const NSInteger COL = 4;
16 | #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
17 | #define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
18 |
19 |
20 |
21 | @interface GCMShowCell : UICollectionViewCell
22 | @property (nonatomic,weak) UIButton *selectedButton;
23 | @end
24 |
25 | @implementation GCMShowCell
26 |
27 | @end
28 |
29 | @interface GCMCollectionViewController ()
30 | @property (nonatomic,strong) NSMutableArray *assetModels;
31 | //选中的模型
32 | @property (nonatomic,strong) NSMutableArray *selectedModels;
33 | @end
34 |
35 | @implementation GCMCollectionViewController
36 | {
37 | UIButton *bigImg;
38 | UIView *cover;
39 | }
40 |
41 |
42 | static NSString * const reuseIdentifier = @"Cell";
43 | //设置类型
44 | - (instancetype)init
45 | {
46 | UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
47 | flowLayout.minimumLineSpacing = MARGIN;
48 | flowLayout.minimumInteritemSpacing = MARGIN;
49 | CGFloat cellHeight = (SCREEN_WIDTH - (COL + 1) * MARGIN) / COL;
50 | flowLayout.itemSize = CGSizeMake(cellHeight, cellHeight);
51 | flowLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);
52 | return [super initWithCollectionViewLayout:flowLayout];
53 | }
54 |
55 |
56 | - (NSMutableArray *)assetModels{
57 | if (_assetModels == nil) {
58 | _assetModels = [NSMutableArray array];
59 | }
60 | return _assetModels;
61 | }
62 | - (NSMutableArray *)selectedModels{
63 | if (_selectedModels == nil) {
64 | _selectedModels = [NSMutableArray array];
65 | }
66 | return _selectedModels;
67 | }
68 | - (void)setGroup:(ALAssetsGroup *)group{
69 | _group = group;
70 | [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
71 | if (asset == nil) return ;
72 | GCMAssetModel *model = [[GCMAssetModel alloc] init];
73 | if (![[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {//不是图片
74 | model.thumbnail = [UIImage imageWithCGImage:asset.thumbnail];
75 | model.imageURL = asset.defaultRepresentation.url;
76 | model.isImage = NO;
77 | [self.assetModels addObject:model];
78 | }else{//图片
79 | model.thumbnail = [UIImage imageWithCGImage:asset.thumbnail];
80 | model.imageURL = asset.defaultRepresentation.url;
81 | model.isImage = YES;
82 | [self.assetModels addObject:model];
83 | }
84 |
85 | }];
86 |
87 | }
88 | - (void)viewDidLoad {
89 | [super viewDidLoad];
90 | [self.collectionView registerClass:[GCMShowCell class] forCellWithReuseIdentifier:reuseIdentifier];
91 | self.collectionView.backgroundColor = [UIColor whiteColor];
92 |
93 | //右侧完成按钮
94 | UIButton *editButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
95 | [editButton setTitle:@"完成" forState:UIControlStateNormal];
96 | [editButton addTarget:self action:@selector(finishSelecting) forControlEvents:UIControlEventTouchUpInside];
97 | UIBarButtonItem *rightButtonItem = [[UIBarButtonItem alloc] initWithCustomView:editButton];
98 | self.navigationItem.rightBarButtonItem = rightButtonItem;
99 |
100 | }
101 |
102 | //出口,选择完成图片
103 | - (void)finishSelecting{
104 |
105 | if ([self.navigationController isKindOfClass:[GCMImagePickerController class]]) {
106 | GCMImagePickerController *picker = (GCMImagePickerController *)self.navigationController;
107 | if (picker.didFinishSelectImageModels) {
108 |
109 | for (GCMAssetModel *model in self.assetModels) {
110 | if (model.isSelected) {
111 | [self.selectedModels addObject:model];
112 | }
113 | }
114 |
115 | if (picker.didFinishSelectImageModels) {
116 | picker.didFinishSelectImageModels(self.selectedModels);
117 | }
118 |
119 | }
120 | }
121 |
122 | //移除
123 | [self dismissViewControllerAnimated:YES completion:nil];
124 |
125 | }
126 |
127 |
128 | #pragma mark
129 |
130 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
131 |
132 | return self.assetModels.count;
133 |
134 | }
135 |
136 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
137 | GCMShowCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
138 | GCMAssetModel *model = self.assetModels[indexPath.item];
139 |
140 | if (cell.backgroundView == nil) {//防止多次创建
141 | UIImageView *imageView = [[UIImageView alloc] init];
142 | cell.backgroundView = imageView;
143 | }
144 | UIImageView *backView = (UIImageView *)cell.backgroundView;
145 | backView.image = model.thumbnail;
146 | if (cell.selectedButton == nil) {//防止多次创建
147 | UIButton *selectButton = [[UIButton alloc] init];
148 | [selectButton setImage:[UIImage imageNamed:@"delect_02"] forState:UIControlStateNormal];
149 | [selectButton setImage:[UIImage imageNamed:@"add_01"] forState:UIControlStateSelected];
150 | CGFloat width = cell.bounds.size.width;
151 | selectButton.frame = CGRectMake(width - 30, 0, 30, 30);
152 | [cell.contentView addSubview:selectButton];
153 | cell.selectedButton = selectButton;
154 | [selectButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
155 | }
156 |
157 | cell.selectedButton.tag = indexPath.item;//重新绑定
158 | cell.selectedButton.selected = model.isSelected;//恢复设定状态
159 | return cell;
160 | }
161 | - (void)buttonClicked:(UIButton *)sender{
162 | sender.selected = !sender.selected;
163 | GCMAssetModel *model = self.assetModels[sender.tag];
164 | //因为冲用的问题,不能根据选中状态来记录
165 | if (sender.selected == YES) {//选中了记录
166 | model.isSelected = YES;
167 | }else{//否则移除记录
168 | model.isSelected = NO;
169 | }
170 | }
171 | #pragma mark
172 |
173 | - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
174 | GCMAssetModel *model = self.assetModels[indexPath.item];
175 | if (model.isImage == NO) {
176 |
177 | MPMoviePlayerViewController* playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:model.imageURL];
178 | [self presentViewController:playerView animated:YES completion:nil];
179 | }else{
180 |
181 | cover = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
182 | UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
183 | UIVisualEffectView *effectview = [[UIVisualEffectView alloc] initWithEffect:blur];
184 | effectview.frame = cover.frame;
185 | [cover addSubview:effectview];
186 | [self.view addSubview:cover];
187 | bigImg = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
188 | [bigImg addTarget:self action:@selector(removeBtn) forControlEvents:UIControlEventTouchUpInside];
189 | [self.view addSubview:bigImg];
190 |
191 | ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init];
192 | [lib assetForURL:model.imageURL resultBlock:^(ALAsset *asset) {
193 | ALAssetRepresentation *assetRep = [asset defaultRepresentation];
194 | CGImageRef imgRef = [assetRep fullResolutionImage];
195 | UIImage *img = [UIImage imageWithCGImage:imgRef
196 | scale:assetRep.scale
197 | orientation:(UIImageOrientation)assetRep.orientation];
198 | [bigImg setImage:img forState:UIControlStateNormal];
199 | } failureBlock:^(NSError *error) {
200 | NSLog(@"相册图片访问失败");
201 | }];
202 |
203 | }
204 | }
205 |
206 | //移走大图
207 | - (void)removeBtn
208 | {
209 | [cover removeFromSuperview];
210 | [bigImg removeFromSuperview];
211 |
212 | }
213 | @end
214 |
215 |
--------------------------------------------------------------------------------
/SelectVideoAndConvert.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 4A4799181D2A5FEC0037A9DD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799171D2A5FEC0037A9DD /* main.m */; };
11 | 4A47991B1D2A5FEC0037A9DD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47991A1D2A5FEC0037A9DD /* AppDelegate.m */; };
12 | 4A47991E1D2A5FEC0037A9DD /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47991D1D2A5FEC0037A9DD /* ViewController.m */; };
13 | 4A4799211D2A5FEC0037A9DD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4A47991F1D2A5FEC0037A9DD /* Main.storyboard */; };
14 | 4A4799231D2A5FEC0037A9DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4A4799221D2A5FEC0037A9DD /* Assets.xcassets */; };
15 | 4A4799261D2A5FEC0037A9DD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4A4799241D2A5FEC0037A9DD /* LaunchScreen.storyboard */; };
16 | 4A4799311D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799301D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m */; };
17 | 4A47993C1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47993B1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m */; };
18 | 4A4799561D2A5FFF0037A9DD /* add_01@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4A47994A1D2A5FFF0037A9DD /* add_01@2x.png */; };
19 | 4A4799571D2A5FFF0037A9DD /* add_01@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4A47994B1D2A5FFF0037A9DD /* add_01@3x.png */; };
20 | 4A4799581D2A5FFF0037A9DD /* GCMAssetModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47994D1D2A5FFF0037A9DD /* GCMAssetModel.m */; };
21 | 4A4799591D2A5FFF0037A9DD /* GCMAssetsGroupController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47994F1D2A5FFF0037A9DD /* GCMAssetsGroupController.m */; };
22 | 4A47995A1D2A5FFF0037A9DD /* GCMCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799511D2A5FFF0037A9DD /* GCMCollectionViewController.m */; };
23 | 4A47995B1D2A5FFF0037A9DD /* GCMGroupCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799531D2A5FFF0037A9DD /* GCMGroupCell.m */; };
24 | 4A47995C1D2A5FFF0037A9DD /* GCMImagePickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799551D2A5FFF0037A9DD /* GCMImagePickerController.m */; };
25 | /* End PBXBuildFile section */
26 |
27 | /* Begin PBXContainerItemProxy section */
28 | 4A47992D1D2A5FEC0037A9DD /* PBXContainerItemProxy */ = {
29 | isa = PBXContainerItemProxy;
30 | containerPortal = 4A47990B1D2A5FEC0037A9DD /* Project object */;
31 | proxyType = 1;
32 | remoteGlobalIDString = 4A4799121D2A5FEC0037A9DD;
33 | remoteInfo = SelectVideoAndConvert;
34 | };
35 | 4A4799381D2A5FEC0037A9DD /* PBXContainerItemProxy */ = {
36 | isa = PBXContainerItemProxy;
37 | containerPortal = 4A47990B1D2A5FEC0037A9DD /* Project object */;
38 | proxyType = 1;
39 | remoteGlobalIDString = 4A4799121D2A5FEC0037A9DD;
40 | remoteInfo = SelectVideoAndConvert;
41 | };
42 | /* End PBXContainerItemProxy section */
43 |
44 | /* Begin PBXFileReference section */
45 | 4A4799131D2A5FEC0037A9DD /* SelectVideoAndConvert.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SelectVideoAndConvert.app; sourceTree = BUILT_PRODUCTS_DIR; };
46 | 4A4799171D2A5FEC0037A9DD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
47 | 4A4799191D2A5FEC0037A9DD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
48 | 4A47991A1D2A5FEC0037A9DD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
49 | 4A47991C1D2A5FEC0037A9DD /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; };
50 | 4A47991D1D2A5FEC0037A9DD /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; };
51 | 4A4799201D2A5FEC0037A9DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
52 | 4A4799221D2A5FEC0037A9DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
53 | 4A4799251D2A5FEC0037A9DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
54 | 4A4799271D2A5FEC0037A9DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
55 | 4A47992C1D2A5FEC0037A9DD /* SelectVideoAndConvertTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SelectVideoAndConvertTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
56 | 4A4799301D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SelectVideoAndConvertTests.m; sourceTree = ""; };
57 | 4A4799321D2A5FEC0037A9DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
58 | 4A4799371D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SelectVideoAndConvertUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
59 | 4A47993B1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SelectVideoAndConvertUITests.m; sourceTree = ""; };
60 | 4A47993D1D2A5FEC0037A9DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
61 | 4A47994A1D2A5FFF0037A9DD /* add_01@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_01@2x.png"; sourceTree = ""; };
62 | 4A47994B1D2A5FFF0037A9DD /* add_01@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_01@3x.png"; sourceTree = ""; };
63 | 4A47994C1D2A5FFF0037A9DD /* GCMAssetModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMAssetModel.h; sourceTree = ""; };
64 | 4A47994D1D2A5FFF0037A9DD /* GCMAssetModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMAssetModel.m; sourceTree = ""; };
65 | 4A47994E1D2A5FFF0037A9DD /* GCMAssetsGroupController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMAssetsGroupController.h; sourceTree = ""; };
66 | 4A47994F1D2A5FFF0037A9DD /* GCMAssetsGroupController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMAssetsGroupController.m; sourceTree = ""; };
67 | 4A4799501D2A5FFF0037A9DD /* GCMCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMCollectionViewController.h; sourceTree = ""; };
68 | 4A4799511D2A5FFF0037A9DD /* GCMCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMCollectionViewController.m; sourceTree = ""; };
69 | 4A4799521D2A5FFF0037A9DD /* GCMGroupCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMGroupCell.h; sourceTree = ""; };
70 | 4A4799531D2A5FFF0037A9DD /* GCMGroupCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMGroupCell.m; sourceTree = ""; };
71 | 4A4799541D2A5FFF0037A9DD /* GCMImagePickerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMImagePickerController.h; sourceTree = ""; };
72 | 4A4799551D2A5FFF0037A9DD /* GCMImagePickerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMImagePickerController.m; sourceTree = ""; };
73 | /* End PBXFileReference section */
74 |
75 | /* Begin PBXFrameworksBuildPhase section */
76 | 4A4799101D2A5FEC0037A9DD /* Frameworks */ = {
77 | isa = PBXFrameworksBuildPhase;
78 | buildActionMask = 2147483647;
79 | files = (
80 | );
81 | runOnlyForDeploymentPostprocessing = 0;
82 | };
83 | 4A4799291D2A5FEC0037A9DD /* Frameworks */ = {
84 | isa = PBXFrameworksBuildPhase;
85 | buildActionMask = 2147483647;
86 | files = (
87 | );
88 | runOnlyForDeploymentPostprocessing = 0;
89 | };
90 | 4A4799341D2A5FEC0037A9DD /* Frameworks */ = {
91 | isa = PBXFrameworksBuildPhase;
92 | buildActionMask = 2147483647;
93 | files = (
94 | );
95 | runOnlyForDeploymentPostprocessing = 0;
96 | };
97 | /* End PBXFrameworksBuildPhase section */
98 |
99 | /* Begin PBXGroup section */
100 | 4A47990A1D2A5FEC0037A9DD = {
101 | isa = PBXGroup;
102 | children = (
103 | 4A4799151D2A5FEC0037A9DD /* SelectVideoAndConvert */,
104 | 4A47992F1D2A5FEC0037A9DD /* SelectVideoAndConvertTests */,
105 | 4A47993A1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests */,
106 | 4A4799141D2A5FEC0037A9DD /* Products */,
107 | );
108 | sourceTree = "";
109 | };
110 | 4A4799141D2A5FEC0037A9DD /* Products */ = {
111 | isa = PBXGroup;
112 | children = (
113 | 4A4799131D2A5FEC0037A9DD /* SelectVideoAndConvert.app */,
114 | 4A47992C1D2A5FEC0037A9DD /* SelectVideoAndConvertTests.xctest */,
115 | 4A4799371D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.xctest */,
116 | );
117 | name = Products;
118 | sourceTree = "";
119 | };
120 | 4A4799151D2A5FEC0037A9DD /* SelectVideoAndConvert */ = {
121 | isa = PBXGroup;
122 | children = (
123 | 4A4799491D2A5FFF0037A9DD /* GCMImagePicker */,
124 | 4A4799191D2A5FEC0037A9DD /* AppDelegate.h */,
125 | 4A47991A1D2A5FEC0037A9DD /* AppDelegate.m */,
126 | 4A47991C1D2A5FEC0037A9DD /* ViewController.h */,
127 | 4A47991D1D2A5FEC0037A9DD /* ViewController.m */,
128 | 4A47991F1D2A5FEC0037A9DD /* Main.storyboard */,
129 | 4A4799221D2A5FEC0037A9DD /* Assets.xcassets */,
130 | 4A4799241D2A5FEC0037A9DD /* LaunchScreen.storyboard */,
131 | 4A4799271D2A5FEC0037A9DD /* Info.plist */,
132 | 4A4799161D2A5FEC0037A9DD /* Supporting Files */,
133 | );
134 | path = SelectVideoAndConvert;
135 | sourceTree = "";
136 | };
137 | 4A4799161D2A5FEC0037A9DD /* Supporting Files */ = {
138 | isa = PBXGroup;
139 | children = (
140 | 4A4799171D2A5FEC0037A9DD /* main.m */,
141 | );
142 | name = "Supporting Files";
143 | sourceTree = "";
144 | };
145 | 4A47992F1D2A5FEC0037A9DD /* SelectVideoAndConvertTests */ = {
146 | isa = PBXGroup;
147 | children = (
148 | 4A4799301D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m */,
149 | 4A4799321D2A5FEC0037A9DD /* Info.plist */,
150 | );
151 | path = SelectVideoAndConvertTests;
152 | sourceTree = "";
153 | };
154 | 4A47993A1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests */ = {
155 | isa = PBXGroup;
156 | children = (
157 | 4A47993B1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m */,
158 | 4A47993D1D2A5FEC0037A9DD /* Info.plist */,
159 | );
160 | path = SelectVideoAndConvertUITests;
161 | sourceTree = "";
162 | };
163 | 4A4799491D2A5FFF0037A9DD /* GCMImagePicker */ = {
164 | isa = PBXGroup;
165 | children = (
166 | 4A47994A1D2A5FFF0037A9DD /* add_01@2x.png */,
167 | 4A47994B1D2A5FFF0037A9DD /* add_01@3x.png */,
168 | 4A47994C1D2A5FFF0037A9DD /* GCMAssetModel.h */,
169 | 4A47994D1D2A5FFF0037A9DD /* GCMAssetModel.m */,
170 | 4A47994E1D2A5FFF0037A9DD /* GCMAssetsGroupController.h */,
171 | 4A47994F1D2A5FFF0037A9DD /* GCMAssetsGroupController.m */,
172 | 4A4799501D2A5FFF0037A9DD /* GCMCollectionViewController.h */,
173 | 4A4799511D2A5FFF0037A9DD /* GCMCollectionViewController.m */,
174 | 4A4799521D2A5FFF0037A9DD /* GCMGroupCell.h */,
175 | 4A4799531D2A5FFF0037A9DD /* GCMGroupCell.m */,
176 | 4A4799541D2A5FFF0037A9DD /* GCMImagePickerController.h */,
177 | 4A4799551D2A5FFF0037A9DD /* GCMImagePickerController.m */,
178 | );
179 | path = GCMImagePicker;
180 | sourceTree = "";
181 | };
182 | /* End PBXGroup section */
183 |
184 | /* Begin PBXNativeTarget section */
185 | 4A4799121D2A5FEC0037A9DD /* SelectVideoAndConvert */ = {
186 | isa = PBXNativeTarget;
187 | buildConfigurationList = 4A4799401D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvert" */;
188 | buildPhases = (
189 | 4A47990F1D2A5FEC0037A9DD /* Sources */,
190 | 4A4799101D2A5FEC0037A9DD /* Frameworks */,
191 | 4A4799111D2A5FEC0037A9DD /* Resources */,
192 | );
193 | buildRules = (
194 | );
195 | dependencies = (
196 | );
197 | name = SelectVideoAndConvert;
198 | productName = SelectVideoAndConvert;
199 | productReference = 4A4799131D2A5FEC0037A9DD /* SelectVideoAndConvert.app */;
200 | productType = "com.apple.product-type.application";
201 | };
202 | 4A47992B1D2A5FEC0037A9DD /* SelectVideoAndConvertTests */ = {
203 | isa = PBXNativeTarget;
204 | buildConfigurationList = 4A4799431D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvertTests" */;
205 | buildPhases = (
206 | 4A4799281D2A5FEC0037A9DD /* Sources */,
207 | 4A4799291D2A5FEC0037A9DD /* Frameworks */,
208 | 4A47992A1D2A5FEC0037A9DD /* Resources */,
209 | );
210 | buildRules = (
211 | );
212 | dependencies = (
213 | 4A47992E1D2A5FEC0037A9DD /* PBXTargetDependency */,
214 | );
215 | name = SelectVideoAndConvertTests;
216 | productName = SelectVideoAndConvertTests;
217 | productReference = 4A47992C1D2A5FEC0037A9DD /* SelectVideoAndConvertTests.xctest */;
218 | productType = "com.apple.product-type.bundle.unit-test";
219 | };
220 | 4A4799361D2A5FEC0037A9DD /* SelectVideoAndConvertUITests */ = {
221 | isa = PBXNativeTarget;
222 | buildConfigurationList = 4A4799461D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvertUITests" */;
223 | buildPhases = (
224 | 4A4799331D2A5FEC0037A9DD /* Sources */,
225 | 4A4799341D2A5FEC0037A9DD /* Frameworks */,
226 | 4A4799351D2A5FEC0037A9DD /* Resources */,
227 | );
228 | buildRules = (
229 | );
230 | dependencies = (
231 | 4A4799391D2A5FEC0037A9DD /* PBXTargetDependency */,
232 | );
233 | name = SelectVideoAndConvertUITests;
234 | productName = SelectVideoAndConvertUITests;
235 | productReference = 4A4799371D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.xctest */;
236 | productType = "com.apple.product-type.bundle.ui-testing";
237 | };
238 | /* End PBXNativeTarget section */
239 |
240 | /* Begin PBXProject section */
241 | 4A47990B1D2A5FEC0037A9DD /* Project object */ = {
242 | isa = PBXProject;
243 | attributes = {
244 | LastUpgradeCheck = 0730;
245 | ORGANIZATIONNAME = Snoopy;
246 | TargetAttributes = {
247 | 4A4799121D2A5FEC0037A9DD = {
248 | CreatedOnToolsVersion = 7.3.1;
249 | DevelopmentTeam = X5WRLK634K;
250 | };
251 | 4A47992B1D2A5FEC0037A9DD = {
252 | CreatedOnToolsVersion = 7.3.1;
253 | DevelopmentTeam = X5WRLK634K;
254 | TestTargetID = 4A4799121D2A5FEC0037A9DD;
255 | };
256 | 4A4799361D2A5FEC0037A9DD = {
257 | CreatedOnToolsVersion = 7.3.1;
258 | DevelopmentTeam = X5WRLK634K;
259 | TestTargetID = 4A4799121D2A5FEC0037A9DD;
260 | };
261 | };
262 | };
263 | buildConfigurationList = 4A47990E1D2A5FEC0037A9DD /* Build configuration list for PBXProject "SelectVideoAndConvert" */;
264 | compatibilityVersion = "Xcode 3.2";
265 | developmentRegion = English;
266 | hasScannedForEncodings = 0;
267 | knownRegions = (
268 | en,
269 | Base,
270 | );
271 | mainGroup = 4A47990A1D2A5FEC0037A9DD;
272 | productRefGroup = 4A4799141D2A5FEC0037A9DD /* Products */;
273 | projectDirPath = "";
274 | projectRoot = "";
275 | targets = (
276 | 4A4799121D2A5FEC0037A9DD /* SelectVideoAndConvert */,
277 | 4A47992B1D2A5FEC0037A9DD /* SelectVideoAndConvertTests */,
278 | 4A4799361D2A5FEC0037A9DD /* SelectVideoAndConvertUITests */,
279 | );
280 | };
281 | /* End PBXProject section */
282 |
283 | /* Begin PBXResourcesBuildPhase section */
284 | 4A4799111D2A5FEC0037A9DD /* Resources */ = {
285 | isa = PBXResourcesBuildPhase;
286 | buildActionMask = 2147483647;
287 | files = (
288 | 4A4799571D2A5FFF0037A9DD /* add_01@3x.png in Resources */,
289 | 4A4799261D2A5FEC0037A9DD /* LaunchScreen.storyboard in Resources */,
290 | 4A4799231D2A5FEC0037A9DD /* Assets.xcassets in Resources */,
291 | 4A4799211D2A5FEC0037A9DD /* Main.storyboard in Resources */,
292 | 4A4799561D2A5FFF0037A9DD /* add_01@2x.png in Resources */,
293 | );
294 | runOnlyForDeploymentPostprocessing = 0;
295 | };
296 | 4A47992A1D2A5FEC0037A9DD /* Resources */ = {
297 | isa = PBXResourcesBuildPhase;
298 | buildActionMask = 2147483647;
299 | files = (
300 | );
301 | runOnlyForDeploymentPostprocessing = 0;
302 | };
303 | 4A4799351D2A5FEC0037A9DD /* Resources */ = {
304 | isa = PBXResourcesBuildPhase;
305 | buildActionMask = 2147483647;
306 | files = (
307 | );
308 | runOnlyForDeploymentPostprocessing = 0;
309 | };
310 | /* End PBXResourcesBuildPhase section */
311 |
312 | /* Begin PBXSourcesBuildPhase section */
313 | 4A47990F1D2A5FEC0037A9DD /* Sources */ = {
314 | isa = PBXSourcesBuildPhase;
315 | buildActionMask = 2147483647;
316 | files = (
317 | 4A47991E1D2A5FEC0037A9DD /* ViewController.m in Sources */,
318 | 4A47995C1D2A5FFF0037A9DD /* GCMImagePickerController.m in Sources */,
319 | 4A47991B1D2A5FEC0037A9DD /* AppDelegate.m in Sources */,
320 | 4A47995A1D2A5FFF0037A9DD /* GCMCollectionViewController.m in Sources */,
321 | 4A47995B1D2A5FFF0037A9DD /* GCMGroupCell.m in Sources */,
322 | 4A4799591D2A5FFF0037A9DD /* GCMAssetsGroupController.m in Sources */,
323 | 4A4799581D2A5FFF0037A9DD /* GCMAssetModel.m in Sources */,
324 | 4A4799181D2A5FEC0037A9DD /* main.m in Sources */,
325 | );
326 | runOnlyForDeploymentPostprocessing = 0;
327 | };
328 | 4A4799281D2A5FEC0037A9DD /* Sources */ = {
329 | isa = PBXSourcesBuildPhase;
330 | buildActionMask = 2147483647;
331 | files = (
332 | 4A4799311D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m in Sources */,
333 | );
334 | runOnlyForDeploymentPostprocessing = 0;
335 | };
336 | 4A4799331D2A5FEC0037A9DD /* Sources */ = {
337 | isa = PBXSourcesBuildPhase;
338 | buildActionMask = 2147483647;
339 | files = (
340 | 4A47993C1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m in Sources */,
341 | );
342 | runOnlyForDeploymentPostprocessing = 0;
343 | };
344 | /* End PBXSourcesBuildPhase section */
345 |
346 | /* Begin PBXTargetDependency section */
347 | 4A47992E1D2A5FEC0037A9DD /* PBXTargetDependency */ = {
348 | isa = PBXTargetDependency;
349 | target = 4A4799121D2A5FEC0037A9DD /* SelectVideoAndConvert */;
350 | targetProxy = 4A47992D1D2A5FEC0037A9DD /* PBXContainerItemProxy */;
351 | };
352 | 4A4799391D2A5FEC0037A9DD /* PBXTargetDependency */ = {
353 | isa = PBXTargetDependency;
354 | target = 4A4799121D2A5FEC0037A9DD /* SelectVideoAndConvert */;
355 | targetProxy = 4A4799381D2A5FEC0037A9DD /* PBXContainerItemProxy */;
356 | };
357 | /* End PBXTargetDependency section */
358 |
359 | /* Begin PBXVariantGroup section */
360 | 4A47991F1D2A5FEC0037A9DD /* Main.storyboard */ = {
361 | isa = PBXVariantGroup;
362 | children = (
363 | 4A4799201D2A5FEC0037A9DD /* Base */,
364 | );
365 | name = Main.storyboard;
366 | sourceTree = "";
367 | };
368 | 4A4799241D2A5FEC0037A9DD /* LaunchScreen.storyboard */ = {
369 | isa = PBXVariantGroup;
370 | children = (
371 | 4A4799251D2A5FEC0037A9DD /* Base */,
372 | );
373 | name = LaunchScreen.storyboard;
374 | sourceTree = "";
375 | };
376 | /* End PBXVariantGroup section */
377 |
378 | /* Begin XCBuildConfiguration section */
379 | 4A47993E1D2A5FEC0037A9DD /* Debug */ = {
380 | isa = XCBuildConfiguration;
381 | buildSettings = {
382 | ALWAYS_SEARCH_USER_PATHS = NO;
383 | CLANG_ANALYZER_NONNULL = YES;
384 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
385 | CLANG_CXX_LIBRARY = "libc++";
386 | CLANG_ENABLE_MODULES = YES;
387 | CLANG_ENABLE_OBJC_ARC = YES;
388 | CLANG_WARN_BOOL_CONVERSION = YES;
389 | CLANG_WARN_CONSTANT_CONVERSION = YES;
390 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
391 | CLANG_WARN_EMPTY_BODY = YES;
392 | CLANG_WARN_ENUM_CONVERSION = YES;
393 | CLANG_WARN_INT_CONVERSION = YES;
394 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
395 | CLANG_WARN_UNREACHABLE_CODE = YES;
396 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
397 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
398 | COPY_PHASE_STRIP = NO;
399 | DEBUG_INFORMATION_FORMAT = dwarf;
400 | ENABLE_STRICT_OBJC_MSGSEND = YES;
401 | ENABLE_TESTABILITY = YES;
402 | GCC_C_LANGUAGE_STANDARD = gnu99;
403 | GCC_DYNAMIC_NO_PIC = NO;
404 | GCC_NO_COMMON_BLOCKS = YES;
405 | GCC_OPTIMIZATION_LEVEL = 0;
406 | GCC_PREPROCESSOR_DEFINITIONS = (
407 | "DEBUG=1",
408 | "$(inherited)",
409 | );
410 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
411 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
412 | GCC_WARN_UNDECLARED_SELECTOR = YES;
413 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
414 | GCC_WARN_UNUSED_FUNCTION = YES;
415 | GCC_WARN_UNUSED_VARIABLE = YES;
416 | IPHONEOS_DEPLOYMENT_TARGET = 9.3;
417 | MTL_ENABLE_DEBUG_INFO = YES;
418 | ONLY_ACTIVE_ARCH = YES;
419 | SDKROOT = iphoneos;
420 | TARGETED_DEVICE_FAMILY = "1,2";
421 | };
422 | name = Debug;
423 | };
424 | 4A47993F1D2A5FEC0037A9DD /* Release */ = {
425 | isa = XCBuildConfiguration;
426 | buildSettings = {
427 | ALWAYS_SEARCH_USER_PATHS = NO;
428 | CLANG_ANALYZER_NONNULL = YES;
429 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
430 | CLANG_CXX_LIBRARY = "libc++";
431 | CLANG_ENABLE_MODULES = YES;
432 | CLANG_ENABLE_OBJC_ARC = YES;
433 | CLANG_WARN_BOOL_CONVERSION = YES;
434 | CLANG_WARN_CONSTANT_CONVERSION = YES;
435 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
436 | CLANG_WARN_EMPTY_BODY = YES;
437 | CLANG_WARN_ENUM_CONVERSION = YES;
438 | CLANG_WARN_INT_CONVERSION = YES;
439 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
440 | CLANG_WARN_UNREACHABLE_CODE = YES;
441 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
442 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
443 | COPY_PHASE_STRIP = NO;
444 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
445 | ENABLE_NS_ASSERTIONS = NO;
446 | ENABLE_STRICT_OBJC_MSGSEND = YES;
447 | GCC_C_LANGUAGE_STANDARD = gnu99;
448 | GCC_NO_COMMON_BLOCKS = YES;
449 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
450 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
451 | GCC_WARN_UNDECLARED_SELECTOR = YES;
452 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
453 | GCC_WARN_UNUSED_FUNCTION = YES;
454 | GCC_WARN_UNUSED_VARIABLE = YES;
455 | IPHONEOS_DEPLOYMENT_TARGET = 9.3;
456 | MTL_ENABLE_DEBUG_INFO = NO;
457 | SDKROOT = iphoneos;
458 | TARGETED_DEVICE_FAMILY = "1,2";
459 | VALIDATE_PRODUCT = YES;
460 | };
461 | name = Release;
462 | };
463 | 4A4799411D2A5FEC0037A9DD /* Debug */ = {
464 | isa = XCBuildConfiguration;
465 | buildSettings = {
466 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
467 | INFOPLIST_FILE = SelectVideoAndConvert/Info.plist;
468 | IPHONEOS_DEPLOYMENT_TARGET = 8.2;
469 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
470 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvert;
471 | PRODUCT_NAME = "$(TARGET_NAME)";
472 | };
473 | name = Debug;
474 | };
475 | 4A4799421D2A5FEC0037A9DD /* Release */ = {
476 | isa = XCBuildConfiguration;
477 | buildSettings = {
478 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
479 | INFOPLIST_FILE = SelectVideoAndConvert/Info.plist;
480 | IPHONEOS_DEPLOYMENT_TARGET = 8.2;
481 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
482 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvert;
483 | PRODUCT_NAME = "$(TARGET_NAME)";
484 | };
485 | name = Release;
486 | };
487 | 4A4799441D2A5FEC0037A9DD /* Debug */ = {
488 | isa = XCBuildConfiguration;
489 | buildSettings = {
490 | BUNDLE_LOADER = "$(TEST_HOST)";
491 | INFOPLIST_FILE = SelectVideoAndConvertTests/Info.plist;
492 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
493 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvertTests;
494 | PRODUCT_NAME = "$(TARGET_NAME)";
495 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SelectVideoAndConvert.app/SelectVideoAndConvert";
496 | };
497 | name = Debug;
498 | };
499 | 4A4799451D2A5FEC0037A9DD /* Release */ = {
500 | isa = XCBuildConfiguration;
501 | buildSettings = {
502 | BUNDLE_LOADER = "$(TEST_HOST)";
503 | INFOPLIST_FILE = SelectVideoAndConvertTests/Info.plist;
504 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
505 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvertTests;
506 | PRODUCT_NAME = "$(TARGET_NAME)";
507 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SelectVideoAndConvert.app/SelectVideoAndConvert";
508 | };
509 | name = Release;
510 | };
511 | 4A4799471D2A5FEC0037A9DD /* Debug */ = {
512 | isa = XCBuildConfiguration;
513 | buildSettings = {
514 | INFOPLIST_FILE = SelectVideoAndConvertUITests/Info.plist;
515 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
516 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvertUITests;
517 | PRODUCT_NAME = "$(TARGET_NAME)";
518 | TEST_TARGET_NAME = SelectVideoAndConvert;
519 | };
520 | name = Debug;
521 | };
522 | 4A4799481D2A5FEC0037A9DD /* Release */ = {
523 | isa = XCBuildConfiguration;
524 | buildSettings = {
525 | INFOPLIST_FILE = SelectVideoAndConvertUITests/Info.plist;
526 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
527 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvertUITests;
528 | PRODUCT_NAME = "$(TARGET_NAME)";
529 | TEST_TARGET_NAME = SelectVideoAndConvert;
530 | };
531 | name = Release;
532 | };
533 | /* End XCBuildConfiguration section */
534 |
535 | /* Begin XCConfigurationList section */
536 | 4A47990E1D2A5FEC0037A9DD /* Build configuration list for PBXProject "SelectVideoAndConvert" */ = {
537 | isa = XCConfigurationList;
538 | buildConfigurations = (
539 | 4A47993E1D2A5FEC0037A9DD /* Debug */,
540 | 4A47993F1D2A5FEC0037A9DD /* Release */,
541 | );
542 | defaultConfigurationIsVisible = 0;
543 | defaultConfigurationName = Release;
544 | };
545 | 4A4799401D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvert" */ = {
546 | isa = XCConfigurationList;
547 | buildConfigurations = (
548 | 4A4799411D2A5FEC0037A9DD /* Debug */,
549 | 4A4799421D2A5FEC0037A9DD /* Release */,
550 | );
551 | defaultConfigurationIsVisible = 0;
552 | };
553 | 4A4799431D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvertTests" */ = {
554 | isa = XCConfigurationList;
555 | buildConfigurations = (
556 | 4A4799441D2A5FEC0037A9DD /* Debug */,
557 | 4A4799451D2A5FEC0037A9DD /* Release */,
558 | );
559 | defaultConfigurationIsVisible = 0;
560 | };
561 | 4A4799461D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvertUITests" */ = {
562 | isa = XCConfigurationList;
563 | buildConfigurations = (
564 | 4A4799471D2A5FEC0037A9DD /* Debug */,
565 | 4A4799481D2A5FEC0037A9DD /* Release */,
566 | );
567 | defaultConfigurationIsVisible = 0;
568 | };
569 | /* End XCConfigurationList section */
570 | };
571 | rootObject = 4A47990B1D2A5FEC0037A9DD /* Project object */;
572 | }
573 |
--------------------------------------------------------------------------------