ios - 以编程方式将 UIButtons 添加到 UICollectionView 单元格的 uiimage

标签 ios objective-c iphone uibutton uiimage

我有一个 UIViewController,其中以编程方式在其中创建了一个 UICollectionView 图片库。我想在 UICollectionView 单元格的每个 uiimage 上添加一个按钮: CMFViewController.h.m 文件中用于将按钮添加到 imageview 的代码是:

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

    CMFGalleryCell *cell = (CMFGalleryCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];

    NSString *imageName = [self.dataArray objectAtIndex:indexPath.row];
    [cell setImageName:imageName];
   // [[cell myButton] addTarget:self action:@selector(myClickEvent:event) forControlEvents:UIControlEventTouchUpInside];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(80.0, 210.0, 100.0, 20.0);
    [button addTarget:self action:@selector(show) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"ShowView" forState:UIControlStateNormal];

  //  NSMutableArray *buttonArray = [NSMutableArray arrayWithCapacity:100];

  //  for (int i = 0; i < 4; i++) {
       // NSUInteger index = arc4random() % 4;


        // newButton.frame = CGRectMake( 5,  5, 10, 10);    // Whatever position and size you need...

       // UIImage *buttonImage = [UIImage imageNamed:[self.dataArray objectAtIndex:indexPath.row]];
        //[newButton setBackgroundImage:buttonImage forState:UIControlStateNormal];

     //   [buttonArray addObject:newButton];
  //  }
   // newButton = buttonArray;   // Where myButtons is a NSArray property of your class, to store references to the buttons.

   // [newButton addTarget:self action:@selector(loadImages:) forControlEvents:UIControlEventTouchUpInside];
    //[newButton addTarget:self action:@selector(updateCell) forControlEvents:UIControlEventTouchUpInside];

    [cell updateCell];

    return cell;

}

我想从以下链接的代码中获得帮助 adding-a-uibutton-to-a-uicollectionview

UIButton in cell in collection view not receiving touch up inside event 请给我你的建议并帮助我解决这个问题。

从这个链接你可以下载source codeCreating a Paged Photo Gallery With a UICollectionView : 他们我想将下一个和上一个按钮放在屏幕每个图像的中间线上

最佳答案

为了实现下一个和上一个按钮,不要将它添加到每个图像上,最好将它添加到 Collection View 中,chinttu-maddy-ramani 在他的回答中所说的是正确的,但他是在 xib 文件中做的,但是以编程方式你可以像下面那样做,

只需添加这段代码

编辑要求更新按钮

CMFViewController.h 文件中创建两个按钮属性 用下面的代码替换

 #import <UIKit/UIKit.h>

 @interface CMFViewController : UIViewController <UICollectionViewDataSource,   UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>
 @property (nonatomic, strong) UIButton *nextButton;
 @property (nonatomic, strong) UIButton *prevButton;
 @end

CMFViewController.m 文件中

 - (void)viewDidLoad
  {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self loadImages];
    [self setupCollectionView]; 
    [self addNextAndPreviousButtons];//add a method to add previous and next buttons 
 }

 //hear u are adding previous and next images, but i didn't added the constraints u add it if u want t work in both orientation 
 - (void)addNextAndPreviousButtons
 {
    _nextButton = [UIButton buttonWithType:UIButtonTypeSystem];
    _nextButton.frame =CGRectMake(self.view.bounds.size.width - 40, self.view.bounds.size.height/2, 50, 30);
    [_nextButton setTitle:@"Next" forState:UIControlStateNormal];
    [_nextButton addTarget:self action:@selector(nextButtonAction:) forControlEvents:UIControlEventTouchUpInside];

    _prevButton = [UIButton buttonWithType:UIButtonTypeSystem];
    _prevButton.frame =  CGRectMake(self.view.bounds.origin.x, self.view.bounds.size.height/2, 50, 30);
    [_prevButton setTitle:@"Prev" forState:UIControlStateNormal];
    [_prevButton addTarget:self action:@selector(previousButtonAction:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:_nextButton];
    [self.view addSubview:_prevButton];

}

 //previous button action
- (void)previousButtonAction:(id)sender
{
    NSArray *visibleCell = [_collectionView visibleCells];
    if(visibleCell)
    {
      NSIndexPath *path = [_collectionView indexPathForCell:[visibleCell lastObject]];
      if(!path.row == 0)
      {
         NSIndexPath *nextPath = [NSIndexPath indexPathForItem:(path.row - 1) inSection:0];
         [_collectionView scrollToItemAtIndexPath:nextPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
     }
   }
}

//next button action
- (void)nextButtonAction:(id)sender  
{
    NSArray *visibleCell = [_collectionView visibleCells];
    if(visibleCell)
   {
      NSIndexPath *path = [_collectionView indexPathForCell:[visibleCell lastObject]];
     if(path.row < [_dataArray count] - 1)
     {
         NSIndexPath *nextPath = [NSIndexPath indexPathForItem:(path.row + 1) inSection:0];
         [_collectionView scrollToItemAtIndexPath:nextPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
    }
  }
}

//edited the method addNextAndPreviousButtons please replace it by this edited answer
//for all cases even when u are swiping 
//this is to handle buttons either by tapping or navigation through swiping the collection view 
- (void)updateButtons:(NSInteger)row
 {
    //at the beginning
    if(row == 0)
    {
      _prevButton.hidden = YES;
      _nextButton.hidden = NO;
      return;
    }
    else if(row == ([_dataArray count] -1))
    {
      _nextButton.hidden = YES;
      _prevButton.hidden = NO;
    }
    else
    {
      _nextButton.hidden = NO;
      _prevButton.hidden = NO;
    }
 }

//finally u have to call updateButtons method  this method 
 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
 {
   CMFGalleryCell *cell = (CMFGalleryCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];

   NSString *imageName = [self.dataArray objectAtIndex:indexPath.row];
   [cell setImageName:imageName];
   [cell updateCell];
   [self updateButtons:indexPath.row]; //update the buttons 
   return cell;

 }

关于ios - 以编程方式将 UIButtons 添加到 UICollectionView 单元格的 uiimage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26879608/

相关文章:

ios - 如何询问设备屏幕比例(iphone 或 ipad)?

ios - 在 iOS 中等待用户交互的设计模式?

iphone - NSUserDefaults,仅在第一次加载时执行某些操作

iphone - 以后如何删除 child ? (cocos2d)

ios - 在cocos2d中用颜色填充一个圆圈

objective-c - 通过蓝牙发送文件

iOS WebView WTF 崩溃

ios - 由于内存不足警告,我的应用程序不断崩溃,如何以内存高效的方式使用 GPUImage?

iphone - refreshObject 如何在嵌套的托管对象上下文中工作?

objective-c - 为什么我必须创建一个对象并将其分配给 Objective C 中的属性?