iOS开发之路--微博“更多”页面

最终效果图:

MoreViewController.m

//
// MoreViewController.m
// 20_帅哥no微博
//
// Created by beyond on 14-8-4.
// Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "MoreViewController.h"

@interface MoreViewController ()
{
  // more.plist根是字典,有两对Key Value,其中有一对是zh_CN,对应的值是数组,数组的长度就是有多少个分组,数组的每一个元素也是一个数组,

  // 由不同的分组,组成的数组
  NSArray *_groups;
}

@end

@implementation MoreViewController

- (void)viewDidLoad
{
  [super viewDidLoad];
  log(@"view %@",NSStringFromCGRect(self.view.frame)) ;

  // 1.设置导航条上面 右边的设置按钮
  [self setRightBarButtonItem];

  // 2.加载more.plist
  [self loadPlistOfMore];

  // 3.设置tableView的全局背景
  [self setTableViewGlobalBg];

  // 4.添加 退出按钮 到tableView的最底部的TableFooterView
  [self addEixtBtnAtBottom];
}

// 1,设置导航条上面 右边的按钮
- (void)setRightBarButtonItem
{
  self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"设置" style:UIBarButtonItemStylePlain target:self action:@selector(settings)];
}
// 2,加载more.plist文件
- (void)loadPlistOfMore
{
  NSURL *url = [[NSBundle mainBundle] URLForResource:@"more" withExtension:@"plist"];
  // 由一个个分组 组成的数组,分组的成员也就是数组,则一行行组成的数组
  _groups = [NSDictionary dictionaryWithContentsOfURL:url][@"zh_CN"];
}

// 3,设置tableView的全局背景
- (void)setTableViewGlobalBg
{
  // 清除ios 7 中tableView顶部的多出的空白区域
  self.automaticallyAdjustsScrollViewInsets = NO;
  // 设置scrollView额外的滚动区域
//  self.tableView.contentInset = UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)
  // 重要~ ~当tableview的样式为group时,如果想更换背景,必须先清除条纹状的自带的backgroundView,然后才可以设置tableView的背景颜色
  self.tableView.backgroundView = nil;
  self.tableView.backgroundColor = kGlobalBg;

  // 缩小每一分组之间的间距
  self.tableView.sectionHeaderHeight = 0;
  self.tableView.sectionFooterHeight = 5;
}

// 4,创建退出按钮 并添加到tableView的最底部的TableFooterView
- (void)addEixtBtnAtBottom
{
  // 1,创建一个footerView,将它作为tableView的TableFooterView
  UIView *footerView = [[UIView alloc] init];
  // tableView的TableFooterView的宽度固定是320,只有高度可调节
  footerView.frame = CGRectMake(0, 0, 320, 60);
  // 将刚才创建的footerView作为tableView的TableFooterView,目的是防止用户点击底部dockItem时不小心点到了退出按钮,因此要设置一个额外的空间,补充一下TableFooterView的宽度固定是320
  self.tableView.tableFooterView = footerView;

  // 2,创建退出按钮 并添加到tableView的最底部的TableFooterView
  UIButton *btnExit = [UIButton buttonWithType:UIButtonTypeCustom];
  // footerView是作为tableView的TableFooterView存在,按钮是加到了footerView里面,这儿按钮的frame x 10 y 5是相对于footerView的
  btnExit.frame = CGRectMake(10, 5, 300, 40);
  // 按钮上字体大小
  btnExit.titleLabel.font = [UIFont systemFontOfSize:17];
  // 按钮的监听点击事件
  [btnExit addTarget:self action:@selector(exitBtnClick) forControlEvents:UIControlEventTouchUpInside];

  // 分类方法,设置按钮正常和高亮时背景图片(可拉伸)
  [btnExit setBtnBgImgForNormalAndHighightedWithName:@"common_button_red.png"];
  // 设置按钮上的文字,最后一组,数组只有一行,每一行就是一个字典
  NSString *btnTitle = [_groups lastObject][0][@"name"];
  [btnExit setTitle:btnTitle forState:UIControlStateNormal];

  // 3,最重要的一步,将刚才创建的 退出按钮 添加到tableView的TableFooterView
  //[footerView addSubview:btnExit];
  [self.tableView.tableFooterView addSubview:btnExit];

}
// 响应点击设置点击事件
- (void)settings
{
  log(@"点击了设置按钮");
}
// 点击 退出按钮
- (void)exitBtnClick
{
  // cancelButtonTitle 黑色
  // destructiveButtonTitle 红色
  // otherButtonTitles 灰白色
  UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"确定退出此账号?" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:@"红色" otherButtonTitles:@"其他", nil];

  // UIActionSheet最好是显示到Window上面,这样就不怕点不中了,因为有时候控制器的view不一定占整个窗口大小
  [actionSheet showInView:self.view.window];
}

// 点击 设置按钮
- (void)setting
{
  log(@"设置");
}
// 代理方法,点击了某行时调用
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

#pragma mark - 数据源方法
// 共有多少组 最后一个组是特别的退出按钮,故不进入循环使用
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return _groups.count - 1;
}

// 每一组的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  // 取得由每一行组成的数组
  NSArray *rows = _groups[section];
  // 返回该组的行数
  return rows.count;
}

// 每一组的每一行显示特有的内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

  static NSString *cellID = @"beyond";
  // 1.先获得池中的cell
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
  // 如果为空,才创建新的
  if (cell == nil) {
    // 创建新的cell
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    // 1.1.清除文本标签的背景
    cell.textLabel.backgroundColor = [UIColor clearColor];
    // 1.2.设置文本标签高亮时的文字颜色同样为默认的文字颜色 (不让它变色)
    cell.textLabel.highlightedTextColor = cell.textLabel.textColor;

    // 1.3.重点,创建时就,初始化cell的背景view和选中时的背景view
    UIImageView *bgImgView = [[UIImageView alloc] init];
    cell.backgroundView = bgImgView;

    UIImageView *selectedBgImgView = [[UIImageView alloc] init];
    cell.selectedBackgroundView = selectedBgImgView;
  }
  // 2.设置cell独一无二的内容
  // 设置显示的标题文字 第几组-->第几行--->字典
  cell.textLabel.text = _groups[indexPath.section][indexPath.row][@"name"];

  // 3.设置cell的背景图片
  // 先取出cell背景view
  UIImageView *bgImgView = (UIImageView *)cell.backgroundView;
  UIImageView *selectedBgImgView = (UIImageView *)cell.selectedBackgroundView;

  // 分情况得出cell的背景图片文件名
  // 该组中,由每一行组成的数组
  NSArray *rows = _groups[indexPath.section];
  // 得到该组的,总行数
  int rowNum = rows.count;
  NSString *name = nil;

  if (rowNum == 1) {
    // 如果所在组只有一行,使用四角全是半角的图片
    name = @"common_card_background.png";
  } else if (indexPath.row == 0) {
    // 如果所在组不只一行,且当前行是所在组的第一行,使用上半为圆角的图片
    name = @"common_card_top_background.png";
  } else if (indexPath.row == rowNum - 1) {
    // 如果所在组不只一行,且当前行是所在组的最后一行,使用下半为圆角的图片
    name = @"common_card_bottom_background.png";
  } else { // 中间
    // 如果所在组不只一行,且当前行不在组的第一行也不在组的最后一行,使用四周无圆角的图片
    name = @"common_card_middle_background.png";
  }

  // 设置cell的正常和选中时的背景图片
  bgImgView.image = [UIImage imageStretchedWithName:name];
  selectedBgImgView.image = [UIImage imageStretchedWithName:[name fileNameInsertSuffixBeforeExtension:@"_highlighted"]];

  // 4.设置最右边的箭头指示器,分文字和图片两种情况讨论
  if (indexPath.section == 2) {
    // 如果是第2组 ,则显示文字,"阅读模式 - 主题"
    UILabel *label = [[UILabel alloc] init];
    // 清除标签背景色
    label.backgroundColor = [UIColor clearColor];
    // 标签文字大小
    label.font = [UIFont systemFontOfSize:13];
    // 标签文字颜色
    label.textColor = [UIColor grayColor];
    // 标签文字靠右
    label.textAlignment = NSTextAlignmentRight;
    // 标签frame的宽高
    label.bounds = CGRectMake(0, 0, 100, 30);
    // 该组的第1行显示 "有图模式" ,第2行显示 "经典主题"
    label.text = (indexPath.row == 0) ? @"有图模式" : @"经典主题";
    // 最后将自定义最右边的view设置为cell的附属view
    cell.accessoryView = label;
  } else {
    // 如果是其他的组,显示向右的图片箭头
    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"common_icon_arrow.png"]];
  }
  // 5.返回cell
  return cell;
}

@end

『更多』页面的数据来源more.plist

(0)

相关推荐

  • iOS新浪微博、腾讯微博分享功能实例

    一个是新浪微博,腾讯微博的分享按钮,一个是他们的绑定情况(其实就是是否授权).点击微博分享中新浪或腾讯按钮,就进行相应的授权(若没授权),显示微博内容,而后发布微博.设置界面中的绑定,就是相关的应用授权. 呵呵,其实也蛮简单滴. 首先分别从新浪微博开放平台(http://open.weibo.com/).腾讯微博开放平台(http://dev.t.qq.com/)中注册应用,获取到Appkey,AppSecret和AppURL(其中 AppURL是要自己填写的). 然后分别下载相关的SDK. h

  • iOS开发之路--微博OAuth授权_取得用户授权的accessToken

    最终效果图: OauthViewController.m // // OauthViewController.m // 20_帅哥no微博 // // Created by beyond on 14-8-5. // Copyright (c) 2014年 com.beyond. All rights reserved. // 授权控制器,仅运行一次,取得了当前用户的access_token和uid之后,存档,切换窗口的主控制器 #import "OauthViewController.h&quo

  • iOS仿微博客户端一条微博的展示效果

    前言 做一个微博客户端的第三方是自学的第一个实践的项目,自从从事iOS工作之后,就把这个项目给搁置了.趁现在过年回来有些空闲时间,再次修改(总觉得项目就是不停地修改).并且记录一点东西,以后可再回头看看从前走过的路,挖过的坑.这是一条微博的展示,不是整个项目. 废话不多说,先上效果图: 拆分控件 在开始动手写代码之前,我们得先确定怎么去实现这样子的布局,也就是分析需要用到哪些控件. 观察微博客户端,整体是可滑动的,而且界面展示比较规律的,所以应该是使用UITableView实现的.那么一条微博应

  • iOS 仿微博客户端红包加载界面 XLDotLoading效果

    一.显示效果 二.原理简介 1.思路 要实现这个效果需要先知道这两个硬币是怎样运动的,然后通过放大.缩小的效果实现的这种有距离感的效果.思路如下: 一.这两个硬币是在一定范围内做相对运动的,可以先使一个硬币在一个固定范围内做左右的往复运动,另一个硬币和它做"相对运动"即可. 二.让硬币从左至右移动时先变小再回复正常:从右至左移动时先变大再回复正常:这样就实现了这用有距离感的"相对运动". 2.代码 第一步 要实现一个硬币在一定范围内实现左右往复运动,需要先固定一个范

  • iOS中使用UItableviewcell实现团购和微博界面的示例

    使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 一.项目文件结构和plist文件 二.实现效果 三.代码示例 1.没有使用配套的类,而是直接使用xib文件控件tag值操作 数据模型部分: YYtg.h文件 复制代码 代码如下: // //  YYtg.h //  01-团购数据显示(没有配套的类) // //  Created by apple on 14-5-29. //  Copyright (c) 2014年 itcase. All rights reserv

  • iOS开发之路--微博骨架搭建

    最终效果图: BeyondViewController.m // // BeyondViewController.m // 20_帅哥no微博 // // Created by beyond on 14-8-3. // Copyright (c) 2014年 com.beyond. All rights reserved. // 这个就是主控制器,分为两块,下面是Dock栏,上面是显示不同的子控制器的view,子控制器最好用导航控制器包装一下,这样子控制器就自带了导航条,左按钮,标题,右按钮 /

  • 完整的iOS新浪微博分享功能开发

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 做新浪分享 需先去http://open.weibo.com/apps注册开发者app 很简单! 第1步 第2步 3 设置你的应用的信息 找到自己的appkey 还需要设置自己的kAppRedirectURL测试可以随便写个! 开发部分在下面ios新浪微博分享(2)这部分: 开发需要下载官方的sdkhttp://open.weibo.com/wiki/SDK#iOS_SDK 本人下载的版本 新建一个viewco

  • iOS开发之路--微博新特性页面

    BeyondAppDelegate.m // // BeyondAppDelegate.m // 20_帅哥no微博 // // Created by beyond on 14-8-3. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "BeyondAppDelegate.h" #import "BeyondViewController.h" #import "NewFe

  • iOS仿微博图片浏览器

    KNPhotoBrower 高仿微博图片浏览器 PhotoBrower.gif 一.功能描述及要点 1.加载网络九宫格图片,collectionView,scrollView 2.SDWebImage下载图片,KNProgressHUD显示加载进度 3.高仿微博,显示动画,KNToast提示 二.方法调用 1.创建KNPhotoBrower,并传入相应的参数 // 每一个图片控件对象, 对一一对应 KNPhotoItems ,再将多个KNPhotoItems 对象放入数组 KNPhotoItem

  • iOS开发之路--微博“更多”页面

    最终效果图: MoreViewController.m // // MoreViewController.m // 20_帅哥no微博 // // Created by beyond on 14-8-4. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "MoreViewController.h" @interface MoreViewController () { // more.plist根是字典

  • IOS开发之路--C语言基础知识

    概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift 这么看下去还有大量的内容需要持续补充,但是今天我们从最基础的C语言开始,C语言部分我将分成几个章节去说,今天我们简单看一下C的一些基础知识,更高级的内容我将放到后面的文章中. 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述): Hello World 运行过程 数据类型 运算符 常用

  • IOS开发之路--C语言存储方式和作用域

    概述 基本上每种语言都要讨论这个话题,C语言也不例外,因为只有你完全了解每个变量或函数存储方式.作用范围和销毁时间才可能正确的使用这门语言.今天将着重介绍C语言中变量作用范围.存储方式.生命周期.作用域和可访问性. 变量作用范围 存储方式 可访问性 变量作用范围 在C语言中变量从作用范围包括全局变量和局部变量.全局变量在定义之后所有的函数中均可以使用,只要前面的代码修改了,那么后面的代码中再使用就是修改后的值:局部变量的作用范围一般在一个函数内部(通常在一对大括号{}内),外面的程序无法访问它,

  • IOS开发之路--C语言指针

    概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 什么是指针 数组和指针 函数指针 什么是指针 存放变量地址的变量我们称之为"指针变量",简单的说变量p中存储的是变量a的地址,那么p就可以称为是指针变量,或者说p指向a.当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对应的存储空间中拿到a的值,这种方式我们称之为"直接

  • IOS开发之路--C语言数组和字符串

    概览 数组在C语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等.而在C语言中是没有String类型的,那么如果要表示一个字符串,就必须使用字符串数组.今天主要就介绍如下三个方面: 一维数组 多维数组 字符串 一维数组 一维数组操作比较简单,但是需要注意,数组长度必须是固定的,长度不能使用变量进行初始化:如果声明的同时进行赋值则数组长度可以省略,编译器会自动计算数组长度:同时数组不能先声明再一次性赋值(当然可以对每个元素一一赋值). #include <stdi

  • IOS开发之路--C语言预处理

    概述 大家都知道一个C程序的运行包括编译和链接两个阶段,其实在编译之前预处理器首先要进行预处理操作,将处理完产生的一个新的源文件进行编译.由于预处理指令是在编译之前就进行了,因此很多时候它要比在程序运行时进行操作效率高.在C语言中包括三类预处理指令,今天将一一介绍: 宏定义 条件编译 文件包含 宏定义 对于程序中经常用到的一些常量或者简短的函数我们通常使用宏定义来处理,这样做的好处是对于程序中所有的配置我们可以统一在宏定义中进行管理,而且由于宏定义是在程序编译之前进行替换相比定义成全局变量或函数

  • iOS开发之路--仿网易抽屉效果

    最终效果图: MainStoryBoard示意图: BeyondViewController.h // // BeyondViewController.h // 19_抽屉效果_仿网易 // // Created by beyond on 14-8-1. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import <UIKit/UIKit.h> #import "LeftTableViewControllerD

随机推荐