这篇文章主要为大家详细介绍了ios仿微信相册界面翻转过渡动画效果,微信采用界面翻转的过渡动画跳转到评论界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
分享功能目前几乎已成为很多应用的标配了,其中微信,微博等应用的图片分享界面设计的很棒,不仅能够展示缩略图,还可以预览删除。最近我在做一款社交分享app,其中就要实现图文分享功能,于是试着自行实现仿微信分享风格的功能。
核心思想:
主要是使用UICollectionView来动态加载分享图片内容,配合预览页面,实现动态添加和预览删除图片效果。
实现效果:
核心代码如下:
分享界面:
//
//
PostTableViewController.h
//
九股
//
//
由…创造张昌伟26年一月15日。
//
版权2015年年9工作室。保留所有权利。
//
#导入
UIKit/UIKit.h
#导入
UMSocial.h '
#导入
YSYPreviewViewController.h '
@ interface postgableviewcontroller
:UITableViewControllerUITextViewDelegate、UICollectionViewDataSource、UICollectionViewDelegate、UIActionSheetDelegate、UIImagePickerControllerDelegate、UMSocialUIDelegate、UINavigationControllerDelegate
@属性(弱,
非原子)
IBOutlet UICollectionView
*照片集合视图
@属性(弱,
非原子)
IBOutlet UISwitch
*微博开关;
@属性(弱,
非原子)
IBOutlet UISwitch
*人人开关
-
(我行动)豆瓣切换:(id)发件人;
-
(I动作)人人网切换:(id)发件人;
-
(我行动)微博切换:(id)发件人;
(无效)
deleteSelectedImage:(NSInteger)
指数;
(无效)
deleteSelectedImageWithImage:(ui image *)image;
@end
实现文件
//
//
PostTableViewController.m
//
九股
//
//
由…创造张昌伟26年一月15日。
//
版权2015年年9工作室。保留所有权利。
//
#导入
PostTableViewController.h '
#导入
NineShareService.h '
静态NSMutableArray * currentImages
@ interface postgableviewcontroller
()
@属性(弱,
非原子)
IBOutlet UITextView
*共享内容;
-
(I操作)发布状态:(id)发件人;
-
(I操作)取消发布:(id)发件人;
-(无效)
负载状态
@属性(弱,
非原子)
IBOutlet UISwitch
*双重开关
@属性(弱,
非原子)
IBOutlet UITextView
*背景文本视图
@ property NSMutableArray * SNS array;
//@属性
NSMutableArray *照片;
@property NineShareService
*数据上下文;
@ property NSMutableDictionary * tempDict;
-(无效)
开放式摄像机
-(无效)
开放图书馆;
@end
@实现PostTableViewController
-
(void)viewDidLoad
{
【超级viewDidLoad】;
如果(当前图像
==零)
{
当前图像=[[NSMutableArray alloc]
init];
}
//
取消对下面一行的注释,以保留演示文稿之间的选择。
//
自我。clearsselectionviewwillappear=NO;
//
取消对以下行的注释,以在导航栏中显示此视图控制器的编辑按钮。
//
自我。导航项目。rightbarbuttonitem=self。editbuttonitem
_dataContext=[NineShareService
getInstance];
[自加载状态];
}
-(void)viewWillAppear:(BOOL)动画{
[_photosCollectionView
重新加载数据];
}
-
(void)didReceiveMemoryWarning
{
【超级didReceiveMemoryWarning】;
//
处置任何可以重新创建的资源。
}
-(无效)
loadSNSStatus{
_ SNS array=[NSMutableArray arraywithcontentsofile:[[ns bundle主捆绑包]
资源的路径:@ ' SNS '类型:@ ' plist ']];
if(_snsArray.count0)
{
[_微博开关
setOn:[_ SNS array[0]boolValue]animated:YES];
[_RenrenSwitch
setOn:[_ SNS array[1]boolValue]animated:YES];
[_DoubanSwitch
setOn:[_ SNS array[2]boolValue]animated:YES];
}
}
-(BOOL)textView:(UITextView
*)textView shouldChangeTextInRange:(ns range)range
替换文本:(ns字符串*)文本{
如果(![正文
isEqualToString:@''])
{
[_backgroundTextView
setHidden:是];
}
如果([文本
isEqualToString:@ ' ']范围。长度==1范围。location==0){
[_backgroundTextView
设置隐藏:否];
}
如果([文本
isEqualToString:@'\n'])
{
[文本视图
resignfirstpresponder];
返回否;
}
返回是
}
-(void)textViewDidBeginEditing:(UITextView
*)文本视图
{
CGRect
框架=文本视图.框架
(同Internationalorganizations)国际组织偏移
=框架。起源。y 32-(自己。查看。框架。尺寸。高度
- 216.0);//键盘高度216
NSTimeInterval动画持续时间
=0.30f
[UIView
开始动画:@ ' ResizeForKeyboard ' context:nil];
[UIView
setAnimationDuration:动画时长];
//将视图的Y坐标向上移动抵消个单位,以使下面腾出地方用于软键盘的显示
如果(偏移
0)
自我视图。框架
=CGRectMake(0.0f,-offset,self.view.frame.size.width,
自我。查看。框架。尺寸。身高);
[UIView
承诺];
}
-(void)textViewDidEndEditing:(UITextView
*)文本视图{
自我视图。框架
=CGRectMake(0,0,self.view.frame.size.width,
自我。查看。框架。尺寸。身高);
}
-(void)集合视图:(UICollectionView
*)集合视图didSelectItemAtIndexPath:(NSIndexPath *)索引路径{
if(索引路径。row==当前图像。计数)
{
UIActionSheet
* action=[[UIActionSheet alloc]init with title:@ '选取照片代理人:自行取消按钮标题:@ '取消破坏性按钮标题:无其他按钮标题:@ '从摄像头选取,
@'从图片库选择,nil];
[行动
在视图中显示:自己。查看];
}
其他
{
[YSYPreviewViewController
setprevieimage:当前图像[索引路径。row]];
[自助导航控制器
pushview控制器:[[UIStoryboard storyboardWithName:@ ' Main ' bundle:[ns bundle Main bundle]]
instantiateViewControllerWithIdentifier:@ '预览VC ']
动画:是];
}
}
-(n integer)集合视图:(UICollectionView
*)集合视图numberOfItemsInSection:(NSInteger)section {
return currentImages.count==0?1:当前图像。计数1;
}
-(UICollectionViewCell
*)集合视图:(UICollectionView *)集合视图cellForItemAtIndexPath:(NSIndexPath *)索引路径{
UICollectionViewCell
* cell=[集合视图dequereusablecellwithreuseidentifier:@ '集合单元'用于索引路径:索引路径];
UIImageView
* imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0,0,50,50)];
如果(当前图像。计数==0 | |索引路径。row==当前图像。计数)
{
imageView.image=[UIImage
图像名为:@ ' Add '];
}
否则{
而([单元格。内容视图。子视图
lastObject]!=零)
{
[(ui视图*)[单元格。内容视图。子视图
最后一个对象]removeFromSuperview];
}
imageview。image=当前图像[索引路径。row];
}
imageview。content mode=uiviewcontentmodescalaspectfill;
[cell.contentView
添加子视图:imageView];
返回单元格;
}
-(void)saveSNSToFile{
ns string * dest path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
是)
最后一个对象];
如果(![[NSFileManager默认管理器]
filexistsatpath:destPath]){
ns字符串*路径=[[ns包主包]
资源的路径:@ ' SNS '类型:@ ' plist '];
[[NSFileManager默认管理器]
copyItemAtPath:路径到路径:目标路径错误:无];
}
if(_snsArray==nil)
_ SNS array=[[NSMutableArray alloc]
init];
[_snsArray
删除所有对象];
[_snsArray
addObject:_WeiboSwitch.isOn?@ '是':@ '否'];
[_snsArray
addObject:_RenrenSwitch.isOn?@ '是':@ '否'];
[_snsArray
addObject:_DoubanSwitch.isOn?@ '是':@ '否'];
if(_snsArray.count0)
{
[_snsArray
自动写入文件:目标路径:是];
}
}
-
(I操作)发布状态:(id)发件人
{
if(_WeiboSwitch.isOn)
[[UMSocialDataService
defaultDataService]postSNSWithTypes:@[UMShareToSina]content:_ share content。文字。长度0?_shareContent.text: @'9Share
对于ios测试消息image:currentImages.count==0?nil:currentImages[0]
位置:空统一资源定位器资源:空已呈现控制器:自身completion:^(umsocialresponseentity
*响应){
if (response.responseCode
==umsresponsecodescess){
NSLog(@ '分享成功!');
如果(!(_人人开关。ison | | _ doubanswitch。ison))
{
[self saveSNSToFile];
[self dismissViewControllerAnimated:是完成:无];
}
}
}];
if(_RenrenSwitch.isOn)
[[UMSocialDataService
defaultDataService]postSNSWithTypes:@[UMShareToRenren]content:_ share content。文字。长度0?_shareContent.text: @'9Share
对于ios测试消息image:currentImages.count==0?nil:currentImages[0]
位置:空统一资源定位器资源:空已呈现控制器:自身completion:^(umsocialresponseentity
*响应){
if (response.responseCode
==umsresponsecodescess){
NSLog(@ '分享成功!');
如果(!_DoubanSwitch.isOn)
{
[self saveSNSToFile];
[self dismissViewControllerAnimated:是完成:无];
}
}
}];
if(_DoubanSwitch.isOn)
[[UMSocialDataService
defaultDataService]postSNSWithTypes:@[UMShareToDouban]content:_ share content。文字。长度0?_shareContent.text: @'9Share
对于ios测试消息image:currentImages.count==0?nil:currentImages[0]
位置:空统一资源定位器资源:空已呈现控制器:自身completion:^(umsocialresponseentity
*响应){
if (response.responseCode
==umsresponsecodescess){
NSLog(@ '分享成功!');
[self saveSNSToFile];
[self dismissViewControllerAnimated:是完成:无];
}
}];
}
-(void)图像拾取器控制器:(UIImagePickerController
*)选取器已完成pickingdediwithinfo:(ns字典*)信息{
[提货人
dismissViewControllerAnimated:是完成:无];
UIImage
* image=[info objectForKey:UIImagePickerControllerOriginalImage];
ns data * tempData=UIImageJPEGRepresentation(image,
0.5f);
image=[UIImage
imageWithData:tempData];
如果(当前图像
==零)
{
当前图像=[[NSMutableArray alloc]
init];
}
[当前图像
添加对象:图像];
[_photosCollectionView
重新加载数据];
//
[自我保存图像:名称为@ ' ' '的图像]
}
-(void)imagepickercontrollerdiccancel:(UIImagePickerController
*)选取器{
[提货人
dismissViewControllerAnimated:是完成:无];
}
-
(IBAction)取消发布:(id)发件人
{
[self dismissViewControllerAnimated:是完成:无];
}
-(void)动作表:(UIActionSheet
*)操作表clickedButtonAtIndex:(n整数)按钮索引{
开关(按钮索引)
{
案例0:
【自开相机】;
打破;
案例1:
[自我开放库];
打破;
默认值:
打破;
}
}
-(void)openCamera{
//UIImagePickerControllerSourceType
* type=UIImagePickerControllerSourceTypeCamera;
if([UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
UIImagePickerController
* picker=[[UIImagePickerController alloc]init];
picker.delegate=自我
提货人。source type=UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing=是
[自我演示视图控制器:选取器
动画:是完成:无];
}
}
-(无效)开放库{
if([UIImagePickerController
isSourceTypeAvailable:uiimagepickercontrollersourcetyphotolibrary])
{
UIImagePickerController
* picker=[[UIImagePickerController alloc]init];
picker.delegate=自我
提货人。source type=uiimagepickercontrollersourcetyphotolibrary;
picker.allowsEditing=是
[自我演示视图控制器:选取器
动画:是完成:无];
}
}
-(无效)
保存图像:(ui image *)带有名称的图像:(ns string *)名称
{
ns data * imageData=UIImageJPEGRepresentation(image,
0.5);
ns string * path=[n临时目录()
stringByAppendingPathComponent:name];
[图像数据
自动写入文件:路径:是];
}
-
(我行动)豆瓣切换:(id)发件人
{
if(_DoubanSwitch.isOn){
如果(![UMSocialAccountManager
isOauthAndTokenNotExpired:UMShareToDouban])
{
//进入授权页面
[UMSocialSnsPlatformManager
getSocialPlatformWithName:UMShareToDouban】。log in click handler(self,[UMSocialControllerService
defaultcontrollerservice],yes,^(umsocialresponseentity
*响应){
if (response.responseCode
==umsresponsecodescess){
//获取微博用户名、uid、令牌等
UMSocialAccountEntity
* SNS count=[[UMSocialAccountManager socialaccoundictionary]valueForKey:UMShareToDouban];
NSLog(@ '用户名
是%@,uid是%@,令牌是“%@”、snsAccount.userName、snsAccount.usid、SNS count。访问令牌);
//进入你的分享内容编辑页面
UMSocialAccountEntity
* doubanAccount=[[UMSocialAccountEntity alloc]initWithPlatformName:UMShareToDouban];
doubanAccount.usid
=snsAccount.usid
doubanAccount.accessToken
=SNS计数。访问令牌;
//
weiboAccount.openId=@ '腾讯微博openId ';//腾讯微博账户必需设置openId
//同步用户信息
[UMSocialAccountManager
postsnsaccount:doubanaccount completion:^(umsocialresponseentity * response){
if (response.responseCode
==umsresponsecodescess){
//在本地缓存设置得到的账户信息
[UMSocialAccountManager
setSnsAccount:doubanAccount];
//进入你自定义的分享内容编辑页面或者使用我们的内容编辑页面
}}];
}
否则{
[_DoubanSwitch
西顿:无动画:有];
}
});
}
}
}
-
(IBAction)人人切换:(id)发件人
{
if(_DoubanSwitch.isOn)
{
如果(![UMSocialAccountManager
isOauthAndTokenNotExpired:UMShareToRenren])
{
//进入授权页面
[UMSocialSnsPlatformManager
getSocialPlatformWithName:UMShareToRenren 】. log in click handler(self,[UMSocialControllerService
defaultcontrollerservice],yes,^(umsocialresponseentity
*响应){
if (response.responseCode
==umsresponsecodescess){
//获取微博用户名、uid、令牌等
UMSocialAccountEntity
* SNS count=[[UMSocialAccountManager socialaccoundictionary]valueForKey:UMShareToRenren];
NSLog(@ '用户名
是%@,uid是%@,令牌是“%@”、snsAccount.userName、snsAccount.usid、SNS count。访问令牌);
//进入你的分享内容编辑页面
UMSocialAccountEntity
* renrenAccount=[[UMSocialAccountEntity alloc]initWithPlatformName:UMShareToRenren];
renrenAccount.usid
=snsAccount.usid
renrenAccount.accessToken
=SNS计数。访问令牌;
//
weiboAccount.openId=@ '腾讯微博openId ';//腾讯微博账户必需设置openId
//同步用户信息
[UMSocialAccountManager
postsnsaccount:renrenaccount completion:^(umsocialresponseentity * response){
if (response.responseCode
==umsresponsecodescess){
//在本地缓存设置得到的账户信息
[UMSocialAccountManager
setSnsAccount:人人账户];
//进入你自定义的分享内容编辑页面或者使用我们的内容编辑页面
}}];
}
否则{
[_RenrenSwitch
西顿:无动画:有];
}
});
}
}
}
-
(IBAction)微博切换:(id)发件人
{
if(_WeiboSwitch.isOn)
{
如果(![UMSocialAccountManager
isOauthAndTokenNotExpired:UMShareToSina])
{
[UMSocialSnsPlatformManager
getSocialPlatformWithName:UMShareToSina】。log in click handler(self,[UMSocialControllerService
defaultcontrollerservice],yes,^(umsocialresponseentity
*响应){
如果(回应。响应代码==umsresponsecodescess){
UMSocialAccountEntity
* SNS count=[[UMSocialAccountManager socialaccoundictionary]valueForKey:UMShareToSina];
UMSocialAccountEntity
*新浪账号=[[UMSocialAccountEntity alloc]initWithPlatformName:UMShareToSina];
//缓存到本地
sinaAccount.usid
=snsAccount.usid
新浪账户
=SNS计数。访问令牌;
//
weiboAccount.openId=@ '腾讯微博openId ';//腾讯微博账户必需设置openId
//同步用户信息
[UMSocialAccountManager
帖子SNS账号:新浪账号completion:^(umsocialresponseentity *响应){
if (response.responseCode
==umsresponsecodescess){
//在本地缓存设置得到的账户信息
[UMSocialAccountManager
setSnsAccount:新浪账号];
//进入你自定义的分享内容编辑页面或者使用我们的内容编辑页面
}}];
}
其他
{
[_微博开关
西顿:无动画:有];
}
});
}
}
}
(void)deleteSelectedImage:(NSInteger)索引
{
if(currentImages!=零)
[当前图像
removeObjectAtIndex:index];
}
(void)deleteSelectedImageWithImage:(ui图像
*)图像{
if(currentImages!=零)
[当前图像
移除对象:图像];
}
@end
预览界面:
//
//YSYPreviewViewController.h
//九分之一
//
//15/2/1由张昌伟创作。
//版权所有2015年年9工作室。保留所有权利。
//
#导入UIKit/UIKit.h
# import ' postgableviewcontroller。' h '
@ interface YSYPreviewViewController:uiviewcontrolleruiactionsheetdelegate
(void)setprevieimage:(ui image *)image;
@end
//
//YSYPreviewViewController.m
//九分之一
//
//15/2/1由张昌伟创作。
//版权所有2015年年9工作室。保留所有权利。
//
# import ' ysypreviewviewcontroller。' h '
静态UIImage * currentImage
@ interface YSYPreviewViewController()
-(I操作)deleteSelectedImage:(id)发件人;
@property(弱,非原子)IBOutlet ui imageview *预览图片视图;
@end
@ implementation YSYPreviewViewController
- (void)viewDidLoad {
【超级viewDidLoad】;
//在加载视图后进行任何附加设置。
_ previewimageview。image=当前图像;
}
-(void)didReceiveMemoryWarning {
【超级didReceiveMemoryWarning】;
//释放任何可以重新创建的资源。
}
/*
#杂注标记-导航
//在基于故事板的应用程序中,您通常会希望在导航之前做一些准备
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
//使用[后续目的地视图控制器]获取新的视图控制器。
//将选定的对象传递给新的视图控制器。
}
*/
-(I操作)deleteSelectedImage:(id)发件人{
UIActionSheet * action=[[UIActionSheet alloc]init with title:@ '要删除这张照片吗?'代理人:自行取消按钮标题:@ '取消破坏性按钮标题:@ '删除otherButtonTitles:nil];
[操作显示视图:自我。查看];
}
-(void)动作表:(UIActionSheet *)点击的动作表按钮索引:(n整数)按钮索引{
if(按钮索引==动作表。取消按钮索引)
{
返回;
}
其他
{
[postgableviewcontroller deleteSelectedImageWithImage:当前图像];
【自我。导航控制器popToRootViewControllerAnimated:YES];
}
}
(void)setprevieimage:(ui image *)image {
currentImage=图像
}
@end
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。