2016-11-07 3 views
0

Ich habe Probleme beim Hinzufügen mehrerer Videos zu einer uicollectionview. Ich kann mehrere Bilder zu einer uicollectionview hinzufügen, und sie werden korrekt angezeigt. Wenn ich jedoch versuche, mehrere Videos hinzuzufügen, wird nur das zuletzt hinzugefügte Video wiedergegeben.Mehrere Videos zu uicollectionview hinzufügen - objective-c

// Wählen Sie Bild/Video von Telefon Galerie

- (void)chooseExistingImagesButton:(id)sender { 

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) { 
    UIImagePickerController *picker = [[UIImagePickerController alloc]init]; 
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    picker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, (NSString *)kUTTypeVideo, (NSString*)kUTTypeImage, nil]; 
    picker.allowsEditing = NO; 
    picker.delegate = self; 

    [self presentViewController:picker animated:YES completion:nil]; 
} 
else { 
    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:nil message:@"Sorry, we cannot detect a camera on this device." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
    [alertView show]; 
} 

[imageCollectionView reloadData]; 
[videoCollectionView reloadData]; } 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
[self targetImageArray]; 
[self targetVideoArray]; 

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 

if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { 
    NSString *selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    [targetImageArray addObject:selectedImage]; 
    [targetImageArray componentsJoinedByString:@","]; 
} 
else if (([mediaType isEqualToString:(NSString *)kUTTypeVideo]) || ([mediaType isEqualToString:(NSString *)kUTTypeMovie])) { 
    NSString *moviePath = [info objectForKey:UIImagePickerControllerMediaURL]; 
    [targetVideoArray addObject:moviePath]; 
    [targetVideoArray componentsJoinedByString:@","]; 
} 

[imageCollectionView reloadData]; 
[videoCollectionView reloadData]; 

[self dismissViewControllerAnimated:YES completion:^{NSLog(@"Finished Picking Image or Video");}]; } 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 
[self dismissViewControllerAnimated:YES completion:^{NSLog(@"Image picker view dismissed");}]; } 

// Lade die Kollektion

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { 
return 1; } 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
if (collectionView.tag == ImageCell) { 
    return [targetImageArray count]; 
} 
if (collectionView.tag == VideoCell) { 
    return [targetVideoArray count]; 
} 
return 0; } 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

if (collectionView.tag == VideoCell) { 
    static NSString *videoCellIdentifier = @"VideoCell"; 
    TargetVideoCell *videoCell = [collectionView dequeueReusableCellWithReuseIdentifier:videoCellIdentifier forIndexPath:indexPath]; 

    movieUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@", [targetVideoArray objectAtIndex:indexPath.row]]]; 

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:movieUrl options:nil]; 
    AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset]; 
    generator.appliesPreferredTrackTransform = YES; 
    UIImage *image = [UIImage imageWithCGImage:[generator copyCGImageAtTime:CMTimeMake(0, 1) actualTime:nil error:nil]]; 

    videoCell.targetMovieView.image = image; 

    [moviePlayer.view setFrame:videoCell.targetMovieView.frame]; 
    moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl]; 

    return videoCell; 
} 


if (collectionView.tag == ImageCell) { 
    static NSString *imageCellIdentifier = @"ImageCell"; 
    TargetImageCell *imageCell = [collectionView dequeueReusableCellWithReuseIdentifier:imageCellIdentifier forIndexPath:indexPath]; 

    imageCell.targetImageView.image = [targetImageArray objectAtIndex:indexPath.row]; 
    return imageCell; 
} 

return 0; } 

// Video abspielen

- (IBAction)playMovie:(id)sender { 
[self presentMoviePlayerViewControllerAnimated:moviePlayer]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playMovieFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; } 

- (void)playMovieFinished:(NSNotification *)theNotification { 
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 
[moviePlayer.view removeFromSuperview]; 
moviePlayer = nil; 
[self dismissMoviePlayerViewControllerAnimated]; } 
+0

'Movieplayer = Klopfen [[MPMoviePlayerViewController alloc] initWithContentURL: movieURL];' Das scheint der Täter zu sein. Nur der "letzte" hat den 'moviePlayer'. Wenn Sie Bilder einfügen, hat die Zelle ihre eigene Eigenschaft, um das Bild anzuzeigen. Auch, warum ist Ihre Frage markiert mit 'iPad' und' CoreData'? – Larme

+0

Danke für Ihre Antwort, ich speichere sowohl die Bild- als auch die Video-Arrays für eine iPad-App in CoreData. Das erste Mal hier posten, dachte, wenn Sie weitere Tags hinzufügen, würde es zu ein paar mehr Menschen erreichen :) – Stephen

+0

Das Problem ist, dass Ihr Problem nicht für iPad geeignet ist (es könnte auch auf dem iPhone sein), und ist nicht mit CoreData verwandt (da Sie nicht einmal eine Zeile mit CoreData geschrieben haben). Sie sind nicht verwandt. – Larme

Antwort

0

Auf jeder cellForRow Sie init Ihren Film Spieler wieder. moviePlayer - das ist Eigentum Ihrer Klasse.

Lösung:

  1. jede Zelle muss hat Movie-Player besitzen.

    videoCell.moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL: movieUrl]; [videoCell.moviePlayer.view setFrame: videoCell.targetMovieView.bounds];

  2. hat einen Movie-Player und Fangen Fall Taste

+0

Danke für die Antwort, ich habe den obigen Code aktualisiert, aber ich kann die Videos jetzt nicht abspielen. (Nicht für den Mangel an versuchen) Ich erhalte Fehler wie: - keine sichtbare @interface für erklärt der Wähler dismissMoviePlayerViewControllerAnimated - Versuch darzustellen auf deren Ansicht ist nicht in die Fensterhierarchie! Ive konnte auch den Player laden, aber es lädt einen leeren Bildschirm. – Stephen

+0

Danke für Ihre Hilfe, hat es funktioniert: - (void) playvideo: (id) sender { [[NSNotificationCenter defaultCenter] addObserver: Selbst Selektor: @selector (moviePlayBackDidFinish :) Name: MPMoviePlayerPlaybackDidFinishNotification Objekt: Movieplayer] ; moviePlayer.controlStyle = MPMovieControlStyleDefault; moviePlayer.shouldAutoplay = YES; [self addSubview: moviePlayer.Aussicht]; [moviePlayer setFullscreen: YES animiert: YES]; } – Stephen

+0

- (void) moviePlayBackDidFinish: (NSNotification *) Benachrichtigung { MPMoviePlayerController * player = [Benachrichtigungsobjekt]; [[NSNotificationCenter defaultCenter] removeObserver: eigener Name: MPMoviePlayerPlaybackDidFinishNotification object: player]; if ([Spieler antwortetToSelector: @selector (setFullscreen: animiert :)]) { [player.view removeFromSuperview]; }} – Stephen

Verwandte Themen