`
jsntghf
  • 浏览: 2532010 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

可伸缩的表视图(二)

    博客分类:
  • iOS
阅读更多

以前,写了一篇文章:可伸缩的表视图,实现的是类似QQ的可折叠形式的表视图,这篇文章提供了另一种解决方案。

 

下面只列出表视图的相关代码,其他代码请参考附件。

 

 

RootNavigationController.h

 

#import <UIKit/UIKit.h>

@interface RootNavigationController : UINavigationController {
    
}

@end

#import "QQSectionHeaderView.h"

@interface RootViewController : UITableViewController<QQSectionHeaderViewDelegate> {	
	NSMutableArray *lists;
}

@end

 

RootNavigationController.m

 

#import "RootNavigationController.h"
#import "QQList.h"

@implementation RootNavigationController

@end

#define HEADER_HEIGHT 35

@implementation RootViewController

- (void) loadQQData {
	for (int i = 0; i < 10; i++) {
		QQList *list = [[[QQList alloc] init] autorelease];
		list.m_nID = i;
		list.m_strName = @"QQGroupName";
		list.m_arrayPersons = [[[NSMutableArray alloc] init] autorelease];
		list.opened = YES; 
		for (int j = 0; j < arc4random() % 20; j++) {
			QQPerson *person = [[[QQPerson alloc] init] autorelease];
			person.m_nQQNumber = 10000 + abs(arc4random() % 100000000);
			person.m_nListID = i; 
			person.m_bIsOnline = arc4random() % 10 < 5 ? YES : NO;
			person.m_strNickName = @"[Eric]";	
			person.m_strRemarkName = arc4random() % 10 < 5 ? @"张三": @"李四";
			person.m_strLongNickInfo = @"http://2015.iteye.com"; 
			person.m_strHeadImageURLString = nil; 
			
			[list.m_arrayPersons addObject:person];
		}
		[lists addObject:list];
	}
}

- (void)loadView {
	[super loadView];
	lists = [[[NSMutableArray alloc] init] retain];	
	[self performSelector:@selector(loadQQData)];
}

- (void)viewDidLoad {
    [super viewDidLoad];
	[self setTitle:@"QQTableView"];
	self.tableView.delegate = self;
	self.tableView.dataSource = self;
}

- (void)dealloc {
	[lists release];
    [super dealloc];
}

#pragma mark -
#pragma mark Table view data source

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
	return HEADER_HEIGHT;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [lists count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
	QQList *persons = [lists objectAtIndex:section];
	if ([persons opened]) {
		return [persons.m_arrayPersons count]; 
	} else {
		return 0;
	}
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
	QQList *persons = [lists objectAtIndex:section];
	int onlineCount = 0;
	for (QQPerson *person in persons.m_arrayPersons) {
		if ([person isOnline]) {
			onlineCount++;
		}
	}
	NSString *headString = [NSString stringWithFormat:@"%@ [%d/%d] ", persons.m_strName, onlineCount, [persons.m_arrayPersons count]];
	
	QQSectionHeaderView *sectionHeadView = [[QQSectionHeaderView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, HEADER_HEIGHT) title:headString 
                                    section:section opened:persons.opened delegate:self];
	return [sectionHeadView autorelease];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }
	QQList *persons = [lists objectAtIndex:indexPath.section];
    QQPerson *person = [persons.m_arrayPersons objectAtIndex:indexPath.row];
	if ([person isOnline]) {
		[cell textLabel].text = person.m_strNickName;
	} else {
		[cell textLabel].text =[NSString stringWithFormat:@"%@ (Offline)", person.m_strNickName];
    }
	[cell textLabel].font = [UIFont boldSystemFontOfSize:14.0];
    
	[cell detailTextLabel].text = person.m_strLongNickInfo;
	[cell setImage:[UIImage imageNamed:@"headicon.jpg"]];

    return cell;
}

- (void)sectionHeaderView:(QQSectionHeaderView *)sectionHeaderView sectionClosed:(NSInteger)section
{
	QQList *persons = [lists objectAtIndex:section];
	persons.opened = !persons.opened;

	NSInteger countOfRowsToDelete = [self.tableView numberOfRowsInSection:section];
    if (countOfRowsToDelete > 0) {
        persons.indexPaths = [[NSMutableArray alloc] init];
        for (NSInteger i = 0; i < countOfRowsToDelete; i++) {
            [persons.indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:section]];
        }
        [self.tableView deleteRowsAtIndexPaths:persons.indexPaths withRowAnimation:UITableViewRowAnimationTop];
    }
}

- (void)sectionHeaderView:(QQSectionHeaderView *)sectionHeaderView sectionOpened:(NSInteger)section
{
	QQList *persons = [lists objectAtIndex:section];
	persons.opened = !persons.opened;
	
	if(persons.indexPaths) {
		[self.tableView insertRowsAtIndexPaths:persons.indexPaths withRowAnimation:UITableViewRowAnimationBottom];
	}
	persons.indexPaths = nil;
}

@end

 

示例图:


分享到:
评论

相关推荐

    listView伸缩实现.rar

    然而,当需要实现更复杂的交互,比如二级展开、列表项的伸缩效果时,单纯的ListView就显得力不从心了。这时,我们需要引入ExpandableListView。"listView伸缩实现"这个项目就是针对这种需求的一个实例,提供了代码...

    可伸缩视频编码HEVC

    HEVC标准的研发始于H.264/AVC标准化完成之后,该标准旨在为工作室、多视图视频和可伸缩应用等不同服务和市场提供扩展标准。H.264/AVC的可伸缩扩展是这一努力的重要成果之一。其目标在于高效地支持多种视频质量、...

    一个支持可伸缩头部的布局

    "一个支持可伸缩头部的布局"是一种创新的UI设计,它允许用户在滚动内容时头部布局能够动态改变大小,提供了一种引人注目的交互体验。这种布局常用于如电商应用的商品详情页,顶部展示商品图片或信息,当向下滚动时会...

    AXStretchableHeaderTabViewController:可伸缩标题视图+水平可滑动选项卡视图

    可伸缩标题视图+水平可滑动选项卡视图 用法 运行示例项目; 克隆存储库,然后首先从Example目录运行pod install 。 屏幕截图 可伸缩页眉 可滑动的标签 安装 AXStretchableHeaderTabViewController可通过。 要安装它...

    iOS展示视图移动的简单动画效果

    "iOS展示视图移动的简单动画效果"这一主题聚焦于如何在iOS应用中实现视图的动态伸缩和移动,为用户提供更加直观且吸引人的交互体验。 首先,我们来探讨一下iOS中的动画基础。iOS的动画主要是通过Core Animation框架...

    ListView+头部可伸缩+item可分组

    `ListView+头部可伸缩+item可分组`的主题涉及到对ListView的高级定制,以实现更丰富的交互效果和数据组织方式。这里我们将深入探讨如何实现这样一个功能强大的ListView。 首先,"头部可伸缩"是指ListView的顶部部分...

    自定义头部可伸缩ListView

    自定义头部可伸缩的`ListView`是一个结合了Android视图系统、触摸事件处理、动画和滚动行为的综合案例,对于深化对Android开发的理解和提升动手能力非常有帮助。通过这个项目,开发者不仅可以学习到如何扩展Android...

    可伸缩控件

    为了实现“可伸缩”的功能,我们需要重写`LinearLayout`的一些关键方法,如`onMeasure()`和`onLayout()`,这两个方法在确定视图大小和位置时起着核心作用。 1. **自定义ViewGroup**: 创建一个新的Java类,继承自`...

    仿qqTableview伸缩展示

    UITableView是iOS SDK中的一个关键组件,它用于显示一列可滚动的数据项,通常用于构建列表或表格视图。每个数据项对应一个UITableViewCell,可以自定义其样式和内容。 在实现“仿qqTableview伸缩展示”时,我们需要...

    分区表和分区视图.pdf

    分区视图可以是可更新的,也就是说,用户可以对视图进行插入、更新和删除操作,这些操作会自动传播到相应的分区表中。同时,也可以创建只读的分区视图,作为基础表的不可修改副本,用于数据展示或报表生成。 创建...

    可伸缩的android控件

    在Android开发中,创建可伸缩的控件是一项常见的需求,尤其在设计用户界面时,为了提供更好的用户体验,开发者往往需要实现自定义的动画效果。本文将深入探讨如何基于API 17创建一个可伸缩的Android控件,并讨论如何...

    C#2.0可伸缩界面代码

    在C# 2.0版本中,开发人员经常会面临创建具有可伸缩界面的应用程序的需求。这样的界面能够根据用户屏幕的大小和分辨率自动调整布局,提供良好的用户体验。本压缩包中的"the365WinApp"文件可能包含了一个示例项目,...

    可伸缩带农历万年历

    2. **用户界面设计**:可伸缩的日历视图是应用的一大亮点,这需要开发者熟练掌握Android的布局管理器,如LinearLayout、RelativeLayout、GridLayoutManager等,以及自定义ViewGroup的能力。同时,滑动效果和缩放动画...

    iOS开发控件,可伸缩的UITableView 仿QQ好友列表

    本教程将深入探讨如何创建一个可伸缩的UITableView,模仿QQ好友列表的功能。这样的设计可以提高用户体验,因为用户可以通过点击单元格来展开或收起子列表,使得大量信息的展示更加有序。 首先,我们需要了解...

    8种伸缩剑三维模型图纸

    6. **3D图纸**:在3D建模中,图纸通常包含多个视图,如前视图、侧视图和俯视图,以及细节特写,帮助制作者理解物体的各个角度和组成部分。图纸可能还包括颜色、材质和纹理的信息。 7. **资源应用**:这些伸缩剑的3D...

    自定义安卓时间轴,线可伸缩

    本项目标题为“自定义安卓时间轴,线可伸缩”,这意味着开发者构建了一个可以动态调整长度的时间轴组件,以适应不同长度的内容。这个特性使得时间轴能够有效地展示任何长度的信息,而不会因为内容过多导致布局拥挤...

    类似于QQ面板可伸缩的面板

    在IT行业中,创建类似QQ面板或微软Outlook界面的可伸缩控件是一项常见的需求,尤其是在开发用户界面(UI)时。这样的控件通常被称为OutlookBar或Docking Bar,它们提供了一种灵活的方式来组织和展示应用程序的功能,...

    android伸缩式悬浮窗

    在Android开发中,创建一个可伸缩式悬浮窗是一项实用且有趣的任务,它能为用户提供更灵活的操作体验。本文将详细讲解如何利用`WindowManager`实现这样的功能,并探讨相关技术要点。 首先,我们要理解`WindowManager...

    qt 动态伸缩效果实例

    在Qt框架中,动态伸缩效果通常涉及到图形视图(QGraphicsView)和动画框架(QPropertyAnimation)的使用,这些功能使得用户界面元素能够优雅地改变大小,从而增加交互性和视觉吸引力。以下是对"qt 动态伸缩效果实例...

Global site tag (gtag.js) - Google Analytics