xml地图|网站地图|网站标签 [设为首页] [加入收藏]

i博客园正式发布App

来源:http://www.ccidsi.com 作者:集成经验 人气:128 发布时间:2019-11-27
摘要:果壳网第三方客商端-i新浪正式公布App Store,-iapp [转载地址]() 微博第三方顾客端-i天涯论坛正式公布App Store ----------------iOS完整项目---------------- 1. 前言 算来从15年七月到现在自学iOS已经

果壳网第三方客商端-i新浪正式公布App Store,-iapp

[转载地址]()

微博第三方顾客端-i天涯论坛正式公布App Store

----------------iOS完整项目----------------

1. 前言


算来从15年七月到现在自学iOS已经快五个月了,即使中间也是纯属续续的,但是依然持始终如一下去了。年后要找实习啦,于是萌生了二个苦心孤诣—— 写多少个app练练手。这一次自身没弄后台了,直接利用了新浪的open api(嘿嘿卡塔 尔(英语:State of Qatar)。从前也做过一个app,叫做魔界-魔术,前后端都以自家弄的,不过后端使用的是Bmob后端云(一个Baas服务卡塔尔国,可是作为第贰个app,代码上呼吸系统感染到很混乱,并且多数都以用的第三方控件。此次的i今日头条是自己完全部独用立开拓的(包涵UI设计卡塔 尔(阿拉伯语:قطر‎,全部选取的是MVC格局,並且尽量不去采纳外人第三方控件(就算依然用了。后边会波及现实应用卡塔尔。

先放出几张app的gif预览图片:

i博客园。或然扫描上面二维码:

难点生机勃勃:实现对症之药页(不是开发银行页卡塔 尔(阿拉伯语:قطر‎上的RippleButton(有水波涟漪动漫的按键,第一张gif图片上的可怜粉紫水晶色按键卡塔尔

解决思路:

1. 施用UIBesierPath营造二个圆形的path

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:pathFrame cornerRadius:self.layer.cornerRadius];

2. 将上边的path赋值给circleShape(CAShapeLayer对象)的path属性,同一时间加多该circleShape到RippleButton(UIView类型卡塔 尔(阿拉伯语:قطر‎上

CAShapeLayer *circleShape = [CAShapeLayer layer];
circleShape.path = path.CGPath;

[self.layer addSublayer:circleShape];

3. 当时,就可以动用Core Animation来操作RippleButton的layer了,细节小编就不详细说了,无非是因而动漫调控圆圈的scale和阿尔法

CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
scaleAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
scaleAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2.5, 2.5, 1)];

CABasicAnimation *alphaAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
alphaAnimation.fromValue = @1;
alphaAnimation.toValue = @0;

CAAnimationGroup *animation = [CAAnimationGroup animation];
animation.animations = @[scaleAnimation, alphaAnimation];
animation.duration = 1.0f;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[circleShape addAnimation:animation forKey:nil];

4. 只是即使只是增添二个circleShape,那么不会有八个水波散开的意义。于是自身又将上述123步代码封装成createRippleEffect函数,并增多到计时器中

- (void)setupRippleTimer
{
    __weak __typeof__(self) weakSelf = self;
    NSTimeInterval repeatInterval = self.repeatInterval;

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, repeatInterval * NSEC_PER_SEC, 0);

    __block NSInteger count = 0;
    dispatch_source_set_event_handler(self.timer, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            count   ;
            // 水波纹重复次数,默认-1,表示永久
            if (self.repeatCount != -1 && count > weakSelf.repeatCount) {
                [weakSelf stopRippleEffect];
                return;
            }
            [weakSelf createRippleEffect];
        });
    });
}

标题二:48钟头阅读和三日引入中接纳了UICollectionView,自定义了UICollectionViewLayout,达成轮盘旋转的功用(部分代码参谋了**AWCollectionViewDialLayout**)

减轻思路:

1. 率先得明白自定义UICollectionViewLayout的现实性流程

落实自定义的UICollectionViewLayout的现实流程请参见那篇小说,很详细!

2. 风姿洒脱体自定义UICollectionViewLayout完毕进度中,最大旨的要数layoutAttributesForElementsInRect这一个函数了

2.1 首先依照rect的y值来测算出哪多少个cell在最近rect中:

// 在rect这个区域内有几个cell,返回每个cell的属性
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSMutableArray *layoutAttributes = [NSMutableArray array];

    CGFloat minY = CGRectGetMinY(rect);
    CGFloat maxY = CGRectGetMaxY(rect);
    // 获取到rect这个区域的cells的firstIndex和lastIndex,这两个没啥用,主要是为了获取activeIndex
    NSInteger firstIndex = floorf(minY / self.itemHeight);
    NSInteger lastIndex = floorf(maxY / self.itemHeight);
    NSInteger activeIndex = (firstIndex   lastIndex) / 2; // 中间那个cell设为active
    // maxVisiableOnScreeen表示当前屏幕最多有多少cell
    // angularSpacing表示每隔多少度算一个cell,因为这里是轮盘,每个cell其实看做一个扇形
    NSInteger maxVisiableOnScreeen = 180 / self.angularSpacing   2;

    // firstItem和lastItem就表示哪几个cell处于当前rect
    NSInteger firstItem = fmax(0, activeIndex - (NSInteger)maxVisiableOnScreeen/2);
    NSInteger lastItem = fmin(self.cellCount, activeIndex   (NSInteger)maxVisiableOnScreeen/2);
    if (lastItem == self.cellCount) {
        firstItem = fmax(0, self.cellCount - (NSInteger)maxVisiableOnScreeen);
    }
    // 计算rect中每个cell的UICollectionViewLayoutAttributes
    for (NSInteger i = firstItem; i < lastItem; i  ) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];
        UICollectionViewLayoutAttributes *attributes= [self layoutAttributesForItemAtIndexPath:indexPath];
        [layoutAttributes addObject:attributes];
    }

    return layoutAttributes;
}

2.2 计算每一种cell的UICollectionViewLayoutAttributes

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
    // 默认offset为0
    CGFloat newIndex = (indexPath.item   self.offset);
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];

    attributes.size = self.cellSize;

    CGFloat scaleFactor, deltaX;
    CGAffineTransform translationT;
    CGAffineTransform rotationT;

    switch (self.wheetAlignmentType) {
        case WheetAlignmentTypeLeft:
            scaleFactor = fmax(0.6, 1 - fabs(newIndex * 0.25));
            deltaX = self.cellSize.width / 2;
            attributes.center = CGPointMake(-self.radius   self.xOffset, self.collectionView.height/2 self.collectionView.contentOffset.y);
            rotationT = CGAffineTransformMakeRotation(self.angularSpacing * newIndex * M_PI / 180);
            translationT = CGAffineTransformMakeTranslation(self.radius   deltaX * scaleFactor, 0);
            break;
        case WheetAlignmentTypeRight:
            scaleFactor = fmax(0.6, 1 - fabs(newIndex * 0.25));
            deltaX = self.cellSize.width / 2;
            attributes.center = CGPointMake(self.radius - self.xOffset    ICDeviceWidth, self.collectionView.height/2 self.collectionView.contentOffset.y);
            rotationT = CGAffineTransformMakeRotation(-self.angularSpacing * newIndex * M_PI / 180);
            translationT = CGAffineTransformMakeTranslation(- self.radius - deltaX * scaleFactor, 0);
            break;
        case WheetAlignmentTypeCenter:
            // 待实现
            break;
        default:
            break;
    }

    CGAffineTransform scaleT = CGAffineTransformMakeScale(scaleFactor, scaleFactor);
    attributes.alpha = scaleFactor; // alpha和scaleFactor一致
    // 先scale缩小,在translation到对应位置(因为是扇形,每个cell的x值和对应位置有关),最后rotation(形成弧形)
    attributes.transform = CGAffineTransformConcat(scaleT, CGAffineTransformConcat(translationT, rotationT));
    attributes.zIndex = indexPath.item;

    return attributes;
}

标题三:达成拉动漫的TabBarItem

缓慢解决思路:

不详细说了,小编将代码提交到了Github - animated-tab-bar-Objective-C(PJXAnimatedTabBarController is a Objective-C version of RAMAnimatedTabBarController())。

要害便是自定义UITabBarItem,以至自定义UITabBarItem的AutoLayout构建。代码封装的很好,极其动漫达成部分,结构很清晰,切合OOP观念。

题目四:微博使用的xml方式的open web api。分析困难。

缓和思路:

此处本身仍然选择MVC思路,使用AFNetworking获取到XML数据,再使用XMLDictionary来解析XML数据(本质是NSXMLParserDelegate卡塔 尔(英语:State of Qatar),并将其转会为Model(必要自个儿完结卡塔尔国。

至于NSXMLParserDelegate能够参谋这篇随笔 - iOS开荒之解析XML文件

题目五:设计有个别,不是很专长,每种页面包车型客车布局都必要想非常久,尽量做得简单,有科技(science and technology)风。

缓和思路:

皇家赌场手机版,基本上正是多看外人app设计,模仿,或然本人想啊想。也是第一次用Sketch,话说还相当好用的。

1,豆瓣相册

4. 留慰难点和TODO


  • 享受到Wechat和讯等等,希图利用友盟。
  • 涉嫌到UIWebView分界面包车型客车制版,极难看。不是很懂CSS、JS、HTML5。以前为了三个图片适配搞了半天,其实若是在<head>中增添"img{max-width:百分之百%;height:auto;}"就能够。恳请大家辅导一下笔者。
  • 运用自定义TabBarItem后,隐蔽TabBar很艰难。
  • 离线阅读
  • ……

2,voa在线英文

5. 后记


团结亲手去写代码确实认为上是不等同,超级多细节难题,就算简易,不过很有挑衅性。代码最近很挫,前边校订标准点,筹算停放Github上。

Store,-iapp 微博第三方顾客端-i天涯论坛正式发表App Store 1. 前言 算来从15年六月到明日自学iOS已经快...

3,电子竞赛第一见解

4,开源中华夏族民共和国的iOS客商端

5,异常高贵的大器晚成都部队分构件

6,ios控件学习:

7,reader :

8,git客户端:

9,speakEnglish:

10,音讯阅读 :

11,last.fm:

12,LBS游戏:

13,ThatInbox 是iOS平台上三个免费开源的Email 顾客端:

14,ThatCloud是一个无需付费开源的iOS app,允许你拜见、查看以至接收你在网络存储的剧情,能够很好地帮你完结工作:

15,ThatPhoto是运用了Ink Mobile Framework框架来接二连三到其它iOS 应用程序,你能够用它来编排和拘系照片:

16,ThatPDF叁个开源的,用来阅读、签字和注释PDF 文书档案的工具:

17,xmpp闲谈系统:

18,对口袋NCE有用的app:

19,四个像Twitter那样的图形分享社区App:

20,骇客阅读:

21,画图软件:

22,APN软件:

23,Sol的天气app:

24,货币调换:

25,来电归于地询问的软件(不可能上架卡塔 尔(英语:State of Qatar):

26,Mogo iOS 客户端:

27,

28,使用XMPP公约的IM开源软件:

29,WWDC:

30,线上支付公司 Square 将2018年买断的肖像选拔 Viewfinder 开源了,包罗服务端、iOS 和 Android 应用代码:

31,圣经小帮手 :

32,已阅 :

33,美利坚合众国白宫应用软件:

34,Ruby for China:

35,breadwallet iOS bitcoin wallet :

36,品趣:

37,懒人笔记:

38, Doppio  :

39,parse开源了:

40,The Oakland Post iOS App

41,KeePass 客户端:

41,GreatReader PDF阅读:

42,Signal for iOS:

43,Hacker News Client:

44,coding 的顾客端:

45,Doppio客户端:

46,

47,维基百科客商端:

48,cnBeta 阅读器:

49,三个天气 App:

50,《猿已阅》码农周刊iOS客商端:

51,模仿的《今日头条资源音信》客商端:

52,高仿城觅:

53,Open-source messaging platform:

----------------开源项指标合计--------------

和讯音讯的开源协议:

instagram 开源合同:

----------------组件----------------

自定义tabbar(1)的:

自定义tabbar(2卡塔尔和上拉刷新:

自定义tabbar(3):

类似instagram的tabbar:

coretext:

图表延时加载:

互连网须要:

Json解析:

图形异步加载:

瀑布流1):

瀑布流2)

瀑布流3):

瀑布流4):

瀑布流5):

瀑布流6):

瀑布流7):

做图书的三个框架:

品种内文书档案:

抽屉导航:

iOS的url router :

照片墙:

collectionview:

机动更新类:

官方网站蝴蝶的OpenGL应用:

开机密码锁:

录制播放器:

旋律播放完整顾客端:

豆类音频播放:

掉渣天的音频播放流:

AudioEngine:

滑动的自定义的SegmentedControl控件:

自定义的segmented:

就像swipelist的左右滑动的cell:

扩展1:

扩张2:(存客商密码卡塔 尔(英语:State of Qatar):

scrollview自动滚动:

scrollview左右滑动,渐隐渐出:

scrollview滑动条变细:

弹窗层:

tableview下拉图形放大:

选用iPod库播放音乐:

UIView动画:

恍如clear的超强动漫cell:

乐乎资源音讯背景图浮动:

仿博客园,微博的push效果,带有阴影:1卡塔 尔(英语:State of Qatar)

2)

3)

❤❤❤❤❤完成原理:

微博微博和恋人圈的图样浏览情势:

1)

2)

coretext 运用:

N多自定义组件:

能够换图片的pageControl:

瀑布流:

iOS7的扁平UI:

出品指点view:

看似safari的页面浏览:

正则相称UIView  :

加密措施:

自增进的键盘:

自定义的map Annotation :

超屌的3d画面:

上拉刷新 :

翻页效果:

贴近maps的四分之二翻页:

弹窗:

本文由68399皇家赌场发布于集成经验,转载请注明出处:i博客园正式发布App

关键词: 68399皇家赌场 iOS Blog

最火资讯