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 "LeftTableViewControllerDelegate.h"

@interface BeyondViewController : UIViewController
// 左半边 (显示 的是栏目列表 )
@property (weak, nonatomic) IBOutlet UIView *leftView;
// 右半边 (显示 的是个人信息设置视图)
@property (weak, nonatomic) IBOutlet UIView *rightView;
// 最上面,最大的全屏的是主视图
@property (weak, nonatomic) IBOutlet UIView *mainView;

// 上面标题状态栏视图中的标题按钮 (网易的Logo图片和栏目的名称 水平排列)
@property (weak, nonatomic) IBOutlet UIButton *titleBtn;

// mainView的下半部分 是 正文的view,显示子栏目的view
@property (weak, nonatomic) IBOutlet UIView *contentView;

// pan 拽 手势处理
- (IBAction)panGesture:(UIPanGestureRecognizer *)sender;

// mainView的上半部分 标题状态栏视图中的左,右按钮
- (IBAction)btnClick:(UIButton *)sender;

@end

BeyondViewController.m

//
// BeyondViewController.m
// 19_抽屉效果_仿网易
//
// Created by beyond on 14-8-1.
// Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "BeyondViewController.h"
#import "LeftTableViewController.h"
#import "RightViewController.h"
#import "Column.h"
#import <QuartzCore/QuartzCore.h>
// 手势结束时的x
#define kEndX frame.origin.x
// 左view的宽度
#define kLeftWidth _leftView.frame.size.width

// 右view的宽度
#define kRightWidth _rightView.frame.size.width

// 对协议进行提前声明
@protocol LeftTableViewControllerDelegate ;

@interface BeyondViewController ()<LeftTableViewControllerDelegate>
{
  // 手指按下的时候,记住,mainView的起始x
  CGFloat _startX;

  // 成员变量,记住左边控制器的实例
  LeftTableViewController *_leftVC;
  // 成员变量,记住右边控制器的实例
  RightViewController *_rightVC;

  // 字典 ,记住所有实例化了 栏目的子控制器,避免每次都重新创建
  NSMutableDictionary *_columnViewControllers;

}

@end

@implementation BeyondViewController
// 隐藏状态栏
- (BOOL)prefersStatusBarHidden
{
  return YES;
}
- (void)viewDidLoad
{
  [super viewDidLoad];

  _titleBtn.backgroundColor = [UIColor clearColor];

  // 0 字典 ,记住所有实例化了 栏目的子控制器,避免每次都重新创建
  _columnViewControllers = [NSMutableDictionary dictionary];

  // 0,设置导航条bar的背景 为网 易 红
  //[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"bg.png"] forBarMetrics:UIBarMetricsDefault];
  // 状态条颜色 改成默认的样式
  //[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;

  // 1,添加左边控制器的view到左边的view里面
  _leftVC = [[LeftTableViewController alloc]init];
  // 关键代码 为了拿到左边控制器的某一行被点击时候,对应的栏目数据模型对象,主控制器成为了左边控制器的代理,遵守了它定好的协议,实现了协议中的方法,从而拿到左边控制器被点击行号对应的数据模型对象
  _leftVC.delegate = self;
  _leftVC.view.frame = self.leftView.bounds;

  [self.leftView addSubview:_leftVC.view];

  // 2,同理,添加右边控制器的view到右边的view里面
	_rightVC = [[RightViewController alloc]init];

  _rightVC.view.frame = self.rightView.bounds;

  [self.rightView addSubview:_rightVC.view];

  // 3,第一次加载时候,就就应该显示新闻 子栏目的控制器到导航控制器,再将导航控制器的view添加到 mainView里面
  [self firstLoading];

}

// 自定义方法,第一次加载时候,就就应该显示新闻 子栏目的控制器到导航控制器,再将导航控制器的view添加到 mainView里面
- (void)firstLoading
{
  Column * column = [Column columnNamed:@"新闻" imgName:@"news.png" className:@"NewsViewController"];

  // 仅需手动调用一个 LeftViewController的代理 方法,leftTableViewRowClicked,传递一个新闻 子栏目即可
  [self leftTableViewRowClicked:column];
}

// pan 拽 手势处理
- (IBAction)panGesture:(UIPanGestureRecognizer *)sender
{

  // 如果是刚按下的状态,则记住,mainView的起始x
  if (UIGestureRecognizerStateBegan == sender.state) {
    _startX = self.mainView.frame.origin.x;
  }

  // 平移拖动的距离
  CGPoint delta = [sender translationInView:_mainView];

  CGRect frame = self.mainView.frame;

  // 计算新的x值,并做健壮性判断
  kEndX = _startX + delta.x;

  // 1,限制最大拖动范围

  if (kEndX >= kLeftWidth) {
    kEndX = kLeftWidth;
  }
  if (kEndX <= - kRightWidth) {
    kEndX = - kRightWidth;
  }
  // 2,由于 左view和右view在重叠,所以要隐藏其中的一个
  if (kEndX > 0) {
    // NSLog(@"--调用频率相当高--");
    _rightView.hidden = YES;
    _leftView.hidden = NO;
  } else {
    _rightView.hidden = NO;
    _leftView.hidden = YES;
  }

  if (UIGestureRecognizerStateEnded == sender.state) {

    // 手势结束的时候,需进行robust判断

    // 2,分析end松手时候,的位置x,决定展开到什么程度
/*
    // 2.1 如果只向右拖了一点点,小于 1/2 的左view的宽度,则归0
    if (kEndX < 0.5*kLeftWidth && kEndX >= 0) {
      kEndX = 0;
    }else if (kEndX >= 0.5*kLeftWidth && kEndX <= kLeftWidth) {
      // 2.2 如果向右拖一大半了,大于 1/2 的左view的宽度,虽然还没到位,也可以认为是到位了
      kEndX = kLeftWidth;
    }else if (kEndX > - 0.5*kRightWidth && kEndX <= 0) {
      // 2.3 如果只向左拖了一点点,小于 1/2 的右view的宽度,则归0
      kEndX = 0;
    }else if (kEndX <= - 0.5*kRightWidth) {
      // 2.4 如果向左拖一大半了,大于 1/2 的右view的宽度,虽然还没到位,也可以认为是到位了
      kEndX = - kRightWidth;
    }
*/

    // 第2种判断方式
    // 起始为0,delta.x大于0 代表向右滑动
    if (_startX == 0 && delta.x >0) {
      kEndX = kLeftWidth;
    }else if (_startX == 0 && delta.x < 0){
      // 起始为0,delta.x小于0 代表向左滑动
      kEndX = - kRightWidth;
    }else if (_startX == kLeftWidth && delta.x < 0){
      // 起始为kLeftWidth,delta.x小于0 代表向左滑动
      kEndX =0;
    }else if (_startX == - kRightWidth && delta.x > 0){
      // 起始为- kRightWidth,delta.x大于0 代表向右滑动
      kEndX = 0;
    }

  }

  // 最后,才设置mainView的新的frame
  [UIView animateWithDuration:0.2 animations:^{
        self.mainView.frame=frame;
  }];

  // 最后,为mainView所在的图层 添加阴影效果
  [self addShadowFormainViewWithEndX:kEndX];

}

// 自定义方法,为mainView所在的图层 添加阴影效果 (调用频率相当高)
- (void)addShadowFormainViewWithEndX:(CGFloat)endX
{
  // 1,点击工程,加号,导入第3方框架 #import <QuartzCore/QuartzCore.h>

  // 2,拿到mainView所在的图层,设置阴影 参数

  // NSLog(@"调用频率很高---");
  _mainView.layer.shadowColor = [UIColor blackColor].CGColor;
  _mainView.layer.shadowOpacity = 0.5;
  if (endX >= 0) {
    _mainView.layer.shadowOffset = CGSizeMake(-5, 0);
  } else {
    _mainView.layer.shadowOffset = CGSizeMake(5, 0);
  }

}

// 单击按钮,也一样可以展开 左右侧边栏
- (IBAction)btnClick:(UIButton *)sender
{
  // 定义一个临时变量
  CGFloat startX = _mainView.frame.origin.x;

  // 先为mainView所在的图层 添加阴影效果
  [self addShadowFormainViewWithEndX:sender.tag == 1?1:-1];

  // 定义一个临时变量
  CGFloat tempEndX = 0;
  // 左边的按钮被单击
  if (1 == sender.tag) {
    // 隐藏右半边
    _leftView.hidden = NO;
    _rightView.hidden = YES;

    if (startX == 0) {
      tempEndX = kLeftWidth;
    }else if (startX == kLeftWidth){
      tempEndX = 0;
    }
  } else {
    // 单击右边按钮, 隐藏左半边
    _leftView.hidden = YES;
    _rightView.hidden = NO;
    if (startX == 0) {
      tempEndX = - kRightWidth;
    }else if (startX == - kRightWidth){
      tempEndX = 0;
    }
  }
  // 最后才设置mainView的x,调用抽取出来的公共代码,设置mainView的x,参数是endX
  [self setmainViewX:tempEndX];

}

// 抽取出来的公共代码,设置mainView的x,参数是endX
- (void)setmainViewX:(CGFloat)endX
{
  CGRect frame = self.mainView.frame;
  frame.origin.x = endX;
  [UIView animateWithDuration:0.2 animations:^{
    self.mainView.frame=frame;
  }];

}

// 最关键的方法,左边控制器的代理 方法,当前左边控制器中的某一行被点击的时候 会调用
- (void)leftTableViewRowClicked:(id)columnSelected
{
  Column *column = (Column *)columnSelected;
  // 1,关闭左边的控制=======================
  // 调用抽取出来的公共代码,设置mainView的x,参数是endX
  [self setmainViewX:0];

  // 2,更改标题按钮上面的文字
  _titleBtn.titleLabel.text = column.columnName;

  // 根据栏目数据模型中的类名,实例化对应栏目的控制器,并且将其设置为导航控制器的根控制器,最后将导航控制器的view添加到mainView中,目的是方便设置导航条,以及,各控制器的跳转

  // 2,从缓存字典中取,如果子控制器字典有曾经创建过的子控制器,直接取出来用
  UIViewController *columnVC = _columnViewControllers[column.columnClassName];
  // 如果子控制器字典中没有保存过该栏目的控制器,才要创建子控制器
  if (columnVC == nil) {
    Class c = NSClassFromString(column.columnClassName);
    columnVC = [[c alloc]init];
    // 并且一定要将其放到 子控制器字典里面,存起来
    [_columnViewControllers setObject:columnVC forKey:column.columnClassName];
  }

  // 4,移除contentView中的正在显示的旧的子view
  if (_contentView.subviews.count > 0) {
    UIView *oldView = [_contentView subviews][0];
    [oldView removeFromSuperview];
  }

  // 5,最后将子控制器的view添加到contentView中,显示
  columnVC.view.frame = _contentView.bounds;
  [self.contentView addSubview:columnVC.view];
  NSLog(@"%@",self.contentView);
  // 在添加到mainView之前 ,先得到mainView导航控制器的子控制器,并将其移除(如果有的话),然后才将新的栏目对应的子控制器添加到导航控制器容器中,注意,这儿可以用字典 记住 所有的已经实例化出来 的栏目子控制器,这样就避免每次都alloc创建新的栏目子控制器,而是只需要根据类名,从字典取出上一次实例化了的同一栏目的子控制器即可

}
@end

栏目数据模型Column.h

//
// Column.h
// 19_抽屉效果_仿网易
//
// Created by beyond on 14-8-1.
// Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <Foundation/Foundation.h>

// 数据模型 代表一个栏目
@interface Column : NSObject
// 栏目名称
@property (nonatomic,copy)NSString *columnName;
// 栏目图片名称
@property (nonatomic,copy)NSString *columnImgName;
// 栏目对应的控制器的类名
@property (nonatomic,copy)NSString *columnClassName;

// UI控件用weak,字符串用copy,其他对象用strong

// 提供一个类方法,即构造函数,返回封装好数据的对象(返回id亦可)
+ (Column *)columnNamed:(NSString *)columnName imgName:(NSString*)columnImgName className:(NSString *)columnClassName;
@end

栏目数据模型Column.m

//
// Column.m
// 19_抽屉效果_仿网易
//
// Created by beyond on 14-8-1.
// Copyright (c) 2014年 com.beyond. All rights reserved.
// 数据模型 代表一条栏目

#import "Column.h"

@implementation Column

// 返回一个包含了 栏目对应控制器名字的 对象实例
+ (Column *)columnNamed:(NSString *)columnName imgName:(NSString *)columnImgName className:(NSString *)columnClassName
{
  // 为了兼容子类 使用self
  Column *column = [[self alloc]init];
  column.columnName = columnName;
  column.columnImgName = columnImgName;
  column.columnClassName = columnClassName;
  return column;
}

@end

左边控制器定义好的协议LeftTableViewControllerDelegate.h

//
// LeftTableViewControllerDelegate.h
// 19_抽屉效果_仿网易
//
// Created by beyond on 14-8-1.
// Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Column.h"
// 左边控制器 定义的代理/协议 它通过调用自己的成员属性(即代理)的该方法,将数据传递出去(给它的代理去使用) (其实 是主控制器想要数据,所以主控制器在实例化左边控制器的时候,要设置左边控制器对应的代理 为 主控制器 自身)
@protocol LeftTableViewControllerDelegate <NSObject>

- (void)leftTableViewRowClicked:(Column *)columnSelected;
@end

LeftTableViewController.h

//
// LeftTableViewController.h
// 19_抽屉效果_仿网易
//
// Created by beyond on 14-8-1.
// Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <UIKit/UIKit.h>
// 对协议进行提前声明
@protocol LeftTableViewControllerDelegate;

@interface LeftTableViewController : UITableViewController
// 代理 用weak,防止循环问题,可以是任意类型,但必须遵守协议
@property (nonatomic,weak) id<LeftTableViewControllerDelegate> delegate;
@end

LeftTableViewController.m

////  LeftTableViewController.m//  19_抽屉效果_仿网易////  Created by beyond on 14-8-1.//  Copyright (c) 2014年 com.beyond. All rights reserved.//
#import "LeftTableViewController.h"#import "Column.h"#import "LeftTableViewControllerDelegate.h"@interface LeftTableViewController (){    // 栏目数组,保存的是左边栏目列表中的所有栏目对象    NSArray *_arr;}
@end
@implementation LeftTableViewController
- (void)viewDidLoad{    [super viewDidLoad];    // 新闻 栏目    Column *newsColumn = [Column columnNamed:@"新闻" imgName:@"news.png" className:@"NewsViewController"];    // 图片 栏目    Column *picColumn = [Column columnNamed:@"图片" imgName:@"pic.png" className:@"PicViewController"];    // 图片 栏目    Column *commentColumn = [Column columnNamed:@"跟帖" imgName:@"comment.png" className:@"CommentViewController"];    // 以后要添加栏目,只要改这里就可以了            // 将栏目对象,一次性全添加到不可变数组中    _arr = @[newsColumn,picColumn,commentColumn];    }- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    return _arr.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *cellID = @"leftVC";    // 下面这个dequeue只能用于storyboard或xib中    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];    //     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];        if (cell == nil) {        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];    }        // 设置独一无二的数据    Column *column = _arr[indexPath.row];    cell.textLabel.text = column.columnName;    cell.imageView.image = [UIImage imageNamed:column.columnImgName];    return cell;}
// 点击一行时,主控制中的主视图必须展示相应栏目的内容,因此,必须实例化对应点击的行的栏目控制器,并用添加到导航控制器,调用代理 的方法传递数据给代理 使用,此处的代理 其实就是 主控制器- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{    // 先取消默认的点击 高亮的颜色    [tableView deselectRowAtIndexPath:indexPath animated:YES];    // 取出对应行的数据模型(栏目)    Column *column = _arr[indexPath.row];        if ([self.delegate respondsToSelector:@selector(leftTableViewRowClicked:)]) {                // 传递数据给主控制器 BeyondViewController,通过代理        // 关键代码~        [self.delegate leftTableViewRowClicked:column];    }        }@end

RightViewController.xib

NewsViewController.xib

PicViewController.xib

CommentViewController.xib

时间: 2014-08-23

iOS毛玻璃效果的实现及图片模糊效果的三种方法

App设计时往往会用到一些模糊效果或者毛玻璃效果,iOS目前已提供一些模糊API可以让我们方便是使用. 话说苹果在iOS7.0之后,很多系统界面都使用了毛玻璃效果,增加了界面的美观性,比如下图的通知中心界面; 但是其iOS7.0的SDK并没有提供给开发者实现毛玻璃效果的API,所以很多人都是通过一些别人封装的框架来实现,后面我也会讲到一个; 其实在iOS7.0(包括)之前还是有系统的类可以实现毛玻璃效果的, 就是 UIToolbar这个类,并且使用相当简单,几行代码就可以搞定. 下面是代码实现:

iOS开发中使用UILabel设置字体的相关技巧小结

一.初始化 复制代码 代码如下: UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 120, 44)];      [self.view addSubview:myLabel]; 二.设置文字 1.设置默认文本 复制代码 代码如下: NSString *text = @"标签文本"; myLabel.text = text; 效果: 2.设置标签文本(此属性是iOS6.0之后才出现,如若不是必要,不

IOS获取各种文件目录路径的方法

iphone沙箱模型有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app 目录:这是应用程序的程序包目录,包

IOS开发代码分享之设置UISearchBar的背景颜色

今天用到UISearchBar,之前网上提供的方法已经不能有效的去除掉它的背景色了,修改背景色方法如下: mySearchBar.backgroundColor = RGBACOLOR(249,249,249,1);     mySearchBar.backgroundImage = [self imageWithColor:[UIColor clearColor] size:mySearchBar.bounds.size];   //取消searchbar背景色 - (UIImage *)im

IOS 中 new 和 alloc init 的对比

IOS 中 new 和 alloc init 的对比 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[className new], 还有去面试的时候,也很可能被问到这个问题. 2.那么,他们两者之间到底有什么区别呢 我们看源码: + new { id newObject = (*_alloc)((Class)self, 0); Class metaClass = self->

iOS开发中实现显示gif图片的方法

我们知道Gif是由一阵阵画面组成的,而且每一帧画面播放的时常可能会不相等,观察上面两个例子,发现他们都没有对Gif中每一帧的显示时常做处理,这样的结果就是整个Gif中每一帧画面都是以固定的速度向前播放,很显然这并不总会符合需求.   于是自己写一个解析Gif的工具类,解决每一帧画面并遵循每一帧所对应的显示时间进行播放.   程序的思路如下:   1.首先使用ImageIO库中的CGImageSource家在Gif文件.   2.通过CGImageSource获取到Gif文件中的总的帧数,以及每一

iOS开发中WebView的基本使用方法简介

1.使用UIWebView加载网页 运行XCode 4.3,新建一个Single View Application,命名为WebViewDemo. 2.加载WebView 在ViewController.h添加WebView成员变量和在ViewController.m添加实现 复制代码 代码如下: #import <UIKit/UIKit.h> @interface ViewController : UIViewController {     UIWebView *webView; } @e

iOS中使用schema协议调用APP和使用iframe打开APP的例子

在iOS中,需要调起一个app可以使用schema协议,这是iOS原生支持的,并且因为iOS系统中都不能使用自己的浏览器内核,所以所有的浏览器都支持,这跟android生态不一样,android是可以自己搞内核的,但是iOS不行. 在iOS中提供了两种在浏览器中打开APP的方法:Smart App Banner和schema协议. Smart App Banner 即通过一个meta 标签,在标签上带上app的信息,和打开后的行为,例如:app-id之类的,代码形如: 复制代码 代码如下: <m

iOS中使用URL Scheme进行App跳转的教程

URL Scheme的作用 我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的.但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的.我们可以通过系统的OpenURL来打开该app,并可以传递一些参数. 例如:你在Safari里输入www.alipay.com,就可以直接打开你的支付宝app,前提是你的手机装了支付宝.如果你没有装支付宝,应该显示的是支付宝下载界面,点击会跳到AppStore的支付宝下载

浅谈iOS中几个常用协议 NSCopying/NSMutableCopying

1.几点说明 说到NSCopying和NSMutableCopying协议,不得不说的就是copy和mutableCopy. 如果类想要支持copy操作,则必须实现NSCopying协议,也就是说实现copyWithZone方法; 如果类想要支持mutableCopy操作,则必须实现NSMutableCopying协议,也就是说实现mutableCopyWithZone方法; iOS系统中的一些类已经实现了NSCopying或者NSMutableCopying协议的方法,如果向未实现相应方法的系

iOS中在APP内加入AppStore评分功能的实现方法

iOS应用内部实现App Store评分功能,笔着整理总结有三种方式,各位可根据自己需求自己选择.先介绍下评分功能实现的三种方式. 1,通用方式通过App内部打开网页形式,跳转到AppStore编辑评论,可评分,可评论. 优点:方便,快捷,不受系统版本限制,目前最常用的方式. 缺点:内部网页形式加载缓慢,等待时间长,加载失败概率大. 2,iOS 6.0以后 在app内部加载AppStore 展示app信息 优点:展示速度比方法三块快 缺点:不能直接跳转到评论编辑页面,需要手动点击评论+编辑评论

iOS中的应用启动原理以及嵌套模型开发示例详解

程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示. (3)通过[UIApplicationsharedApplication]可以获得这个单例对象 (4) 一个iOS程序启动后创建的第一个对象就是UIAp

iOS中关于模块化开发解决方案(纯干货)

关于iOS模块化开发解决方案网上也有一些介绍,但真正落实在在具体的实例却很少看到,计划编写系统文章来介绍关于我对模块化解决方案的理解,里面会有包含到一些关于解耦.路由.封装.私有Pod管理等内容:并编写的一个实例项目放在git进行开源[jiaModuleDemo],里面现在已经放着一些封装的功能模块:会不断的进行更新,假如你感兴趣可以Star一下,项目也不断的更新完善优化:如果你有更好的方案或者说好的建议可以lssues,我会在短时间进行更新并修改相应的问题: 一:项目中存在的问题 1:当公司里

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的关键技术之一. Demo: @interface myPerson : NSObject { NSString*_name; int _age; int _height; int _weight; } @end @

iOS开发之用javascript调用oc方法而非url

先来看看如何在项目中的webview上面点击一个按钮,就能达到调用oc代码 上面的这个页面是webview里面嵌套的一个项目的网页,打印订单点击之后(点击事件是一个js方法),需要调用oc里面集成好的蓝牙打印机功能,来完成打印. 所以这里只能用js代码来直接调用oc代码. 1.首先创建一个iOS类,因为这里一般都需要安卓端做一套,iOS端做一套,所以一般这样命名以示区别 .h #import <Foundation/Foundation.h> #import <JavaScriptCor

详解ios中的SQL数据库文件加密 (使用sqlcipher)

今天本想写一片 GAE+goAgent+SwitchySharp 的指南的!但是突然翻出了前段时间写的关于iOS中的SQL数据库文件加密的代码,于是乎决定今天就先讲讲这个!- 那么goAgent将放在周末,后续的文章中除了文件加密,还有传输数据加密,感兴趣的童鞋 敬请留意. 言归正传,sql的文件加密,我们首先要用到一个库,它就是大名鼎鼎的Sqlcipher,  奉上连接:http://sqlcipher.NET,在ios里 我们需要看的文档是这一篇http://sqlcipher.Net/io

iOS中指纹识别常见问题汇总

最近公司的 app 要使用指纹支付了;总体来说还是蛮顺利的;但是中间有遇到一些坑;下面就对坑进行汇总; 一.基本知识 点开这个LocalAuthentication.framework,发现里面主要有这么几个东西 LocalAuthentication.framework - LAContext.h - LAError.h - LAPublicDefines.h - LocalAuthentication.h LocalAuthentication.h 这个没什么可讲的吧,代码就两行,一行导入L