iOS开发之---ECSlidingViewController

ECSlidingViewController这个也是一个挺著名的托管在Github上的开源项目。目前这个项目的主要灵感还是来来源于Path2.0和Facebook在iPhone上的应用。

Github上Project的URL是:https://github.com/edgecase/ECSlidingViewController

源码的下载地址:https://github.com/edgecase/ECSlidingViewController/zipball/master

OK,Facebook国内被墙,咱就下个Path用用,这个App还是蛮酷的。也是一个社交类的应用,现在社交真是泛滥,各种圈子,找朋友一窝而上,各种app都开始有圈子找朋友的需求。从QQ火爆的聊天,到现在的潜水不语,强关系的应用,有时候也不简单就一定会有很长的生命周期,有时候,距离产生美么。说了很多废话,下面先简单介绍一下ECSlidingViewController。

简而言之,ECSlidingViewController是一个iOS中一个ViewController的容器,这个将其中的子ViewController分成了二个层。二层view controller滑动,上面的不完全滑出,显示出后面的view controller。
一些feature(从github上翻译过来,可能存在不准确的地方):
1.任何一个UIView上的横向滑动的手势都能移动Top view,这个有点像navigation bar或者就是一个top view。
2.可配置的停留位置,也就是说,top view还存留在可视界面的宽度是可以定制的。当然这个,并且是可以根据你旋转情况自动调整的。
3.Top view下面的view的大小和layout应该并不是严格要求的。
4.子View可以随时灵活变化。
5.这个容器的子viewcontroller可以是UIViewController的子类,UINavigationController这样的都可以被承载在这个容器中。
当然使用这个控件也是有要求的:iOS5和ARC。

源码下载下来的是一个使用ECSlidingController的Demo程序,其实你要用这个框架就4个文件:ECSlidingViewController.h/m,UIImage+ImageWithUIView.h/m。

简单介绍一下这四个文件:

1.ECSlidingViewController这个二个文件中,最主要的就是我们上面说的那个ViewController容器类,这二个文件中,还有一个对UIViewController的Extension,名为:SlidingViewExtension,还提供了一个instance method,叫:SlidingViewExtension。

2.UIImage+ImageWithUIView.h/m这二个文件,就简单一些了,他们就是一个对于UIView的扩展,提供了一个叫:ImageWithUIView的extension,这个扩展里面有一个方法,是将UIView转化成UIImage,其实简单来说,就是提供了一个ScreenShot的方法。头文件中的函数声明为:

+ (UIImage *)imageWithUIView:(UIView *)view;
ECSlidingViewController这个类中有很多属性,但是无非都是标识,Controller容器里面Controller的ECLeft或者ECRight的层次顺序。方法也都是类似的,我们抽取其中一个函数进行一下说明:
- (void)anchorTopViewTo:(ECSide)side animations:(void (^)())animations onComplete:(void (^)())complete
这个函数其实就是这个框架的,滑动动画的核心函数。可以看到这个函数有三个参数,第一个标识动画移动的方向,第二个(animation)和第三个(onComplete),这个二个参数可以为空的。可能看到这个函数的参数会觉得很奇怪,可能这个语法平时用的不多,animations和complete都是一个叫做Block Object的参数。也就是说,这个函数的位置可以填写一个函数实现,其实某种程度上有些像是C里面的函数指针。Block Object介绍的URL: https://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/Block.html下面是这个函数的全部实现:
- (void)anchorTopViewTo:(ECSide)side animations:(void (^)())animations onComplete:(void (^)())complete
{
  CGFloat newCenter = self.topView.center.x;
  
  if (side == ECLeft) {
    newCenter = self.anchorLeftTopViewCenter;
  } else if (side == ECRight) {
    newCenter = self.anchorRightTopViewCenter;
  }
  
  [self topViewHorizontalCenterWillChange:newCenter];
  
  [UIView animateWithDuration:0.25f animations:^{
    if (animations) {
      animations();
    }
    [self updateTopViewHorizontalCenter:newCenter];
  } completion:^(BOOL finished){
    if (_resetStrategy & ECPanning) {
      self.panGesture.enabled = YES;
    } else {
      self.panGesture.enabled = NO;
    }
    if (complete) {
      complete();
    }
    _topViewIsOffScreen = NO;
    [self addTopViewSnapshot];
    dispatch_async(dispatch_get_main_queue(), ^{
      NSString *key = (side == ECLeft) ? ECSlidingViewTopDidAnchorLeft : ECSlidingViewTopDidAnchorRight;
      [[NSNotificationCenter defaultCenter] postNotificationName:key object:self userInfo:nil];
    });
  }];
}




其实看这个函数好像很多的样子,其实主要就二部分:
CGFloat newCenter = self.topView.center.x;
  
  if (side == ECLeft) {
    newCenter = self.anchorLeftTopViewCenter;
  } else if (side == ECRight) {
    newCenter = self.anchorRightTopViewCenter;
  }
  
  [self topViewHorizontalCenterWillChange:newCenter];
和一个函数调用:
animateWithDuration:animations:completion
第一部分的作用很简单,标识了二个图层,Center的变化。

第二个部分就是展示这个动画。

同样可以看到这个函数,

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
这个函数是UIView类里面的一个Class Method。其中animations不能为空。其实这个函数的调用就是这个框架动画的核心。

例如下面的代码:

- (IBAction)buttonpress:(id)sender 
{
    CGPoint newcenter;
    newcenter.x = 300;
    newcenter.y = 100;
    
    
    [UIView animateWithDuration:0.25f
                     animations:^{testimage.center = newcenter; }
                     completion:NULL];
}
实现的效果就是点击Button后,图片进行了一个位置的移动。效果图:

OK,这个框架介绍基本就完了。

其实这个框架最帅的地方就是:动画的效果将几个UIViewController很好的联系起来,还有一个就是巧妙的用了ScreenShot的方法去提高效率和内存的使用。


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
iOS开发中上传图片可以采用以下步骤: 1.选择要上传的图片,可以使用系统提供的UIImagePickerController控制器,或者使用第三方库,例如TZImagePickerController。 2.将选中的图片转换为NSData格式。 3.使用NSURLSession或AFNetworking等网络库,将图片数据上传到服务器。 以下是一个简单的上传图片的示例代码: ``` // 选择图片 UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.delegate = self; [self presentViewController:imagePicker animated:YES completion:nil]; // 将选中的图片转换为NSData格式 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info { UIImage *selectedImage = info[UIImagePickerControllerOriginalImage]; NSData *imageData = UIImageJPEGRepresentation(selectedImage, 0.5); // 上传图片到服务器 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; NSURL *url = [NSURL URLWithString:@"http://example.com/upload.php"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 处理服务器返回的响应 }]; [uploadTask resume]; [picker dismissViewControllerAnimated:YES completion:nil]; } ``` 其中,upload.php是服务器端接收图片的脚本文件。在服务器端,可以使用PHP等语言来处理上传的图片数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值