[IOS]新浪微博项目2.0

本文详细介绍了新浪微博iOS应用的开发流程,包括项目创建、使用ARC进行自动内存管理、界面搭建、模块管理器的选择与配置,以及具体的界面实现细节。通过本教程,开发者可以深入理解如何将理论知识应用于实际项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


上一章展示了,此项目的大纲及及运行效果,从本章开始,我们开始新浪微博项目的具体实现


首先我们创建一个项目,因为IOS的不断更新,我们采用ARC的自动内存管理。

1.项目创建好之后,需要手动在文件夹中创建几个文件夹,以便于项目的后续之作

2.需要创建一个公共Base类,和五个标签控制器,每个标签都采用MVC的架构模式,如下:


3.搭建界面

①、项目整体分为五个模块,首页,消息,个人中心,广场,更多

②、创建

UINavigationController 和 

UITabBarController 作为五个子模块的管理器,因为考虑到需要实现首页界面的左右抽屉控制器切换效果,我们将几个控制器放入一个容器类里面,如下:

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];

//初始化新浪微博对象
self.sinaWeibo = [[SinaWeibo alloc] initWithAppKey:kAppKey appSecret:kAppSecret appRedirectURI:kAppRedirectURI andDelegate:self];

//取出本地保存的认证信息
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *sinaweiboInfo = [defaults objectForKey:@"SinaWeiboAuthData"];
if ([sinaweiboInfo objectForKey:@"AccessTokenKey"] && [sinaweiboInfo objectForKey:@"ExpirationDateKey"] && [sinaweiboInfo objectForKey:@"UserIDKey"])
{
self.sinaWeibo.accessToken = [sinaweiboInfo objectForKey:@"AccessTokenKey"];
self.sinaWeibo.expirationDate = [sinaweiboInfo objectForKey:@"ExpirationDateKey"];
self.sinaWeibo.userID = [sinaweiboInfo objectForKey:@"UserIDKey"];
}


//修改容器控制器
LeftViewController *leftVC = [[LeftViewController alloc] init];
RightViewController *rightVC = [[RightViewController alloc] init];
MainViewController *centerVC = [[MainViewController alloc] init];
[centerVC.tabBar setClipsToBounds:YES];
MMDrawerController *mainVC = [[MMDrawerController alloc] initWithCenterViewController:centerVC leftDrawerViewController:leftVC rightDrawerViewController:rightVC];

//1.设置右边控制器的显示宽度
[mainVC setMaximumRightDrawerWidth:100];
//2.设置左边控制器显示的宽度
[mainVC setMaximumLeftDrawerWidth:100];

//3.设置打开、关闭的手势区域
[mainVC setOpenDrawerGestureModeMask:MMOpenDrawerGestureModeAll];
[mainVC setCloseDrawerGestureModeMask:MMCloseDrawerGestureModeAll];

// //4.设置动画的类型(效果)
[[MMExampleDrawerVisualStateManager sharedManager] setLeftDrawerAnimationType:MMDrawerAnimationTypeParallax];
[[MMExampleDrawerVisualStateManager sharedManager] setRightDrawerAnimationType:MMDrawerAnimationTypeParallax];
[mainVC
setDrawerVisualStateBlock:^(MMDrawerController *drawerController, MMDrawerSide drawerSide, CGFloat percentVisible) {

MMDrawerControllerDrawerVisualStateBlock block;
block = [[MMExampleDrawerVisualStateManager sharedManager]
drawerVisualStateBlockForDrawerSide:drawerSide];
if(block){
block(drawerController, drawerSide, percentVisible);
}
}];


self.window.rootViewController = mainVC;

return YES;
}



③、

UITabBarController :

@interface MainViewController ()<SinaWeiboRequestDelegate>

@end

@implementation MainViewController {

    ThemeImageView *_tabbarView;
    ThemeImageView *_selectImgView;
    ThemeImageView *_badgeView;


}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self _createViewControllers];
    [self _createTabbarView];
    
    [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];

}

- (void)_createTabbarView {
    
    for (UIView *view in self.tabBar.subviews) {
        Class cls = NSClassFromString(@"UITabBarButton");
        if ([view isKindOfClass:cls]) {
            [view removeFromSuperview];
        }
    }
    
    _tabbarView = [[ThemeImageView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 49)];

    _tabbarView.imageName = @"mask_navbar.png";

    [self.tabBar setClipsToBounds:YES];
    [self.tabBar addSubview:_tabbarView];
    
    _selectImgView = [[ThemeImageView alloc] initWithFrame:CGRectMake(0, 0, 64, 49)];
    _selectImgView.imageName = @"home_bottom_tab_arrow.png";
    [self.tabBar addSubview:_selectImgView];
    
    NSArray *imgNames = @[
                          @"home_tab_icon_1.png",
                          @"home_tab_icon_2.png",
                          @"home_tab_icon_3.png",
                          @"home_tab_icon_4.png",
                          @"home_tab_icon_5.png",
                          ];
    
    CGFloat itemWidth = kScreenWidth / imgNames.count;
    for (int i = 0; i < imgNames.count; i++) {
        ThemeButton *button = [[ThemeButton alloc] initWithFrame:CGRectMake(itemWidth*i, 0, itemWidth, 49)];
        
        button.imgName = imgNames[i];
        button.tag = i;
        [button addTarget:self action:@selector(selectTab:) forControlEvents:UIControlEventTouchUpInside];
        [self.tabBar addSubview:button];
        
    }


}




- (void)selectTab:(UIButton *)button {
    [UIView animateWithDuration:0.3 animations:^{
        _selectImgView.center = button.center;
    }];

    self.selectedIndex = button.tag;
    
    CATransition *tren = [[CATransition alloc]init];
    
    tren.type =kCATransitionReveal;
//    tren.type = @"suckEffect";
//    tren.type = @"rippleEffect";
//    tren.type = @"cameraIrisHollowOpen";
//    tren.type = @"cameraIrisHollowOpen";
//    tren.type = @"cameraIrisHollowOpen";
    
    tren.subtype = kCAGravityResizeAspectFill;
    tren.duration = 0.3;
    [self.view.layer addAnimation:tren forKey:nil];

}

- (void)_createViewControllers {

    NSArray *storyboardname = @[@"Home",@"Message",@"Profile",@"Disconver",@"More"];

    NSMutableArray *viewControllers = [NSMutableArray arrayWithCapacity:5];
    for (int i = 0; i < storyboardname.count; i++) {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardname[i] bundle:nil];
        WXNavigationController *navigation = [storyboard instantiateInitialViewController];
        
        [viewControllers addObject:navigation];
    }
 
    self.viewControllers = viewControllers;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - timerAction
- (void)timeAction {
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    SinaWeibo *sinaweibo = appDelegate.sinaWeibo;
    [sinaweibo requestWithURL:unread_count
                       params:nil
                   httpMethod:@"GET"
                     delegate:self];
    
}

- (void)request:(SinaWeiboRequest *)request didFinishLoadingWithResult:(id)result {

    if (_badgeView == nil) {
        _badgeView = [[ThemeImageView alloc] initWithFrame:CGRectMake(64-32, 0, 32, 32)];
        _badgeView.imageName = @"number_notify_9.png";
        [self.tabBar addSubview:_badgeView];
        
        
        
        ThemeLabel *badgeLabel = [[ThemeLabel alloc] initWithFrame:_badgeView.bounds];
        badgeLabel.colorName = @"Timeline_Notice_color";
        badgeLabel.textAlignment = NSTextAlignmentCenter;
        badgeLabel.font = [UIFont boldSystemFontOfSize:13.0f];
        badgeLabel.backgroundColor = [UIColor clearColor];
        badgeLabel.tag = 100;
        [_badgeView addSubview:badgeLabel];
        
    }
    
    NSNumber *status = result[@"status"];
    NSInteger unRead = [status integerValue];
    
    if (unRead > 0) {
        _badgeView.hidden = NO;
        ThemeLabel *badaeLabel = (ThemeLabel *)[_badgeView viewWithTag:100];
        if (unRead > 100) {
            unRead = 99;
        }
        badaeLabel.text = [status stringValue];
        
    }else {
        _badgeView.hidden = YES;
    
    }


}

- (void)hideBage {

    _badgeView.hidden = YES;

}
@end


④、

UINavigationController

@interface WXNavigationController ()

@end

@implementation WXNavigationController

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:kThemeDidChangeNotification object:nil];
}



- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadImage) name:kThemeDidChangeNotification object:nil];
    }

    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self loadImage];
    
}




- (void)loadImage {
     NSString *imgName = @"mask_titlebar.png";
    if (ios7) {
        imgName = @"mask_titlebar64.png";
    }

    UIImage *img =[[ThemeManager shareInstance] getThemeImage:imgName];
    [self.navigationBar setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
    
    
     //3.获取当前主题下的颜色
    UIColor *titleColor = [[ThemeManager shareInstance] getThemeColor:@"Mask_Title_color"];
    NSDictionary *titleTextAttributes = @{
                                          NSForegroundColorAttributeName:titleColor
                                          
                                          };
    self.navigationBar.titleTextAttributes = titleTextAttributes;
    
     //设置返回按钮标题的颜色
    if (ios7) {
        self.navigationBar.tintColor = [[ThemeManager shareInstance] getThemeColor:@"Mask_Title_color"];
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


项目需要用到的框架 :



做好准备工作后,我们就可以开始 具体内容的具体实现了~


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值