IOS 开发之操作图库自定义控制器

IOS 开发之操作图库自定义控制器

步骤如下:

新建此类的代理属性必须遵守的协议:

新建PhotoButtonDelegate.h如下:

//
// PhotoButtonDelegate.h
// 作业整理
//
// Created by apple on 15/9/16.
// Copyright (c) 2015年 LiuXun. All rights reserved.
// 

#import <Foundation/Foundation.h>
@class ImageAndPhotos;
@protocol PhotoButtonDelegate <NSObject> 

-(void) setPhotoButton:(ImageAndPhotos *) imgAndP;
@end

新建此类如下:

编辑ImageAndPhotos.h如下:

//
// ImageAndPhotos.h
// 作业整理
//
// Created by apple on 15/9/16.
// Copyright (c) 2015年 LiuXun. All rights reserved.
// 

#import <Foundation/Foundation.h>
#import "PhotoButtonDelegate.h"
@class UIBaseScrollView;
@interface ImageAndPhotos : NSObject <UIAlertViewDelegate,UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate> 

@property (nonatomic, strong) UIViewController *controller;
@property (nonatomic, strong) UIImage *img;
@property (nonatomic, strong) UIButton *btn;
@property (nonatomic, weak) id<PhotoButtonDelegate> delegate; 

-(id)initWithControler:(UIViewController *) crtler AndButton:(UIButton *) button;
@end

编辑ImageAndPhotos.m如下:

//
// ImageAndPhotos.m
// 作业整理
//
// Created by apple on 15/9/16.
// Copyright (c) 2015年 LiuXun. All rights reserved.
// 

#import "ImageAndPhotos.h" 

@implementation ImageAndPhotos 

-(id)initWithControler:(UIViewController *) crtler AndButton:(UIButton *) button
{
  if (self = [super init]) {
    self.controller = crtler;
    self.btn = button;
    [self CameraEvent];
  }
  return self;
} 

-(void)CameraEvent
{
  [self.btn addTarget:self action:@selector(showActionSheet) forControlEvents:UIControlEventTouchUpInside];
} 

-(void) showActionSheet
{
  UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"我的相册", nil nil];
  [actionSheet showInView:self.controller.view];
 } 

// 实现UIActionSheetDelegate协议中监听按钮的方法
-(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
  if (buttonIndex == 0) {
    [self addCamera];
  }
  else if(buttonIndex == 1)
  {
    [self addPhoto];
  } 

} 

-(void)addCamera
{
  // 判断是否可以打开一个相机
  if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
    // 创建一个调出拍照的控制器
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    // 摄像头
    NSLog(@"++++addCamera++++");
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    [self.controller presentViewController:picker animated:YES completion:^{ 

    }];
  }
  else
  {
    [self showAlertView];
  }
}
-(void) addPhoto
{   // 相册可以用模拟器打开,但是相机不可以用模拟器打开
  if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 

    picker.delegate = self;
    picker.allowsEditing = YES; // 是否可以编辑 

    // 打开相册选择相片
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; //表示管理图库
    [self.controller presentViewController:picker animated:YES completion:nil]; 

  }
  else
  {
    [self showAlertView];
  } 

} 

-(void)showAlertView
{
  UIAlertView *alert =[[UIAlertView alloc] initWithTitle:@"提示" message:@"你没有摄像头" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil nil];
  [alert show];
} 

// 代理协议中的方法
// 拍摄完成后,其实是选中图片后的方法要执行的方法,如果是照相的话则选中拍照后的相片
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
  // 得到图片
  self.img = [info objectForKey:UIImagePickerControllerEditedImage];
  // 图片存入图库
  if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
    UIImageWriteToSavedPhotosAlbum(self.img, nil, nil, nil); // 如果是相机
  } 

  [self.controller dismissViewControllerAnimated:YES completion:^{
    if ([self.delegate respondsToSelector:@selector(setPhotoButton:)]) {
      [self.delegate setPhotoButton:self];
    }
  }]; 

} 

//选中图片点击cancel按钮后执行的方法
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{ 

  [self.controller dismissViewControllerAnimated:YES completion:nil];
} 

@end

此类新建完成,在自定义控件中的应用如下:(此自定义控件是一个上传图片的scrollVIew)

新建自定义控件类编辑UIBaseScrollView.h如下

//
// UIBaseScrollView.h
// 作业整理
//
// Created by apple on 15/9/16.
// Copyright (c) 2015年 LiuXun. All rights reserved.
// 

#import "UIBaseVIew.h"
#import "ImageAndPhotos.h" 

@interface UIBaseScrollView : UIBaseVIew<PhotoButtonDelegate> 

@property (nonatomic, strong) NSMutableArray *arrayImgs;
@property (nonatomic, strong) UIScrollView *scroll;
@property (nonatomic, strong) ImageAndPhotos *imgChange;
@property (nonatomic, strong) UIButton *btnImg;
@property (nonatomic, strong) UIImageView *imgV;
-(id)initWithFrame:(CGRect)frame CurrenContr:(UIViewController *) crtl; 

@end
编辑定义控件的.m文件如下:

[objc] view plain copy
//
// UIBaseScrollView.m
// 作业整理
//
// Created by apple on 15/9/16.
// Copyright (c) 2015年 LiuXun. All rights reserved.
// 

#import "UIBaseScrollView.h" 

@implementation UIBaseScrollView 

-(id)initWithFrame:(CGRect)frame CurrenContr:(UIViewController *) crtl
{
  if (self = [super initWithFrame:frame]) {
    self.scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 

    self.btnImg = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, frame.size.height-20, frame.size.height-20)];
    [self.btnImg setImage:[UIImage imageNamed:@"tizhong_photo_increase_bj"] forState:UIControlStateNormal]; 

    self.imgChange = [[ImageAndPhotos alloc] initWithControler:crtl AndButton:self.btnImg];
    self.scroll.showsHorizontalScrollIndicator = YES;
    self.imgChange.delegate = self;
    [self.scroll addSubview:self.btnImg];
    [self addSubview:self.scroll];
  }
  return self;
} 

-(void)setPhotoButton:(ImageAndPhotos *)imgAndP
{
  NSLog(@"%@&&&&&&&&&",self.imgChange.img);
  if (imgAndP.img) {
    self.imgV =[[UIImageView alloc] initWithFrame: self.btnImg.frame ];
    self.imgV.image = imgAndP.img;
    self.imgV.backgroundColor = [UIColor yellowColor];
    [self.scroll addSubview:self.imgV];
    self.btnImg.frame = CGRectMake(CGRectGetMaxX(self.imgV.frame)+10, self.imgV.frame.origin.y, self.imgV.frame.size.width, self.imgV.frame.size.height);
    self.scroll.contentSize = CGSizeMake(CGRectGetMaxX(imgAndP.btn.frame)+10, 0);
    if (CGRectGetMaxX(self.btnImg.frame)>self.scroll.frame.size.width) {
      self.scroll.contentOffset = CGPointMake(self.btnImg.frame.origin.x-10, 0);
    }
  } 

} 

@end

在控制器中使用此自定义控件如下:

UIBaseScrollView *det5 = [[UIBaseScrollView alloc] initWithFrame:CGRectMake
(20, CGRectGetMaxY(det4.frame)+20, WIDTH-40, 80) CurrenContr:self]; 

运行结果如下:

在控制器中直接使用此相册类也与此类似,不同之处就是让所在控制器遵守类属性的协议,然后实现即可,在此不再奥数。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • iOS适配https证书问题(AFNetworking3.0为例)

    众所周知,苹果有言,从2017年开始,将屏蔽http的资源,强推https 楼主正好近日将http转为https,给还没动手的朋友分享一二 1.准备证书 首先找后台要一个证书(SSL证书,一般你跟后台说要弄https,然后让他给你个证书,他就知道了),我们需要的是.cer的证书.但是后台可能给我们的是.crt的证书.我们需要转换一下:打开终端 -> cd到.crt证书路径 -> 输入openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der,证书就

  • IOS 使用Block二次封装AFNetworking 3.0详解

    IOS 使用Block二次封装AFNetworking 3.0详解 现在我们网络请求大都用第三方工具-–AFNetworking: 其中,AFNetworking 3.0 是对 NSURLSession 进行的封装,简化了很多步骤,但是在现实开发中,我们可以将AFNetworking再次封装到一个类中,这样通过传去URL和Parameters 就可以进行网络请求. 具体实现步骤: 前期准备:导入AFNetworking第三方框架 1.新建一个工具类,继承自NSObject: 2.在.h 中宏定义

  • iOS实现录音转码MP3及转码BASE64上传示例

    iOS 录音转码MP3及转码BASE64上传 一,开始录音 NSLog(@"开始录音"); [self startRecord]; - (void)startRecord { //删除上次生成的文件,保留最新文件 NSFileManager *fileManager = [NSFileManager defaultManager]; if ([NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3&q

  • ios常见加密解密方法(RSA、DES 、AES、MD5)

    最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,服务器也会返回数据,服务器是用Java开发的,客户端要同时支持多平台(Android.iOS),在处理iOS的数据加密的时候遇到了一些问题.起初采取的方案是DES加密,老大说DES加密是对称的,网络抓包加上反编译可能会被破解,故采取RSA方式加密.RSA加密时需要公钥和私钥,客户端保存公钥加密数据,服务器保存私钥解密数据.(iOS端公钥加密私钥解密.java端公钥加密私钥解密,java端私钥加密公钥解密都容易做到,iOS不

  • iOS 使用 socket 实现即时通信示例(非第三方库)

    其实写这个socket一开始我是拒绝的. 因为大家学C 语言和linux基础时肯定都有接触,客户端和服务端的通信也都了解过,加上现在很多开放的第三方库都不需要我们来操作底层的通信. 但是!还是想写.底层的东西最好了解下. 效果 由于5M的上传限制GIF可能看不清 我再截两张图吧 服务器 客户端A 客户端B 模型图 分析 由上图可以了解到服务器和客户端需要做哪些工作 服务器 抽象一点分为: 1.创建线程等待接收客户端的连接 2.接收并解析客户端发来的消息 3.给客户端发送消息 具体一点: 1.创建

  • iOS利用AFNetworking实现文件上传的示例代码

    0.导入框架准备工作 1. 将框架程序拖拽进项目 2.  添加iOS框架引用 –SystemConfiguration.framework –MobileCoreServices.framework 3.  引入 #import "AFNetworking.h" 4. 修改xxx-Prefix.pch文件 #import <MobileCoreServices/MobileCoreServices.h> #import <SystemConfiguration/Sys

  • IOS 开发状态栏隐藏的实现办法

    IOS 开发状态栏隐藏的实现办法 解决方法:  IOS7以下版本隐藏UIStatusBar的方法: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application setStatusBarHidden:YES]; return YES; } 升级到iOS7后的方法: 在基类中重载UIViewController.h

  • iOS开发-调用系统相机和相册获取照片示例

    前言:相信大家都知道大部分的app都是有我的模块的,而在我的模块基本都有用户的头像等信息,并且是可以更改头像的.那么今天小编给大家简单介绍一下iOS开发中如何调用系统相机拍照或者相册获取照片.要获取系统相机或者相册,我们需要使用到 UIImagePickerController 这个类.下面我们来看一下如何实现: 首先,需要遵循 UIImagePickerController 代理的两个协议: <UIImagePickerControllerDelegate, UINavigationContr

  • IOS 开发之操作图库自定义控制器

    IOS 开发之操作图库自定义控制器 步骤如下: 新建此类的代理属性必须遵守的协议: 新建PhotoButtonDelegate.h如下: // // PhotoButtonDelegate.h // 作业整理 // // Created by apple on 15/9/16. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import <Foundation/Foundation.h> @class ImageAndPhoto

  • IOS开发自定义view方法规范示例

    目录 前言 一.关于自定义View的初始化方法 二.关于addSubview 三.关于layoutSubviews 四.关于frame与bounds 总结 前言 对于接触业务开发的童鞋,自定义View的开发是进行最频繁的工作了.但发现一些童鞋还是没有以一个好的规范甚至以一种错误的方式来搭建UI控件.由此,本文将以以下目录来进行讲叙,详细描述关于自定义View的一些书写注意事项. 关于自定义View的初始化方法 关于addSubview 关于layoutSubviews 关于frame与bound

  • iOS开发之自定义UITextField的方法

    UITextField是IOS开发中用户交互中重要的一个控件,常被用来做账号密码框,输入信息框等. 观察效果图 UITextField有以下几种特点: 1.默认占位文字是灰色的 2.当光标点上去时,占位文字变为白色 3.光标是白色的 接下来我们通过不同的方法来解决问题 一.将xib中的UITextField与代码关联 通过NSAttributeString方法来更改占位文字的属性 (void)viewDidLoad { [super viewDidLoad]; // Do any additio

  • iOS开发支付宝支付成功返回字符串的处理操作

    { memo=""; result="partner=\"311811\"&seller_id=\"nse@gmail.com\"&out_trade_no=\"S005372\"&subject=\"\U522b\U5885\U8ba2\U5355\"&body=\"\U5885\"&total_fee=\"0.1\"

  • IOS 开发自定义条形ProgressView的实例

    IOS 自定义进度条 ProgressView,好的进度条,让人赏心悦目,在等待的时候不是那么烦躁,也算是增加用户体验吧! 进度条在iOS开发中很常见的,我在项目开发中也写过好多进度条,有好多种类的,条形,圆形等,今天给大家总结一种条形的开发进度条. 简单思路: 1.自定义进度条先继承UIView 建立一个CustomBarProgressView  2.在.H文件中外漏的方法<开始的方法><初始化的方法>  3.在.M文件中 利用定时器改变位置 实现进度条 #效果图 #部分代码

  • iOS开发之自定义图片拉伸功能

    需求 为了减小app体积,同时为了适配不同尺寸屏幕或不同应用场景,很多图片素材都是标准通用的,比如IM消息气泡.按钮阴影效果等,但直接使用这些素材会产生一些问题,假如我们需要实现以下效果,即使用图片为账号密码输入框添加阴影效果: 图片素材: 直接使用图片实现的效果与需求效果对比: 经过自定义拉伸调整过后,最终效果: 实现 将storyboard中的控件关联到代码文件中,accountTextBgImageView 为textFiled 下的背景图片视图,实现代码如下: UIImage *text

  • IOS 开发之自定义按钮实现文字图片位置随意定制

    IOS 开发之自定义按钮实现文字图片位置随意定制 可能有些看到这篇文章的朋友会觉得很不屑:"按钮谁不会自定义?还需要看你的?" 也确实,按钮是我们项目中最常见的控件之一,天天在使用.对于不同类型的按钮,我们是否有更加简便的方法来实现需求是我们需要做的.这里我提出自己的两种方法,您可以对你自己平时自定义按钮的方法做一下对比,看看哪种方法更加简单. 多说一句,千万不要觉得知识简单,觉得自己会了,没必要学习.'往往简单的东西存在大智慧'(这个比给满分),知识都是慢慢积累出来的. 按钮是应用中

  • IOS开发OC代码中创建Swift编写的视图控制器

    IOS开发OC代码中创建Swift编写的视图控制器 背景 近日在和一群朋友做项目,我和另一位同学负责iOS客户端,我是一直使用OC的,而他只会Swift,因此在我们分工协作之后,就需要把代码合在一起,这就牵扯到如何在TabbarController中添加一个swift创建的子控制器的问题. 解决 首先在一个OC项目中新建一个Swift类,继承自UITableViewController,并且修改其view背景色,方便后续测试. import UIKit class ESSwiftTableVie

  • iOS如何自定义控制器转场动画push详解

    前言 最近有些空闲时间,整理了下最近做的项目,本文主要介绍了关于iOS自定义控制器转场动画push的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 效果图: iOS7 开始苹果推出了自定义转场的 API .从此,任何可以用 CoreAnimation 实现的动画,都可以出现在两个 ViewController 的切换之间.并且实现方式高度解耦,这也意味着在保证代码干净的同时想要替换其他动画方案时只需简单改一个类名就可以了,真正体会了一把高颜值代码带来的愉悦感. 其实网

  • iOS开发系列--地图与定位源代码详解

    概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

随机推荐