iOS实现微信朋友圈与摇一摇功能
作者:lijiao 发布时间:2023-06-16 13:59:48
标签:iOS,微信,朋友圈,摇一摇
本Demo为练手小项目,主要是熟悉目前主流APP的架构模式.此项目中采用MVC设计模式,纯代码和少许XIB方式实现.主要实现了朋友圈功能和摇一摇功能.
预览效果:
主要重点
1.整体架构
利用UITabBarController和UINavigationController配合实现.其中要注意定义基类,方便整体上的管理,例如对UINavigationController头部的颜色,字体和渲染颜色等设置.以及对UITabBarController的底部的渲染等.
[self.navigationBarsetBackgroundImage:[UIImageimageNamed:@"Dimensional-_Code_Bg"]forBarMetrics:UIBarMetricsDefault];
[self.navigationBarsetTitleTextAttributes:@{
NSForegroundColorAttributeName:[UIColor whiteColor]
}];
[self.navigationBarsetTintColor:[UIColor whiteColor]];
2.发现界面和我的界面
利用UITableViewController和Plist文件实现界面的展示.实现过程中有采用数据模型或直接利用字典等方式.这里的实现比较简单,就不多说啦.
- (instancetype)initWithDict:(NSDictionary *)dict{
if (self = [super init]) {
[selfsetValuesForKeysWithDictionary:dict];
}
return self;
}
+ (instancetype)pictureWithDict:(NSDictionary *)dict{
return [[self alloc]initWithDict:dict];
}
3.朋友圈功能的实现
这里面主要的难点在于朋友圈首页的下拉刷新效果的实现,和选择照片页的状态重用问题,以及照片的传递和代理的实现等.
朋友圈首页的下拉刷新效果:主要利用transform属性和scrollview的多种滚动状态.
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
self.dragging = YES;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (self.num == 0) {
self.num ++;
return;
}
CGFloat offsetY = scrollView.contentOffset.y;
CGFloat angle = -offsetY* M_PI / 30;
if (self.dragging == YES) {
if (offsetY <= 110) {
self.containerView.y = 10 + offsetY;
}
}else {
if (self.currentY < 120) {
self.containerView.y = 10 + offsetY;
}
}
self.activityView.transform = CGAffineTransformMakeRotation(angle);
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollViewwillDecelerate:(BOOL)decelerate{
self.dragging = NO;
CGFloat currentY = self.containerView.y;
self.currentY = currentY;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
[UIViewanimateWithDuration:0.25animations:^{
self.containerView.frame = CGRectMake(15, 120, 30, 30);
self.activityView.transform = CGAffineTransformMakeRotation(2 * M_PI);
}];
}
其中照片的展示是采用UICollectionViewController来实现的.没有直接调用系统的相册,因此加大了难度.自定义了cell,并采用了代理方式来实现类与类之间的通信.
@protocol YYPictureCellDelegate
@optional
- (void)pictureCell:(YYPictureCell *)cellwithDidClickBtn:(UIButton *)btn;
@end
- (IBAction)clickSureBtn:(UIButton *)sender {
if ([self.delegaterespondsToSelector:@selector(pictureCell:withDidClickBtn:)]) {
[self.delegatepictureCell:selfwithDidClickBtn:sender];
}
}
- (void)pictureCell:(YYPictureCell *)cellwithDidClickBtn:(UIButton *)btn{
if ((self.selectedBtn.count == 9) && (!btn.isSelected)) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nilmessage:@"最多选取9张照片哦,亲!"delegate:nilcancelButtonTitle:@"确定"otherButtonTitles: nil];
[alertshow];
return;
}
btn.selected = !btn.isSelected;
NSIndexPath *indexPath = [self.collectionViewindexPathForCell:cell];
YYPictureModel *model = self.dataArray[indexPath.row];
if (btn.isSelected) {
model.clickedBtn = YES;
[self.selectedBtnaddObject:btn];
[self.selImageArrayaddObject:model];
} else{
model.clickedBtn = NO;
[self.selectedBtnremoveObject:btn];
[self.selImageArrayremoveObject:model];
}
if (self.selectedBtn.count > 0) {
self.doneBtn.enabled = YES;
self.doneBtn.selected = YES;
self.previewBtn.enabled = YES;
self.previewBtn.selected = YES;
}else {
self.doneBtn.enabled = NO;
self.doneBtn.selected = NO;
self.previewBtn.enabled = NO;
self.previewBtn.selected = NO;
}
}
4.摇一摇功能的实现
摇一摇功能的本身实现十分简单,就是调用系统的两个方法即可.难点在于动画效果.其实这里的动画效果也不是很难.主要是计算有点复杂.可能是我在网上搜索到的素材有点不合适.导致要考虑各个控件的frame问题…
//实现摇一摇功能
- (void)motionBegan:(UIEventSubtype)motionwithEvent:(UIEvent *)event{
self.upLine.hidden = NO;
self.downLine.hidden = NO;
[UIViewanimateWithDuration:0.6animations:^{
self.upImageView.y -= 60;
self.upLine.y -= 60;
self.downImageView.y += 60;
self.downLine.y += 60;
}completion:^(BOOL finished) {
[UIViewanimateWithDuration:0.6animations:^{
self.upImageView.y += 60;
self.upLine.y += 60;
self.downImageView.y -= 60;
self.downLine.y -= 60;
}completion:^(BOOL finished) {
self.upLine.hidden = YES;
self.downLine.hidden = YES;
//弹出搜索框
[self showSearchView];
[self.searchViewperformSelector:@selector(removeFromSuperview)withObject:nilafterDelay:2.4];
}];
}];
}
//摇一摇结束后
- (void)motionEnded:(UIEventSubtype)motionwithEvent:(UIEvent *)event{
}
0
投稿
猜你喜欢
- 为什么要使用路由在之前我们的代码中,页面跳转使用的代码如下所示:Navigator.of(context).push( Mate
- 在谈 JVM 内存区域划分之前,我们先来看一下 Java 程序的具体执行过程,我画了一幅图。Java 源代码文件经过编译器编译后生成字节码文
- 样例代码在讲 Flutter 的盒子模型前,先看看HTML 中的盒子模型。如下图所示,一个页面元素包括了与父级容器的外边距(margin),
- 简介官方API文档Scaffold的of方法说明有说明调用Scaffold.of方法是在Scallfold的子组件的Build方法中,也就是
- 一、先看下项目结构CodeGenerator:生成器主类resources下的mapper.java.vm:一个模板类,用以在生成dao层时
- 过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法。红包生成算法的需求预先生成所有的红包还是一个请求随机生成一个红包简单来
- 简介对于一个APP来说,肯定会有一个AppBar,这个AppBar一般包含了APP的导航信息等。虽然我们可以用一个固定的组件来做为AppBa
- 双向顺序队列ArrayDeque和双向链式队列LinkedList,JDK已经包含,在此略。ArrayDeque包括顺序栈和顺序队列,Lin
- 图像滤波在opencv中可以有多种实现形式自定义滤波如使用3×3的掩模:对图像进行处理.使用函数filter2D()实现#include&l
- 你知道String、StringBuilder、Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗?别急,这篇文章
- 在类中自定义的“函数”称为“方法”,由于C#是完全面向对象的
- 本文实例讲述了C#获取网页源代码的方法。分享给大家供大家参考。具体如下:public string GetPageHTML(string u
- 本文主要介绍我为桌面和 Web 设计的一个超级秘密 Flutter 项目使用了画布和可拖动节点界面。本教程将展示我如何使用堆栈来使用小部件完
- 在观察者模式中有2个要素:一个是被观察对象,另一个是观察者。但被观察对象的状态发生改变会通知观察者。举例:把订阅报纸的人看作是观察者,把报纸
- [LeetCode] 9. Palindrome Number 验证回文数字Determine whether an integer is
- 在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,通常使用@ResponseBody注解使 co
- 引语:工作中有时候需要在普通的对象中去调用spring管理的对象,但是在普通的java对象直接使用@Autowired或者@Resource
- Json的简介JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个
- 就网络和应用程序而言,键盘快捷键很重要,今天我们要谈的便是让这类快捷键得以在Flutter运作的小部件:Focus、Shortcuts和Ac
- 1.map遍历快速实现边距,文字自适应改变大小Container( // padding: EdgeI