2つの方法があります...
permitEditingをNOに設定します。これはメディアビューアを表示するべきではありませんが、私はUIImagePickerControllerを日常的に使用していないため、100%確信が持てないので、テストする必要があります。ただし、機能する場合でも、ビデオが10分より長い場合は、ビデオをトリミングする必要があるため、編集インターフェイスは引き続き存在します(UIImagePickerControllerのドキュメントを参照してください)。しかし、私が書いたように、それをテストします。なぜなら、私はそれを使用しないので間違っている可能性があるからです。
ALAssetsLibraryを見てください。このクラス(および友達)を使用すると、数分でカスタムピッカーを作成できます。その後、やりたいことは何でもできます。ただし、このアプローチには1つの小さな問題があります。ユーザーは、アプリケーションが位置情報にアクセスできることに同意する必要があります。これは、ユーザーにとって非常に誤解を招く恐れがあります。これは、アセットに位置情報を含めることができるためです。ユーザーがアプリケーションの位置情報へのアクセスを無効にすると、カスタムピッカーは機能しなくなります。
更新、コメントで要求されたコード。
グループリストを取得する(このコードはすべてのグループを取得し、ビデオのないグループを除外します):
if ( ! __assetsLibrary ) {
__assetsLibrary = [[ALAssetsLibrary alloc] init];
}
[__assetsLibrary enumerateGroupsWithTypes:__assetsGroupType
usingBlock:^( ALAssetsGroup *group, BOOL *stop ) {
/*
* If group is nil => end of iteration, no more groups will arrive.
*/
if ( group ) {
/*
* We do only want groups with videos, so, set filter to allVideos. Following
* numberOfAssets method respects filter settings, so, only number of videos
* is returned.
*/
[group setAssetsFilter:[ALAssetsFilter allVideos]];
if ( [group numberOfAssets] > 0 ) {
TMDCONDLOG( DEBUG_PICKER, @"Asset group added: %@", [group valueForProperty:ALAssetsGroupPropertyName ]);
[__assetsGroups addObject:group];
} else {
TMDCONDLOG( DEBUG_PICKER, @"Skipping %@, no videos inside", [group valueForProperty:ALAssetsGroupPropertyName] );
}
} else {
// group is nil, no more groups will arrive, reload table
TMDCONDLOG( DEBUG_PICKER, @"Asset groups count: %d", (int)[__assetsGroups count]);
dispatch_async( dispatch_get_main_queue(), ^{
[self reloadDataFinished];
} );
}
}
failureBlock:^( NSError *error) {
TMDCONDLOG( DEBUG_PICKER, @"Failed: %@", error );
dispatch_async(dispatch_get_main_queue(), ^{
[self reloadDataFinished];
[self showAccessFailedError];
});
}];
列挙するコードは次のALAssetsGroup
とおりです。
[__assetsGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stopEnumeratingAssets ) {
TMDCONDLOG( DEBUG_ASSETS, @"Asset: %@ Index: %d", result, ( int ) index );
if ( result ) {
[__assets addObject:result];
}
/*
* Enumeration ends? If yes, reload table.
*/
if ( ! result || index == NSNotFound ) {
*stopEnumeratingAssets = YES;
TMDCONDLOG( DEBUG_ASSETS, @"Going to reload table view" );
[self performSelectorOnMainThread:@selector(reloadTableData) withObject:nil waitUntilDone:NO];
}
}];
グループのアセット数、ポスター画像などを取得する方法の例を次に示します。
__groupAssetsCountLabel.text = [NSString stringWithFormat:@"(%d)", (int) [__assetsGroup numberOfAssets]];
__groupTitleLabel.text = ( NSString * )[__assetsGroup valueForProperty:ALAssetsGroupPropertyName];
__groupImageView.image = [UIImage imageWithCGImage:[__assetsGroup posterImage]];
これをグループのカスタムUITableViewCell
で使用します。アセットのサムネイルと期間を取得する方法の例を次に示します。
dispatch_async( dispatch_get_main_queue(), ^{
__assetView.image = [UIImage imageWithCGImage:[__asset thumbnail]];
} );
id property = [__asset valueForProperty:ALAssetPropertyDuration];
if ( ! [property isEqual:ALErrorInvalidProperty] ) {
NSInteger duration = ( ( NSNumber * )property ).integerValue;
__durationLabel.text = [NSString stringWithFormat:@"%d:%02d", ( int ) ( duration / 60 ), ( int ) ( duration % 60 ) ];
} else {
__durationLabel.text = nil;
}
カスタムでこのコードを使用して、UITableViewCell
4つのアセットを連続して表示し、AppleのピッカーUIをエミュレートできます。
マクロの例..。
#define TMLOG( __xx, ... ) NSLog( @"%s(%d): " __xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ )
#ifdef DEBUG
#define TMDLOG( __xx, ... ) TMLOG( __xx, ##__VA_ARGS__ )
#else
#define TMDLOG( __xx, ... ) ((void)0)
#endif
#ifdef DEBUG
#define TMDCONDLOG( __cond, __xx, ... ) { \
if ( ( __cond ) ) { \
TMDLOG( __xx, ##__VA_ARGS__ ); \
} \
} ((void)0)
#else
#define TMDCONDLOG( __cond, __xx, ... ) ((void)0)
#endif