博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS实践01
阅读量:5747 次
发布时间:2019-06-18

本文共 7823 字,大约阅读时间需要 26 分钟。

  去年放假之前大概完成了新浪微博项目,到现在也忘得差不多了,打算在重新写一遍。之前的一些笔记在新浪的博客SleenXiu,在这主要是把新浪微博以随笔的形式写在这,方便以后的复习。

  先看看之前主要完成的几个点,秒拍视频连接:http://video.weibo.com/show?fid=1034:32ed06b90b1bba7ba25cc546a06fa949

  今天开始重新写一遍,在这记下来。

  经典框架的搭建,所谓经典框架就是最底层为UITabBarController,管理几个UINavigationController,不同的UINavigationController又管理相应的VC。

  1.在appdelegate中完成初步的框架搭建,我们需要一个自定义的UITabBarController,并成为window的根控制器。

1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2     // Override point for customization after application launch. 3      4     // 设置窗口 5     self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 6      7     // 初始化自己的tabbarController 8     SVTabbarController *tabbar = [[SVTabbarController alloc] init]; 9     10     // 为窗口添加根控制器,11     self.window.rootViewController = tabbar;12     13     // 显示窗口14     [self.window makeKeyAndVisible];15     16     return YES;17 }

  2.对文件进行分组,按照模块分,下面的MVC结构。

  3.在自己的tabbarcontroller中为其添加子控制器[self addController],为方法编写代码。(后面会对这段代码进行优化)

1 // 添加子控制器 2 - (void)addController 3 { 4     SVHomeController *homeVC = [[SVHomeController alloc] init]; 5     SVNavigationController *homeNav = [[SVNavigationController alloc] initWithRootViewController:homeVC]; 6     homeVC.title = @"首页"; 7     homeVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_home_os7"]; 8     homeVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_home_selected_os7"]; 9     [self addChildViewController:homeNav];10     11     SVHomeController *messageVC = [[SVHomeController alloc] init];12     SVNavigationController *messageNav = [[SVNavigationController alloc] initWithRootViewController:messageVC];13     messageVC.title = @"消息";14     messageVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_message_center_os7"];15     messageVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_message_center_selected_os7"];16     [self addChildViewController:messageNav];17     18     SVHomeController *discoverVC = [[SVHomeController alloc] init];19     SVNavigationController *discoverNav = [[SVNavigationController alloc] initWithRootViewController:discoverVC];20     discoverVC.title = @"发现";21     discoverVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_discover_os7"];22     discoverVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_discover_selected_os7"];23     [self addChildViewController:discoverNav];24     25     SVHomeController *meVC = [[SVHomeController alloc] init];26     SVNavigationController *meNav = [[SVNavigationController alloc] initWithRootViewController:meVC];27     meVC.title = @"我";28     meVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_profile_os7"];29     meVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_profile_selected_os7"];30     [self addChildViewController:meNav];31 }

基本效果已经有了

  4.tabbar的导航不是想要的效果,删除系统自带的tabbaritem,添加自定义tabbar,[self addtabbar]。

1 // 移除系统的tabbar,view将要出现的时候删除掉原有tabbar上所有的item 2 - (void)viewWillAppear:(BOOL)animated 3 { 4     [super viewWillAppear:animated]; 5      6     for (UIView *child in self.tabBar.subviews) { 7         if ([child isKindOfClass:[UIColor class]]) { 8             [child removeFromSuperview]; 9         }10     }11 }12 // 增加自己的tabbar13 - (void)addTabbar14 {15     // 初始化自己的tabbar16     SVTabbar *tabbar = [[SVTabbar alloc] initWithFrame:self.tabBar.bounds];17     // 保存自己的tabbar18     self.mytabbar = tabbar;19     // 添加自己的tabbar20     [self.tabBar addSubview:tabbar];21     // 为tabbar添加代理22     tabbar.delegate = self;23     24 }

  5.封装自己的tabbar,添加控件,自定义按钮item,完成跳转

  5-1.添加控件,根据有多少个控制器添加相应个数的btn,而btn的相应值通过item进行传递,在tabbar中提供- (void)addBtnWithItem:(UITabbarItem)item;方法添加自己的item(btn)
1 - (void)addBtnWithItem:(UITabBarItem *)item 2 { 3     // 初始化btn 4     SVTabbarButton *btn = [[SVTabbarButton alloc] init]; 5     // 保存btn 6     [self.tabbarBtns addObject:btn]; 7     // 赋值btn 8     btn.item = item; 9     // 添加btn10     [self addSubview:btn];11     // 为按钮绑定点击事件12     [btn addTarget:self action:@selector(selectedBtn:) forControlEvents:UIControlEventTouchUpInside];13     // 默认选中第一个14     if (self.tabbarBtns.count == 1) {15         [self selectedBtn:btn];16     }17 }18 // 按钮的点击事件19 - (void)selectedBtn:(SVTabbarButton *)btn20 {21     // 通知代理22     if ([self.delegate respondsToSelector:@selector(tabbar:didSelectBtnFrom:to:)]) {23         [self.delegate tabbar:self didSelectBtnFrom:(int)self.currentBtn.tag to:(int)btn.tag];24     }25     // 设置tabbar的选中26     self.currentBtn.selected = NO;27     btn.selected = YES;28     self.currentBtn = btn;29 }30 // 布局按钮31 - (void)layoutSubviews32 {33     self.subviews[0].center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5);34     35     for (int index = 0; index
1) {43 bX += bW;44 }45 btn.frame = CGRectMake(bX, bY, bW, bH);46 47 btn.tag = index;48 }49 }
  5-2.自定义按钮,重新布局按钮的位置,并对按钮进行赋值数据,有四个控制器,所以重构添加控制器的方法,根据不同的控制器为相应属性赋值。
1 // 重新布局btn内部的控件得到想要的效果 2 - (instancetype)initWithFrame:(CGRect)frame 3 { 4     if (self = [super initWithFrame:frame]) { 5         // 图片居中显示 6         self.imageView.contentMode = UIViewContentModeCenter; 7         // 文本居中显示 8         self.titleLabel.textAlignment = NSTextAlignmentCenter; 9         // 设置字体大小10         [self.titleLabel setFont:[UIFont systemFontOfSize:13]];11         12         // 设置字体颜色13         [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];14         [self setTitleColor:[UIColor orangeColor] forState:UIControlStateSelected];15     }16     return self;17 }18 // 重写item的set方法,对btn进行赋值19 - (void)setItem:(UITabBarItem *)item20 {21     _item = item;22     23     [self setTitle:item.title forState:UIControlStateNormal];24     [self setImage:item.image forState:UIControlStateNormal];25     [self setImage:item.selectedImage forState:UIControlStateSelected];26 }27 // 内部图片的位置28 - (CGRect)imageRectForContentRect:(CGRect)contentRect29 {30     CGFloat imageW = contentRect.size.width;31     CGFloat imageH = contentRect.size.height * 0.6;32     return CGRectMake(0, 0, imageW, imageH);33     34 }35 // 内部文字的位置36 - (CGRect)titleRectForContentRect:(CGRect)contentRect37 {38     CGFloat titleY = contentRect.size.height * 0.6;39     CGFloat titleW = contentRect.size.width;40     CGFloat titleH = contentRect.size.height - titleY;41     return CGRectMake(0, titleY, titleW, titleH);42 }43 // 去掉按钮的高亮状态44 - (void)setHighlighted:(BOOL)highlighted {}
  5-3.完成点击按钮控制器的跳转,取消按钮高亮状态,默认选中第一的按钮,按钮绑定点击事件,为自定义的tabbar写代理,监听按钮点击跳转控制器
1 @protocol SVTabbarDelegate 
2 @optional3 // 当tabbar上的按钮点击的时候会调用4 - (void)tabbar:(SVTabbar *)tabbar didSelectBtnFrom:(int)from to:(int)to;5 @end
1 #pragma mark tabbar的代理方法2 - (void)tabbar:(SVTabbar *)tabbar didSelectBtnFrom:(int)from to:(int)to3 {4     self.selectedIndex = to;5 }
  6.添加中间的加号按钮,位置固定所以直接一次设置就好
1 - (instancetype)initWithFrame:(CGRect)frame 2 { 3     if (self = [super initWithFrame:frame]) { 4         UIButton *plusBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 5          6         [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_os7"] forState:UIControlStateNormal]; 7         [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted_os7"] forState:UIControlStateHighlighted]; 8         [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_os7"] forState:UIControlStateNormal]; 9         [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted_os7"] forState:UIControlStateHighlighted];10         plusBtn.frame = CGRectMake(0, 0, plusBtn.currentBackgroundImage.size.width, plusBtn.currentBackgroundImage.size.height);11         12         [self addSubview:plusBtn];13     }14     return self;15 }

  今天就先做这一点,基本大的框架就已经好了,明天修一下细节。

转载于:https://www.cnblogs.com/sleen/p/5225275.html

你可能感兴趣的文章
C语言及程序设计提高例程-35 使用指针操作二维数组
查看>>
华大基因BGI Online的云计算实践
查看>>
深入理解自定义Annotation,实现ButterKnif小原理
查看>>
排序高级之交换排序_冒泡排序
查看>>
Cocos2d-x3.2 Ease加速度
查看>>
[EntLib]关于SR.Strings的使用办法[加了下载地址]
查看>>
中小型网站架构分析及优化
查看>>
写shell的事情
查看>>
负载均衡之Haproxy配置详解(及httpd配置)
查看>>
linux虚拟机拷贝之后联网出错
查看>>
Linux文件系统探索
查看>>
标准与扩展ACL 、 命名ACL 、 总结和答疑
查看>>
查找恶意的TOR中继节点
查看>>
MAVEN 属性定义与使用
查看>>
hadoop2.7.2 HA搭建
查看>>
shell高级视频答学生while循环问题
查看>>
使用@media实现IE hack的方法
查看>>
《11招玩转网络安全》之第一招:Docker For Docker
查看>>
hive_0.11中文用户手册
查看>>
hiveserver2修改线程数
查看>>