iOS小项目-云知道(天气预报)

引子

之前曾经做过一个渣渣天气预报,链接,无论是UI搭建还是业务逻辑都非常感人……总结就是一个字:“丑”,不久前看到 ManoBoo大大的 壁纸天气,有种眼前一亮的感觉,再回想自己做第一个天气预报项目时候种种别出心裁 瞎搞 的设计方案,一瞬间羞愤欲死 (但是很快就缓过来了),决定临摹一个出来。


预览
gif-1.gif
gif-2.gif
gif-3.gif
gif-4.gif
gif-5.gif
gif-6.gif

懒癌发作……先不码字了,挖个坑先


初始界面

1 . 首先在进入App的时候进行判断,看是不是第一次加载App,如果是的话,需要从初始化一下热门城市的配置。

// 在AppDelegate中执行这段代码,判断并初始化热门城市列表
- (void)setInitData{
    BOOL isFirstStart;
    id obj = [[NSUserDefaults standardUserDefaults] objectForKey:IsFirstStartKey];
    if (obj == nil) {
        isFirstStart = YES;
    }else {
        isFirstStart = NO;
    }
    
    if (isFirstStart ) {
        [[CKCityManager shareInstance] setupHotCities];//配置热门城市列表
        isFirstStart = NO;
        // 存储YES至 对应的Key
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:isFirstStart] forKey:IsFirstStartKey];
    }
}


CKCityManager 是一个全局的单例类,用来储存及操作之后的城市选择

包含下面几个方法,基本能够囊括项目中的需求。
// 初始化
+ (instancetype)shareInstance;

/** 是否已有选择的城市 */
- (BOOL)hasSelectedCity;

/** 初始化热门城市(8个) */
- (void)setupHotCities;

/** 返回热门城市列表 */
- (NSArray *)getHotCities;

/** 存储选定的城市 */
- (void)saveCityWithModel:(CKCityModel *)model;

/** 返回已经选定的城市 */
- (NSArray *)savedCities;

代码相对来说都不算太复杂,都是一些根据设定好的key值,再使用NSUserDefaults 读取相关的Key值之类的操作。

2 . 根控制器 CKHomeWeatherController

这个页面用来展示全局 (已选择) 城市的天气概况,仿照ManoBoo大大的思想,隐藏掉NavigationBar (只是隐藏,实际上仍然存在),取消使用tabbar进行页面跳转操作,改用一个动画效果弹出的按钮来搞定基本的页面操作。

页面层级预览.png

底部那4个一排就是按钮组,最后面蓝色的指纹按钮是basicOperationButton(BOB),另外三个是功能性按钮,正常为隐藏状态,BOB被点击时,其会弹出并呈扇形排布在BOB上方,再次点击后隐藏。

具体执行起来与普通的按钮状态取反很相似,动画效果一开始比较懵,理清楚思路后发现也不算很难。

- (void)showButtonsArray {
    
    WeakSelf;
    if (_showOperationButtons) {
        _showOperationButtons = NO;
        [weakSelf.operationBtnArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            UIButton *btn = (UIButton *)obj;
            CGRect frame = weakSelf.operationButton.frame;
            float duration = 0.0;
            [UIView animateWithDuration:0.4 delay:duration options:UIViewAnimationOptionCurveEaseInOut animations:^{
                btn.alpha = 0.0;
                btn.frame = frame;
                btn.transform = CGAffineTransformMakeRotation(M_PI);
            } completion:^(BOOL finished) {
                
            }];
        }];
    }else{
        _showOperationButtons = YES;
        [weakSelf.operationBtnArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            UIButton *button = (UIButton *)obj;
            //更改后 frame
            CGRect frame = button.frame;
            frame.size.width = frame.size.height = 44;
            //延时
            float duration = 0.0;
            
            switch (idx) {
                case 0: {
                    frame.origin.x -= 50 * sqrt(2);
                    frame.origin.y -= 50 * sqrt(2);
                }
                    break;
                case 1: {
                    frame.origin.y -= 100;
                    duration = 0.1;
                }
                    break;
                case 2: {
                    frame.origin.x += 50 * sqrt(2);
                    frame.origin.y -= 50 * sqrt(2);
                    duration = 0.25;
                }
                    break;
            }
            // 按延迟 将三个button 按顺序依次弹出
            [UIView animateWithDuration:0.4 delay:duration options:UIViewAnimationOptionCurveEaseInOut animations:^{
                button.alpha = 1.0;
                button.frame = frame;
                button.transform = CGAffineTransformMakeRotation(M_PI * 2);
            } completion:nil];
        }];
    }
}

// 具体按钮点击的Push操作 
- (void)aboutMe {
    [self showButtonsArray]; // 也调用一次上面的方法,达到隐藏按钮队列的作用
    AboutMeController *meVc = [[AboutMeController alloc] init];
    [self.navigationController pushViewController:meVc
                                         animated:YES];
}

// 老实说刚读源码的时候看着sqrt一脸懵逼,后来发现原始就是开平方……感叹一下早期学的都还给老师了
// 突然想到自己的Note3,手写笔抽出来的时候也会显示出一个类似的扇形操作界面。

因为只是一个将按钮显示出来的动画,不存在什么交叉target,相对来说比较独立。

3 . nullDataView

如果在进入根控制器后解析不到selectedCities,则加载nullDataView到界面。

// 设置无数据时显示的界面
- (void)setupNullDataView {
    if (![[CKCityManager shareInstance] hasSelectedCity]) {
        if (!_nullView) {
            _nullView = [[NullDataView alloc] initWithFrame:[UIScreen mainScreen].bounds];
            [self.view addSubview:_nullView];
        }
        _nullView.hidden = NO;
        _tableView.hidden = YES;
    } else { // 如果不是第一次进入App,显示tableView 并加载数据
        _nullView.hidden = YES;
        _tableView.hidden = NO;
        [self loadNewData];
    }
}

// 一开始思路有问题……导致选取了城市后pop页面回来仍然显示nullDataView 

秉承的思想是 viewDidLoad和viewWillAppear 这俩方法,
viewDidLoad中只负责addSubView ,具体的setup loadNewData ,刷新页面都放在viewWillAppear 中解决 。


懒癌发作……睡一觉再说

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 拖了一天不想写,有点逃避吧? 真的好累,精神紧张,每天也没想啥。就想早早入睡。 转眼过了一周,回头一看,还是很快的...
    蒋羽燃阅读 133评论 0 0
  • 来自itme 大四上的最后一场期末考试结束,最后一场学生时代的考试也随之结束了。紧张的气氛消散。同学离场,没有看见...
    一zhi鱼阅读 587评论 2 1
  • 今天有张老师的课,而我忘记之后,泽阳老师帮我把我前几天的问题向张老师提问,张老师也给予了回答。 在之前的问题处理中...
    非宁静无以致远_渊宁阅读 169评论 0 0