Footer添加按钮

来源:http://www.smjxgs.com 作者:操作系统 人气:184 发布时间:2019-08-15
摘要:iOS UITableView的Section Footer添加按钮     在处理UITableView表格时,我们希望在View底部添加按钮。 用户拖动UITableView时按钮能跟随移动。 如题,实现如下界面:     - (CGFloat)tableView:(UITabl

iOS UITableView的Section Footer添加按钮

 

 

在处理UITableView表格时,我们希望在View底部添加按钮。

用户拖动UITableView时按钮能跟随移动。

如题,实现如下界面:

图片 1

 

 

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    if (section >= kSetSetting) {
        return 80;
    }
    else{
        return 2;
    }
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    if (section >= kSetSetting)
    {
        UIView *footerView = [[UIView alloc] init];
        footerView.userInteractionEnabled = YES;
        footerView.backgroundColor = [UIColor clearColor];

        UIButton *loginButton = [UIButton buttonWithType:UIButtonTypeSystem];
        [loginButton.layer setMasksToBounds:YES];
        [loginButton.layer setCornerRadius:5.0];
        [loginButton setBackgroundColor:[UIColor brownColor]];
        [loginButton setTitle:@登陆 forState:UIControlStateNormal];
        [loginButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [loginButton.titleLabel setFont:[UIFont systemFontOfSize:15]];
        [loginButton setTranslatesAutoresizingMaskIntoConstraints:NO];
        [loginButton addTarget:self action:@selector(loginBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        //[footerView addSubview:btnExit];

        [footerView addSubview:loginButton];

        UIButton *registerButton = [UIButton buttonWithType:UIButtonTypeSystem];
        [registerButton.layer setMasksToBounds:YES];
        [registerButton.layer setCornerRadius:5.0];
        [registerButton setBackgroundColor:[UIColor brownColor]];
        [registerButton setTitle:@注册 forState:UIControlStateNormal];
        [registerButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [registerButton.titleLabel setFont:[UIFont systemFontOfSize:15]];
        [registerButton setTranslatesAutoresizingMaskIntoConstraints:NO];
        [registerButton addTarget:self action:@selector(registerBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        [footerView addSubview:registerButton];

        NSDictionary *constraintsView = NSDictionaryOfVariableBindings(loginButton,registerButton);

        [footerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@V:|-15-[loginButton]-15-|  options:0 metrics:nil views:constraintsView ]];
        [footerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@|-20-[loginButton]    options:0 metrics:nil views:constraintsView ]];

        [footerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@V:|-15-[registerButton(==loginButton)]-15-|  options:0 metrics:nil views:constraintsView ]];
        [footerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@H:[loginButton]-30-[registerButton(==loginButton)]-20-|    options:0 metrics:nil views:constraintsView]];

        return footerView;
    }
    else
    {
        return nil;
    }
}

 

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^

我要捐赠: 点击捐赠

Cocos2d-X源码下载:点我传送

 

UITableView的Section Footer添加按钮 在处理UITableView表格时,我们希望在View底部添加按钮。 用户拖动UITableView时按钮能跟随移动。 如题,实现...

UITableView作为iOS非常重要的一部分,应当着重讨论

在很多新闻客户端中都有一个可以排序新闻类别的功能。也用不少通过重写UIScrollView来实现的。这里主要说下通过UICollectionView怎么实现,准确的说是通过CollectionViewFlowLayout来实现。

UITableView 学习地图

  • #### 什么是UICollectionView

基本用法-->cell定制-->编辑模式-->分区索引

UICollectionView是一种新的数据展示方式,简单来说可以把他理解成多列的UITableView(请一定注意这是UICollectionView的最最简单的形式)。如果你用过iBooks的话,可能你还对书架布局有一定印象:一个虚拟书架上放着你下载和购买的各类图书,整齐排列

Initializing a UITableView Object 初始化一个UITableView 的对象

Configuring a Table View 对一个Table View进行配置

Creating Table View Cells 创建一个cell

Accessing Header and Footer Views 访问header和footer视图

Accessing Cells and Sections 访问Cell和Section

Estimating Element Heights 元素高度的大概值

Scrolling the Table View 滚动表视图

Managing Selections 管理section

Inserting, Deleting, and Moving Rows and Sections  插入、删除和移动row和Section

Managing the Editing of Table Cells 管理table里的cell的编辑

Reloading the Table View 重载表视图

Managing the Delegate and the Data Source 管理委托和数据源

Configuring the Table index 配置table的索引

  • #### UICollectionView结构

    • Cells 用于展示内容的主体,对于不同的cell可以指定不同尺寸和不同的内容
    • Supplementary Views 追加视图 如果你对UITableView比较熟悉的话,可以理解为每个Section的Header或者Footer,用来标记每个section的view
    • Decoration Views 装饰视图,这是每个section的背景
  • #### UICollectionViewLayout

图片 2

UICollectionViewLayout是造就UICollectionView和UITableView最大不同的地方。UICollectionViewLayout可以说是UICollectionView的大脑和中枢,它负责了将各个cell、Supplementary View和Decoration Views进行组织,为它们设定各自的属性,包括但不限于:

几个知识点的解释:

  • 位置
  • 尺寸
  • 透明度
  • 层级关系
  • 形状
  • 等等等等…
  • Layout决定了UICollectionView是如何显示在界面上的。在展示之前,一般需要生成合适的UICollectionViewLayout子类对象,并将其赋予CollectionView的collectionViewLayout属性。
  1. prepareForSegue 在viewDidLoad之前

长按可移动Cell的UICollectionViewLayout

1、通过UICollectionViewLayout给UICollectionView添加长按事件:主要通过监听layout是否被添加到collectionView中。

-(void)addCollectionCreatedObserver{
  [self addObserver:self forKeyPath:@"collectionView" options:NSKeyValueObservingOptionNew context:nil];
}

2、添加长按手势

-(void)setupCollectionView{
  self.longGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handlerLongPressGesture:)];
  self.longGestureRecognizer.delegate = self;
  [self.collectionView addGestureRecognizer:self.longGestureRecognizer];
}

3、处理手势

-(void)handlerLongPressGesture:(UILongPressGestureRecognizer *)gestureRecognizer{
  switch (gestureRecognizer.state) {
      case UIGestureRecognizerStateBegan:
          [self startLongPressGesture:gestureRecognizer];
          break;
      case UIGestureRecognizerStateChanged:
          [self moveLongPressGesture:gestureRecognizer];
          break;
      case UIGestureRecognizerStateCancelled:
      case UIGestureRecognizerStateEnded:
          [self endLongPressGesture:gestureRecognizer];
          break;
      default:
          break;
  }
}

4、处理手势开始移动操作,主要记录移动的起点,对应的Cell,并对当前Cell做快照,以便移动

  self.startPoint = [gestureRecognizer locationInView:self.collectionView];
  self.selectedMoveIndexPath = currentIndexPath;
  UICollectionViewCell *collectionViewCell = [self.collectionView cellForItemAtIndexPath:self.selectedMoveIndexPath];
  self.currentMoveView = [[UIView alloc] initWithFrame:collectionViewCell.frame];
  collectionViewCell.highlighted = YES;

  UIView *highlightedISnapshotView = [collectionViewCell MT_snapshotView];
  highlightedISnapshotView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  highlightedISnapshotView.alpha = 1.0;

  collectionViewCell.highlighted = NO;
  UIView *snapshotView = [collectionViewCell MT_snapshotView];
  snapshotView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  snapshotView.alpha = 0.0;

  [self.currentMoveView addSubview:snapshotView];
  [self.currentMoveView addSubview:highlightedISnapshotView];
  [self.collectionView addSubview:self.currentMoveView];
  self.currentViewCenter = self.currentMoveView.center;

5、处理手势正在移动操作,主要记录坐标变动,并移动快照视图位置:

  CGPoint currentPoint = [gestureRecognizer locationInView:self.collectionView];
  self.currentPoint = CGPointMake(currentPoint.x - self.startPoint.x, currentPoint.y - self.startPoint.y);
  CGPoint viewCenter = self.currentMoveView.center = MT_CGPointAdd(self.currentViewCenter, self.currentPoint);

刷新CollectionView

  NSIndexPath *newIndexPath = [self.collectionView indexPathForItemAtPoint:self.currentMoveView.center];
  NSIndexPath *preIndexPath = self.selectedMoveIndexPath;
  if(newIndexPath == nil || [newIndexPath isEqual:preIndexPath]){
      return;
  }
  self.selectedMoveIndexPath = newIndexPath;

  if ([self.collectionView.dataSource respondsToSelector:@selector(collectionView:moveItemAtIndexPath:toIndexPath:)]) {
      [self.collectionView.dataSource collectionView:self.collectionView moveItemAtIndexPath:preIndexPath toIndexPath:newIndexPath];
  }
  __weak typeof(self) weakSelf = self;
  [self.collectionView performBatchUpdates:^{
      [weakSelf.collectionView deleteItemsAtIndexPaths:@[preIndexPath]];
      [weakSelf.collectionView insertItemsAtIndexPaths:@[newIndexPath]];
  } completion:^(BOOL finished) {

  }];

6、处理手势结束移动。重置记录:

NSIndexPath *currentIndexPath = self.selectedMoveIndexPath;
self.selectedMoveIndexPath = nil;
self.currentViewCenter = CGPointZero;
[self.currentMoveView removeFromSuperview];
self.currentMoveView = nil;
[self invalidateLayout];

7、重载layoutAttributesForElementsInRect:

  -(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
    NSArray *layoutAttributesForElementsInRect = [super layoutAttributesForElementsInRect:rect];
    for (UICollectionViewLayoutAttributes *layoutAttributes in layoutAttributesForElementsInRect) {
        if(layoutAttributes.representedElementCategory == UICollectionElementCategoryCell){
            [self applyLayoutAttributes:layoutAttributes];
        }
    }
    return layoutAttributesForElementsInRect;
}

8、重载layoutAttributesForItemAtIndexPath:

-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{
    UICollectionViewLayoutAttributes *layoutAttributes = [super layoutAttributesForItemAtIndexPath:indexPath];
    if(layoutAttributes.representedElementCategory == UICollectionElementCategoryCell){
        [self applyLayoutAttributes:layoutAttributes];
    }
    return layoutAttributes;
}

9、隐藏当前选择的Cell

-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
  if([layoutAttributes.indexPath isEqual:self.selectedMoveIndexPath]){
      layoutAttributes.hidden = YES;
  }
}

viewController 是轻量级的,而view很耗资源,所以VC直到访问viewController.view时才会被加载进来,在此之后才会有viewDidLoad,在加载进之前,outlet没有做connection,所以访问一定是nil。虽然这个问题在很久之前就已经发现并解决,但这种曾经的错误仍然是不适合实现的。归根结蒂的原因,VC和VC之间只可传消息、数据,如果互知对方“底细”,两个VC之间就没有划分的必要了。

移动Cell时可通知滚动UICollectionView

添加CADisplayLink,来主动触发UICollectionView滚动。

1、创建CADisplayLink

    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleScroll:)];

    [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];

2、处理屏幕刷新事件:

    CGSize frameSize = self.collectionView.bounds.size;
    CGSize contentSize = self.collectionView.contentSize;
    CGPoint contentOffset = self.collectionView.contentOffset;
    UIEdgeInsets contentInset = self.collectionView.contentInset;
    // Important to have an integer `distance` as the `contentOffset` property automatically gets rounded
    // and it would diverge from the view's center resulting in a "cell is slipping away under finger"-bug.
    CGFloat distance = rint(self.scrollingSpeed * displayLink.duration);
    CGPoint translation = CGPointZero;
    ...
    self.collectionView.contentOffset = MT_CGPointAdd(contentOffset, translation);

效果图:

图片 3

Untitled.gif

  1. static cell

完整源码--》Github

仅嵌在UITableController 里可以使用

优势一:有的界面,需要使用表格外观,却不需要数据动态,如setting。

优势二:静态表格下拉刷新(iOS6 )

图片 4

  1. UITableView的交互

->选择

->进入编辑模式,增加/删除行的处理

->数据变化如何刷新界面

扩展:如何划动删除?

本文由4887王中王鉄算盘奖结果发布于操作系统,转载请注明出处:Footer添加按钮

关键词:

最火资讯