2017-07-12 7 views
0

Im Moment wird ein ImageScroller von UIScrollView bereitgestellt, und es enthält eine Filter-Symbolleiste am unteren Rand, wie Sie auf dem Bild sehen können.Anwenden von Filter auf den aktuellen Bildindex in UIScrollView GPUImage

enter image description here

Aber im vor einem Problem ist, dass, wenn ich die Taste drücken, wird die Filter nur unten an das letzte Bild als Beispiel gelten:

Gif Beispiel

Gif Example

Also bitte jeder kann mir helfen, dieses zu lösen, meine erwartete Ausgabe ist der Filter wird auf das aktuelle angezeigte Bild angewendet, nicht nur das letzte ein. Hier würde ich meinen Code als Referenz beifügen und vielen Dank.

@interface EditImageVC() 
@end 

@implementation EditImageVC 


UIImageView *img; 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    int x=0; 
    for (int i = 0; i < _scrollViewImageArray.count ; i++) { 

     _picture = [_scrollViewImageArray objectAtIndex:i]; 
     img =[[UIImageView alloc]initWithFrame:CGRectMake(x,20,[[UIScreen mainScreen] bounds].size.width, 
     self.imgScrollView.frame.size.height)]; 
     img.image =_picture; 
     x=x+[[UIScreen mainScreen] bounds].size.width; 
     [_imgScrollView addSubview:img]; 
    } 
    _imgScrollView.backgroundColor = [UIColor blackColor]; 
    _imgScrollView.contentSize=CGSizeMake(x, 
    _imgScrollView.frame.size.height); 
    _imgScrollView.contentOffset=CGPointMake(0, 0); 
    img.contentMode = UIViewContentModeScaleAspectFit; 
} 


-(void)viewDidLayoutSubviews{ 
    self.automaticallyAdjustsScrollViewInsets = NO; 
} 



- (IBAction)filterAction:(UIButton *)sender { 

    for (int i = 0; i < _scrollViewImageArray.count ; i++) { 
     UIImage *picture = [_scrollViewImageArray objectAtIndex:i]; 
     GPUImageFilter *selectedFilter; 
     switch (sender.tag) { 
      case 0: 
       selectedFilter = [[GPUImageSepiaFilter alloc] init]; 
       break; 
      case 1: 
       selectedFilter = [[GPUImageToonFilter alloc] init]; 
       break; 
      default: 
       break; 
     } 
     UIImage *filteredImage = [selectedFilter imageByFilteringImage:picture]; 
     [img setImage:filteredImage]; 
    } 
} 

Antwort

1

filtern, dass nur die letzte angezeigte Bild und als Filterbild, wenn Scroll to another image gescrollt.

erinnern UIScrollViewDelegate hinzufügen

@interface EditImageVC : UIViewController <UIScrollViewDelegate> { 
} 

@end 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    imageViewsArray = [[NSMutableArray alloc] init]; 
    int x=0; 
    for (int i = 0; i < _scrollViewImageArray.count ; i++) { 

     _picture = [_scrollViewImageArray objectAtIndex:i]; 
     img =[[UIImageView alloc]initWithFrame:CGRectMake(x,20,[[UIScreen mainScreen] bounds].size.width, 

     self.imgScrollView.frame.size.height)]; 
     img.image =_picture; 
     [imageViewsArray addObject:img]; 
     x=x+[[UIScreen mainScreen] bounds].size.width; 
     [self.imgScrollView addSubview:img]; 
    } 
    self.imgScrollView.backgroundColor = [UIColor blackColor]; 
    self.imgScrollView.contentSize=CGSizeMake(x, 
              self.imgScrollView.frame.size.height); 
    self.imgScrollView.contentOffset=CGPointMake(0, 0); 
    img.contentMode = UIViewContentModeScaleAspectFit; 

    self.imgScrollView.delegate = self; 
} 

GPUImageFilter *selectedFilter = nil; 

NSInteger currentShownIndex = 0; 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    NSInteger indexAfterScrolled = scrollView.contentOffset.x/scrollView.frame.size.width; 
    if(indexAfterScrolled==currentShownIndex) return; 
    currentShownIndex = indexAfterScrolled; 
    if(selectedFilter!=nil) { 
     UIImage *filteredImage = [selectedFilter imageByFilteringImage:[_scrollViewImageArray objectAtIndex:currentShownIndex]]; 
     [[imageViewsArray objectAtIndex:currentShownIndex] setImage:filteredImage]; 
    } 
} 

- (IBAction)filterAction:(UIButton *)sender { 

    switch (sender.tag) { 
     case 0: 
      selectedFilter = [[GPUImageSepiaFilter alloc] init]; 
      break; 
     case 1: 
      selectedFilter = [[GPUImageToonFilter alloc] init]; 
      break; 
     default: 
      break; 
    } 
    UIImage *picture = [_scrollViewImageArray objectAtIndex:currentShownIndex]; 
    UIImage *filteredImage = [selectedFilter imageByFilteringImage:picture]; 
    [[imageViewsArray objectAtIndex:currentShownIndex] setImage:filteredImage]; 
} 

Aktualisiert Wenn Sie aktuelle angezeigte Bild filtern möchten, müssen nicht UIScrollViewDelegate anwenden:

- (void)viewDidLoad { 
     [super viewDidLoad]; 
     imageViewsArray = [[NSMutableArray alloc] init]; 
     int x=0; 
     for (int i = 0; i < _scrollViewImageArray.count ; i++) { 

      _picture = [_scrollViewImageArray objectAtIndex:i]; 
      img =[[UIImageView alloc]initWithFrame:CGRectMake(x,20,[[UIScreen mainScreen] bounds].size.width, 

      self.imgScrollView.frame.size.height)]; 
      img.image =_picture; 
      [imageViewsArray addObject:img]; 
      x=x+[[UIScreen mainScreen] bounds].size.width; 
      [self.imgScrollView addSubview:img]; 
     } 
     self.imgScrollView.backgroundColor = [UIColor blackColor]; 
     self.imgScrollView.contentSize=CGSizeMake(x, 
               self.imgScrollView.frame.size.height); 
     self.imgScrollView.contentOffset=CGPointMake(0, 0); 
     img.contentMode = UIViewContentModeScaleAspectFit; 

     self.imgScrollView.delegate = self; 
    } 

    - (IBAction)filterAction:(UIButton *)sender { 
     NSInteger objectAtIndex:currentShownIndex = scrollView.contentOffset.x/scrollView.frame.size.width; 
      GPUImageFilter *selectedFilter = nil; 

     switch (sender.tag) { 
      case 0: 
       selectedFilter = [[GPUImageSepiaFilter alloc] init]; 
       break; 
      case 1: 
       selectedFilter = [[GPUImageToonFilter alloc] init]; 
       break; 
      default: 
       break; 
     } 
     UIImage *picture = [_scrollViewImageArray objectAtIndex:currentShownIndex]; 
     UIImage *filteredImage = [selectedFilter imageByFilteringImage:picture]; 
     [[imageViewsArray objectAtIndex:currentShownIndex] setImage:filteredImage]; 
    } 
+0

Danke für deine Antwort, habe ich versucht, beide Lösungen aber es funktioniert nicht. Für die zweite Lösung wurde eine Ausnahme für die Schleife (UIImageView * subview ... in ..) ausgelöst. Die Ausnahme ist: [UIScrollView countByEnumeratingWithState: objects: count:] –

+0

Ich habe vergessen, in meinem Beispiel ein Othing durchzuführen. init 'imageViewsArray' in' viewDidLoad'. Hast du das versucht? @DuyKhanhNguyen – Codus

+0

Vielen Dank, es ist wahr, dass wir das ImageArray initiieren müssen, und das erste ist gearbeitet, aber über das zweite, können Sie erneut die for-Schleife ?. Cuz muss ich Filter auf das aktuelle Bild anwenden, nicht das ganze alles.Ich meine, wenn ich zu jedem Bild scrollen, sollte es den Filter auf das Bild anwenden –

Verwandte Themen