IOS学习之——表视图 给tableViewController添加悬浮窗口

前言

在IOS中,UITableViewController不如UIViewController用的方便,遇到了一个需求:在TableView中添加一个悬浮按钮,不随TableView滑动而滑动。这个需求在UIViewController里面很好实现,给self.view 添加子视图,再把子视图放到最上方即可。可是在表视图控制器中,就很难办,因为控制器中没有作为tableView的父视图的view存在,而把button作为tableView的子视图出现呢,则会随着table的滑动而滑动(⊙﹏⊙b汗,搞了好久都搞不定)。不过终于搞定了这个问题。本文原创,转载请注明出处:http://blog.csdn.net/zhenggaoxing/article/details/44857765

先看看效果吧(先放个蛋糕

实现

我们的方案是把button添加为tableVIew的子视图,然后随着table的滑动,动态改变button的高度,实现效果上的“固定”。

首先,初始化button,添加为tableView的子视图,并且放到tableView上方

//  添加悬浮按钮
    flowButton=[[UIButton alloc]initWithFrame:CGRectMake(200, 200, 30, 30) ];
    [flowButton setImage:[UIImage imageNamed:@"flowButton"] forState:UIControlStateNormal];
    [self.tableView addSubview:flowButton];
    [self.tableView bringSubviewToFront:flowButton];
    buttonY=(int)flowButton.frame.origin.y;

这里说以下 bringSubviewToFront,就是把子视图移动到顶部的意思,相应的有bringSubviewToBack。看一下官网描述:


Moves the specified subview so that it appears on top of its siblings.


This method moves the specified view to the end of the array of views in the
subviews property.


Parameters


view


The subview to move to the front.


Availability


iOS (2.0 and later)

翻译一下:将指定的子视图移动到它兄弟视图的顶部,这个方法将指定的视图移动到子视图属性数组的尾部。

到这里,其实悬浮的button已经出现了,接下来就要考虑如何实现固定了。首先,看一下UITableView的继承关系

tableVIew是继承自UIScrollView的,所以这里我们通过<UIScrollViewDelegate> 的-(void)scrollViewDidScroll:(UIScrollView
*)scrollView 方法和UIScrollView的contentOffset属性来动态调整button的Y值,以实现视觉上的“固定”。

看代码:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"%d",(int)flowButton.frame.origin.y);
    flowButton.frame = CGRectMake(flowButton.frame.origin.x, buttonY+self.tableView.contentOffset.y , flowButton.frame.size.width, flowButton.frame.size.height);
}

完整代码:

//
//  CommonTableViewController.m
//  IOS table1 type
//
//  Created by h92 on 15/1/6.
//  Copyright (c) 2015年 李腾飞. All rights reserved.
//  <span style="font-size:14px;">本文原创,转载请注明出处:</span><span style="font-size:14px;">http://blog.csdn.net/zhenggaoxing/article/details/44857765</span>
//

#import "CommonTableViewController.h"
#import "DefineA.h"

@interface CommonTableViewController ()<UITableViewDataSource,UITableViewDelegate,UIScrollViewDelegate>

@end

@implementation CommonTableViewController
@synthesize dataList;
@synthesize table;
@synthesize flowButton;

- (void)viewDidLoad {
    [super viewDidLoad];
    [self initView];
}

/*--------------------------------------初始化---------------------------------------*/
-(void)initView
{
    [self setup];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
-(void)setup
{
//  添加悬浮按钮
    flowButton=[[UIButton alloc]initWithFrame:CGRectMake(200, 200, 30, 30) ];
    [flowButton setImage:[UIImage imageNamed:@"flowButton"] forState:UIControlStateNormal];
    [self.tableView addSubview:flowButton];
    [self.tableView bringSubviewToFront:flowButton];
    buttonY=(int)flowButton.frame.origin.y;

    // 获取文件路径
    NSBundle *bundle=[NSBundle mainBundle];
    NSString *plist=[bundle pathForResource:@"team" ofType:@"plist"];

    // 读取文件数据(nsdictionary 类型)
    dataList=[[NSMutableArray alloc] initWithContentsOfFile:plist];

    // 设置title
    self.title=COMMOMTABLETITLE;
}

#pragma mark-dataSource method
/*--------------------------------------班级点名---------------------------------------*/
// 第几组有几个人
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    return [dataList count];
}

// 他们都叫什么
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 确定Cell标识
    static NSString *[email protected]"Cell";

    // 复用 Cell
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell==nil){
        //    UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:cellIdentifier];
        //    UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];

    }
    [email protected]"这就是副标题";

    // 球队名称
    cell.textLabel.text=[[dataList objectAtIndex:indexPath.row] objectForKey:@"name"];

    // 根据plist文件生成 字符串
    NSString *imagePath=[[[dataList objectAtIndex:indexPath.row]objectForKey:@"image"] stringByAppendingString:@".png"];

    // 根据字符串加载图片
    cell.imageView.image=[UIImage imageNamed:imagePath];
//    cell.accessoryType=UITableViewCellAccessoryNone;
    cell.accessoryType=UITableViewCellAccessoryCheckmark;
//    cell.accessoryType=UITableViewCellAccessoryDetailButton;
//    cell.accessoryType=UITableViewCellAccessoryDetailDisclosureButton;
//    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"%d",(int)flowButton.frame.origin.y);
    flowButton.frame = CGRectMake(flowButton.frame.origin.x, buttonY+self.tableView.contentOffset.y , flowButton.frame.size.width, flowButton.frame.size.height);
}

@end

源代码:https://git.oschina.net/zhengaoxing/table1-type

本文原创,转载请注明出处:http://blog.csdn.net/zhenggaoxing/article/details/44857765

时间: 2024-12-21 08:35:54

IOS学习之——表视图 给tableViewController添加悬浮窗口的相关文章

IOS学习之——表视图3 自定义单元格

写在前面 今天看新闻,科比肩部撕裂,可能会提前退役,这个顽固的男人,终于要落幕了,虽然我不是他的球迷,也是心生敬仰,今天的主题就以科比为素材,向这位人生的斗士致敬. 前面我们讲到了tableview的单元格的系统自带的image label,用起来很方便,可是毕竟限制很多,这一篇将会讲到一个神奇的东西--自定义单元格,由你控制单元格显示的内容,位置,形式.如下图,我们要制作一个球星列表,需要四项信息:头像+姓名+年龄+性别 设置界面 拖控件,如下图 设置单元格高度,这里要讲一下高度有两个: 设置

iOS学习——UITableView表视图单元样式

UITableViewCell默认的单元有4种: 1.UITableViewCellStyleDefault 2.UITableViewCellStyleSubtitle 3.UITableViewCellStyleValue1 4.UITableViewCellStyleValue2 首先要介绍下,默认的单元格使用了3种不同的元素. 图像:如果指定的样式中包含图像,那么该图像将显示在单元的文本左侧. 文本标签:单元的主要文本. 详细文本标签:单元的辅助文本,通常用作解释性的说明或标签. 如何使

iOS开发学习之#表视图#(1)删除行

好久木有写博客了,前面学习的表视图其他内容都木有写,今天就从删除行开始吧,希望自己能够坚持下去..加油(^ω^)..废话少说吧,,,直接上代码: 下面是删除行的核心代码: - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ if (editingStyle

表视图控制器(TableViewController)(三) 、 表视图搜索

1 乐库的设置界面 1.1 问题 tableView分为静态(static)和动态(dynamic),之前使用的都是动态的tableView,表视图的有多少分区.有多少行以及每一行显示的内容都不是固定的,都由数据模式来决定.而静态的tableView有多少分区.有多少行以及每一行显示的内容都是固定不变的. 静态tableView应用广泛,常用于各种应用软件的设置界面,本案例使用静态tableView完成乐库的设置界面,如图-1所示: 图-1 1.2 方案 由图-1可以看到该界面的显示内容是固定不

IOS开发之表视图(UITableView)

IOS开发之表视图(UITableView)的基本介绍(一) (一):UITableView的基本概念 1.在IOS开发中,表视图的应用十分广泛和普及.因此掌握表视图的用法显得非常重要.一般情况下对于数据的展示 我们都会选择表视图,比如通讯录和一些数据列表. 2.我们可以选择创建表视图也可以创建表视图控制器. (二)UITableView基本样式如下(1:UITableViewStylePlain(普通表视图),2:UITableViewStyleGroup(分组表视图)): (三)UITabl

iOS开发学习之#表视图#(2)添加行

继续上篇学到的删除行,有删除就有添加:添加行我们用 - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 其中(NSArray *)indexPaths用于识别表视图中得行,(UITableViewRowAnimation)animation用来指定动画 核心代码如下: //设置表单元的编辑风格 - (UITableViewCellEditi

iOS开发学习之#表视图#(3)移动行

继续上篇接下来介绍移动行:移动行我们用 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath (UITableView *)tableView用来指定表视图,(NSIndexPath *)sourceIndexPath用来指定要移动行的索引路径,(NSIndexPath

iOS开发学习之#表视图#(4)填充Grouped风格的分组表

直接上代买吧: @implementation ViewController - (void)viewDidLoad { a = [NSArray arrayWithObjects:@"ant",@"alpaca",@"albatross", nil]; b = [NSArray arrayWithObjects:@"badger",@"bat",@"bear", nil]; c = [

表视图控制器(TableViewController)(一)

1 创建一个UITableViewController并展示简单数据 1.1 问题 有很多移动客户端的应用都是采用表的形式来展示数据,因为表视图能使数据看起来更规整.更有调理,比如微信界面就是使用的表视图,如图-1所示: 图-1 在IOS中表视图是非常重要的视图,类型名称为UITabelViewController,是UIViewController的子类,本案例将学习如何使用UITableViewController来展示简单的数据,完成效果如图-2所示: 图-2 1.2 方案 首先创建一个S