首页显示微博列表,是微博的核心部分,这一章节,我们主要是显示出微博的列表。

导入第三方类库

pod 'SDWebImage', '~> 3.7.3'
pod 'MJRefresh', '~> 2.4.12'
pod 'MJExtension', '~> 2.5.14'

需求分析

由于Cell的高度是不一样的,因而采用自定义cell的方式来实现。具体实现思路,请参数之前的文章:

iOS UI基础-9.2 UITableView 简单微博列表

代码实现

1、根据新浪微博的API文档,需要定义两个模型(User/Status),由于我们还需要计算控制的位置,另外定义一个StatusFrame模型。

User.h

//
//  User.h
//  Weibo
//
//  Created by jiangys on 15/10/24.
//  Copyright © 2015年 Jiangys. All rights reserved.
//

#import <Foundation/Foundation.h>typedef enum {UserVerifiedTypeNone = -1, // 没有任何认证UserVerifiedPersonal = 0,  // 个人认证UserVerifiedOrgEnterprice = 2, // 企业官方:CSDN、EOE、搜狐新闻客户端UserVerifiedOrgMedia = 3, // 媒体官方:程序员杂志、苹果汇UserVerifiedOrgWebsite = 5, // 网站官方:猫扑UserVerifiedDaren = 220 // 微博达人
} UserVerifiedType;@interface User : NSObject/**    string    字符串型的用户UID*/
@property (nonatomic, copy) NSString *idstr;/**    string    友好显示名称*/
@property (nonatomic, copy) NSString *name;/**    string    用户头像地址,50×50像素*/
@property (nonatomic, copy) NSString *profile_image_url;/** 会员类型 > 2代表是会员 */
@property (nonatomic, assign) int mbtype;/** 会员等级 */
@property (nonatomic, assign) int mbrank;@property (nonatomic, assign, getter = isVip) BOOL vip;/** 认证类型 */
@property (nonatomic, assign) UserVerifiedType verified_type;@end

View Code

User.m

//
//  User.m
//  Weibo
//
//  Created by jiangys on 15/10/24.
//  Copyright © 2015年 Jiangys. All rights reserved.
//

#import "User.h"@implementation User- (void)setMbtype:(int)mbtype
{_mbtype = mbtype;self.vip = mbtype > 2;
}@end

View Code

Status.h

//
//  Status.h
//  Weibo
//
//  Created by jiangys on 15/10/24.
//  Copyright © 2015年 Jiangys. All rights reserved.
//

#import <Foundation/Foundation.h>
@class User;@interface Status : NSObject/**    string    字符串型的微博ID*/
@property (nonatomic, copy) NSString *idstr;/**    string    微博信息内容*/
@property (nonatomic, copy) NSString *text;/**    object    微博作者的用户信息字段 详细*/
@property (nonatomic, strong) User *user;/**    string    微博创建时间*/
@property (nonatomic, copy) NSString *created_at;/**    string    微博来源*/
@property (nonatomic, copy) NSString *source;/** 微博配图地址。多图时返回多图链接。无配图返回“[]” */
@property (nonatomic, strong) NSArray *pic_urls;@end

View Code

Status.m

#import "Status.h"@implementation Status// source == <a href="http://app.weibo.com/t/feed/2llosp" rel="nofollow">OPPO_N1mini</a>
- (void)setSource:(NSString *)source
{if (source.length != 0) {NSRange range;range.location = [source rangeOfString:@">"].location + 1;range.length = [source rangeOfString:@"</"].location - range.location;_source = [NSString stringWithFormat:@"来自%@", [source substringWithRange:range]];} else{_source = @"来自微博";}
}@end

View Code

StatusFrame.h

//
//  StatusFrame.h
//  Weibo
//
//  Created by jiangys on 15/10/24.
//  Copyright © 2015年 Jiangys. All rights reserved.
//

#import <Foundation/Foundation.h>
@class Status;// cell的边框宽度
#define StatusCellBorderW 10
// 昵称字体
#define StatusCellNameFont [UIFont systemFontOfSize:15]
// 时间字体
#define StatusCellTimeFont [UIFont systemFontOfSize:12]
// 来源字体
#define StatusCellSourceFont StatusCellTimeFont
// 正文字体
#define StatusCellContentFont [UIFont systemFontOfSize:14]// 被转发微博的正文字体
#define StatusCellRetweetContentFont [UIFont systemFontOfSize:13]// cell之间的间距
#define StatusCellMargin 15@interface StatusFrame : NSObject/** 存在微博模型 */
@property (nonatomic, strong) Status *status;/** 原创微博整体 */
@property (nonatomic, assign, readonly) CGRect originalViewF;
/** 头像 */
@property (nonatomic, assign, readonly) CGRect iconViewF;
/** 会员图标 */
@property (nonatomic, assign, readonly) CGRect vipViewF;
/** 配图 */
@property (nonatomic, assign, readonly) CGRect photosViewF;
/** 昵称 */
@property (nonatomic, assign, readonly) CGRect nameLabelF;
/** 时间 */
@property (nonatomic, assign, readonly) CGRect timeLabelF;
/** 来源 */
@property (nonatomic, assign, readonly) CGRect sourceLabelF;
/** 正文 */
@property (nonatomic, assign, readonly) CGRect contentLabelF;/** cell的高度 */
@property (nonatomic, assign, readonly) CGFloat cellHeight;@end

View Code

StatusFrame.m

//
//  StatusFrame.m
//  Weibo
//
//  Created by jiangys on 15/10/24.
//  Copyright © 2015年 Jiangys. All rights reserved.
//

#import "StatusFrame.h"
#import "Status.h"
#import "User.h"
#import "NSString+Size.h"@implementation StatusFrame/***  设置每一条微博的Frame 及cell的高度**  @param status 微博模型*/
-(void)setStatus:(Status *)status
{_status = status;User *user=status.user;// cell的宽度CGFloat cellW = [UIScreen mainScreen].bounds.size.width;/* 原创微博 *//** 头像 */CGFloat iconWH = 35;CGFloat iconX = StatusCellBorderW;CGFloat iconY = StatusCellBorderW;_iconViewF = CGRectMake(iconX, iconY, iconWH, iconWH);/** 昵称 */CGFloat nameX = CGRectGetMaxX(self.iconViewF) + StatusCellBorderW;CGFloat nameY = iconY;CGSize nameSize = [user.name sizeWithFont:StatusCellNameFont];_nameLabelF = (CGRect){{nameX, nameY}, nameSize};/** 会员图标 */if (user.isVip) {CGFloat vipX = CGRectGetMaxX(self.nameLabelF) + StatusCellBorderW;CGFloat vipY = nameY;CGFloat vipH = nameSize.height;CGFloat vipW = 14;_vipViewF = CGRectMake(vipX, vipY, vipW, vipH);}/** 时间 */CGFloat timeX = nameX;CGFloat timeY = CGRectGetMaxY(self.nameLabelF) + StatusCellBorderW;CGSize timeSize = [status.created_at sizeWithFont:StatusCellTimeFont];_timeLabelF = (CGRect){{timeX, timeY}, timeSize};/** 来源 */CGFloat sourceX = CGRectGetMaxX(self.timeLabelF) + StatusCellBorderW;CGFloat sourceY = timeY;CGSize sourceSize = [status.source sizeWithFont:StatusCellSourceFont];_sourceLabelF = (CGRect){{sourceX, sourceY}, sourceSize};/** 正文 */CGFloat contentX = iconX;CGFloat contentY = MAX(CGRectGetMaxY(self.iconViewF), CGRectGetMaxY(self.timeLabelF)) + StatusCellBorderW;CGFloat maxW = cellW - 2 * contentX;CGSize contentSize = [status.text sizeWithFont:StatusCellContentFont maxW:maxW];_contentLabelF = (CGRect){{contentX, contentY}, contentSize};/* cell的高度 */_cellHeight = CGRectGetMaxY(self.contentLabelF)+StatusCellBorderW;
}@end

View Code

2、接下来,我们需要自定义cell,在cell里添加所有的控件及设置控件的尺寸。

StatusCell.h

//
//  StatusCell.h
//  Weibo
//
//  Created by jiangys on 15/10/24.
//  Copyright © 2015年 Jiangys. All rights reserved.
//

#import <UIKit/UIKit.h>
@class StatusFrame;@interface StatusCell : UITableViewCell
@property (nonatomic, strong) StatusFrame *statusFrame;+ (instancetype)cellWithTableView:(UITableView *)tableView;
@end

View Code

StatusCell.m

//
//  StatusCell.m
//  Weibo
//
//  Created by jiangys on 15/10/24.
//  Copyright © 2015年 Jiangys. All rights reserved.
//

#import "StatusCell.h"
#import "Status.h"
#import "StatusFrame.h"
#import "User.h"
#import "UIImageView+WebCache.h"@interface StatusCell()/* 原创微博 */
/** 原创微博整体 */
@property (nonatomic, weak) UIView *originalView;
/** 头像 */
@property (nonatomic, weak) UIImageView *iconView;
/** 会员图标 */
@property (nonatomic, weak) UIImageView *vipView;
/** 配图 */
@property (nonatomic, weak) UIImageView *photosView;
/** 昵称 */
@property (nonatomic, weak) UILabel *nameLabel;
/** 时间 */
@property (nonatomic, weak) UILabel *timeLabel;
/** 来源 */
@property (nonatomic, weak) UILabel *sourceLabel;
/** 正文 */
@property (nonatomic, weak) UILabel *contentLabel;@end@implementation StatusCell/***  重写initWithStyle:reuseIdentifier:方法*  添加所有需要显示的子控件(不需要设置子控件的数据和frame,子控件要添加到contentView中)*  进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片)*/
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{if (self==[super initWithStyle:style reuseIdentifier:reuseIdentifier]) {/** 原创微博整体 */UIView *originalView = [[UIView alloc] init];originalView.backgroundColor = [UIColor whiteColor];[self.contentView addSubview:originalView];self.originalView = originalView;/** 头像 */UIImageView *iconView = [[UIImageView alloc] init];[originalView addSubview:iconView];self.iconView = iconView;/** 会员图标 */UIImageView *vipView = [[UIImageView alloc] init];vipView.contentMode = UIViewContentModeCenter;[originalView addSubview:vipView];self.vipView = vipView;/** 配图 */UIImageView *photosView = [[UIImageView alloc] init];[originalView addSubview:photosView];self.photosView = photosView;/** 昵称 */UILabel *nameLabel = [[UILabel alloc] init];nameLabel.font = StatusCellNameFont;[originalView addSubview:nameLabel];self.nameLabel = nameLabel;/** 时间 */UILabel *timeLabel = [[UILabel alloc] init];timeLabel.font = StatusCellTimeFont;timeLabel.textColor = [UIColor orangeColor];[originalView addSubview:timeLabel];self.timeLabel = timeLabel;/** 来源 */UILabel *sourceLabel = [[UILabel alloc] init];sourceLabel.font = StatusCellSourceFont;[originalView addSubview:sourceLabel];self.sourceLabel = sourceLabel;/** 正文 */UILabel *contentLabel = [[UILabel alloc] init];contentLabel.font = StatusCellContentFont;contentLabel.numberOfLines = 0;[originalView addSubview:contentLabel];self.contentLabel = contentLabel;}return self;
}- (void)setStatusFrame:(StatusFrame *)statusFrame
{_statusFrame = statusFrame;Status *status = self.statusFrame.status;User *user = status.user;/** 原创微博整体 */self.originalView.frame = statusFrame.originalViewF;/** 头像 */self.iconView.frame = statusFrame.iconViewF;[self.iconView sd_setImageWithURL:[NSURL URLWithString:user.profile_image_url] placeholderImage:[UIImage imageNamed:@"avatar_default_small"]];/** 会员图标 */if (user.isVip) {self.vipView.hidden = NO;self.vipView.frame = statusFrame.vipViewF;NSString *vipName = [NSString stringWithFormat:@"common_icon_membership_level%d", user.mbrank];self.vipView.image = [UIImage imageNamed:vipName];self.nameLabel.textColor = [UIColor orangeColor];} else {self.nameLabel.textColor = [UIColor blackColor];self.vipView.hidden = YES;}/** 配图 */self.photosView.frame = statusFrame.photosViewF;self.photosView.backgroundColor = [UIColor redColor];/** 昵称 */self.nameLabel.text = user.name;self.nameLabel.frame = statusFrame.nameLabelF;/** 时间 */self.timeLabel.text = status.created_at;self.timeLabel.frame = statusFrame.timeLabelF;/** 来源 */self.sourceLabel.text = status.source;self.sourceLabel.frame = statusFrame.sourceLabelF;/** 正文 */self.contentLabel.text = status.text;self.contentLabel.frame = statusFrame.contentLabelF;}+ (instancetype)cellWithTableView:(UITableView *)tableView
{static NSString *ID = @"status";StatusCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];if (cell == nil) {cell = [[StatusCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];}return cell;
}@end

View Code

3、最后,就是有首页里显示出cell。首页里,显示用到的MJRefresh刷新控件

//
//  HomeViewController.m
//  Weibo
//
//  Created by jiangys on 15/10/5.
//  Copyright (c) 2015年 Jiangys. All rights reserved.
//

#import "HomeViewController.h"
#import "Test1ViewController.h"
#import "DropdownMenu.h"
#import "TitleMenuViewController.h"
#import "TitleButton.h"
#import "Status.h"
#import "StatusFrame.h"
#import "MJRefresh.h"
#import "MJExtension.h"
#import "AccountTool.h"
#import "Account.h"
#import "HttpTool.h"
#import "StatusCell.h"
#import "User.h"@interface HomeViewController ()<DropdownMenuDelegate>/** 微博列表 (里面放的都是HWStatusFrame模型,一个StatusFrame对象就代表一条微博)*/
@property (nonatomic, strong) NSMutableArray *statusFrames;@end@implementation HomeViewController- (NSMutableArray *)statusFrames
{if (!_statusFrames) {self.statusFrames = [NSMutableArray array];}return _statusFrames;
}- (void)viewDidLoad {[super viewDidLoad];// 设置导航栏内容
    [self setupNav];// 获得用户信息(昵称)
    [self setupUserInfo];// 集成下拉刷新控件
    [self setupDownRefresh];// 集成上拉刷新控制
    [self setupUpRefresh];
}/***  集成下拉刷新控件*/
- (void)setupDownRefresh
{// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewStatus)];// 马上进入刷新状态
    [self.tableView.header beginRefreshing];
}- (void)setupUpRefresh
{// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreStatus)];
}- (void)loadNewStatus
{// 1.拼接请求参数Account *account = [AccountTool getAccount];NSMutableDictionary *params = [NSMutableDictionary dictionary];params[@"access_token"] = account.access_token;// 取出最前面的微博(最新的微博,ID最大的微博)StatusFrame *firstStatusF = [self.statusFrames firstObject];if (firstStatusF) {// 若指定此参数,则返回ID比since_id大的微博(即比since_id时间晚的微博),默认为0params[@"since_id"] = firstStatusF.status.idstr;}// 2.发送请求[HttpTool get:@"https://api.weibo.com/2/statuses/friends_timeline.json" params:params success:^(id json) {// YSLog(@"--json--%@",json);// 将 "微博字典"数组 转为 "微博模型"数组NSArray *newStatuses = [Status objectArrayWithKeyValuesArray:json[@"statuses"]];// 将 HWStatus数组 转为 HWStatusFrame数组NSArray *newFrames = [self stausFramesWithStatuses:newStatuses];// 将最新的微博数据,添加到总数组的最前面NSRange range = NSMakeRange(0, newFrames.count);NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];[self.statusFrames insertObjects:newFrames atIndexes:set];// 刷新表格
        [self.tableView reloadData];// 结束刷新
        [self.tableView.header endRefreshing];// 显示最新微博的数量
        [self showNewStatusCount:newStatuses.count];} failure:^(NSError *error) {YSLog(@"请求失败-%@", error);// 结束刷新刷新
        [self.tableView.header endRefreshing];}];
}/***  加载更多微博数据*/
- (void)loadMoreStatus
{// 1.拼接请求参数Account *account = [AccountTool getAccount];NSMutableDictionary *params = [NSMutableDictionary dictionary];params[@"access_token"] = account.access_token;// 取出最后面的微博(最新的微博,ID最大的微博)StatusFrame *lastStatusF = [self.statusFrames lastObject];if (lastStatusF) {// 若指定此参数,则返回ID小于或等于max_id的微博,默认为0。// id这种数据一般都是比较大的,一般转成整数的话,最好是long long类型long long maxId = lastStatusF.status.idstr.longLongValue - 1;params[@"max_id"] = @(maxId);}// 2.发送请求[HttpTool get:@"https://api.weibo.com/2/statuses/friends_timeline.json" params:params success:^(id json) {// 将 "微博字典"数组 转为 "微博模型"数组NSArray *newStatuses = [Status objectArrayWithKeyValuesArray:json[@"statuses"]];// 如果没有更多数据,隐藏if (newStatuses.count==0) {self.tableView.footer.hidden = YES;}// 将 Status数组 转为 StatusFrame数组NSArray *newFrames = [self stausFramesWithStatuses:newStatuses];// 将更多的微博数据,添加到总数组的最后面
        [self.statusFrames addObjectsFromArray:newFrames];// 刷新表格
        [self.tableView reloadData];// 结束footer刷新
        [self.tableView.footer endRefreshing];} failure:^(NSError *error) {YSLog(@"请求失败-%@", error);// 结束刷新
         [self.tableView.footer endRefreshing];}];
}/***  显示最新微博的数量**  @param count 最新微博的数量*/
- (void)showNewStatusCount:(NSUInteger)count
{// 1.创建labelUILabel *label = [[UILabel alloc] init];label.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"timeline_new_status_background"]];label.width = [UIScreen mainScreen].bounds.size.width;label.height = 35;// 2.设置其他属性if (count == 0) {label.text = @"没有新的微博数据,稍后再试";} else {label.text = [NSString stringWithFormat:@"共有%zd条新的微博数据", count];}label.textColor = [UIColor whiteColor];label.textAlignment = NSTextAlignmentCenter;label.font = [UIFont systemFontOfSize:16];// 3.添加label.y = 64 - label.height;// 将label添加到导航控制器的view中,并且是盖在导航栏下边
    [self.navigationController.view insertSubview:label belowSubview:self.navigationController.navigationBar];// 4.动画// 先利用1s的时间,让label往下移动一段距离CGFloat duration = 1.0; // 动画的时间[UIView animateWithDuration:duration animations:^{label.transform = CGAffineTransformMakeTranslation(0, label.height);} completion:^(BOOL finished) {// 延迟1s后,再利用1s的时间,让label往上移动一段距离(回到一开始的状态)CGFloat delay = 1.0; // 延迟1s// UIViewAnimationOptionCurveLinear:匀速[UIView animateWithDuration:duration delay:delay options:UIViewAnimationOptionCurveLinear animations:^{label.transform = CGAffineTransformIdentity;} completion:^(BOOL finished) {[label removeFromSuperview];}];}];// 如果某个动画执行完毕后,又要回到动画执行前的状态,建议使用transform来做动画
}/***  将Status模型转为StatusFrame模型*/
- (NSArray *)stausFramesWithStatuses:(NSArray *)statuses
{NSMutableArray *frames = [NSMutableArray array];for (Status *status in statuses) {StatusFrame *f = [[StatusFrame alloc] init];f.status = status;[frames addObject:f];}return frames;
}/***  设置导航栏内容*/
- (void)setupNav
{self.navigationItem.leftBarButtonItem=[UIBarButtonItem itemWithImage:@"navigationbar_friendsearch" highImage:@"navigationbar_friendsearch_highlighted" target:self action:@selector(friendSearch)];self.navigationItem.rightBarButtonItem=[UIBarButtonItem itemWithImage:@"navigationbar_pop" highImage:@"navigationbar_pop_highlighted" target:self action:@selector(pop)];/* 中间的标题按钮 */TitleButton *titleButton = [[TitleButton alloc] init];NSString *name = [AccountTool getAccount].name;[titleButton setTitle:name?name:@"首页" forState:UIControlStateNormal];// 监听标题点击
    [titleButton addTarget:self action:@selector(titleClick:) forControlEvents:UIControlEventTouchUpInside];self.navigationItem.titleView = titleButton;
}/***  标题点击*/
- (void)titleClick:(UIButton *)titleButton
{// 1.创建下拉菜单DropdownMenu *menu = [DropdownMenu menu];menu.delegate = self;// 2.设置内容TitleMenuViewController *vc = [[TitleMenuViewController alloc] init];vc.view.height = 150;vc.view.width = 150;menu.contentController = vc;// 3.显示
    [menu showFrom:titleButton];
}/***  获得用户信息(昵称)*/
- (void)setupUserInfo
{// 1.拼接请求参数Account *account = [AccountTool getAccount];NSMutableDictionary *params = [NSMutableDictionary dictionary];params[@"access_token"] = account.access_token;params[@"uid"] = account.uid;// 2.发送请求[HttpTool get:@"https://api.weibo.com/2/users/show.json" params:params success:^(id json) {// 标题按钮UIButton *titleButton = (UIButton *)self.navigationItem.titleView;// 设置名字User *user = [User objectWithKeyValues:json];[titleButton setTitle:user.name forState:UIControlStateNormal];// 存储昵称到沙盒中account.name = user.name;[AccountTool saveAccount:account];} failure:^(NSError *error) {YSLog(@"请求失败-%@", error);}];
}-(void)friendSearch
{}-(void)pop
{Test1ViewController *test1=[[Test1ViewController alloc]init];test1.title = @"测试2控制器";[self.navigationController pushViewController:test1 animated:YES];
}#pragma mark - HWDropdownMenuDelegate
/***  下拉菜单被销毁了*/
- (void)dropdownMenuDidDismiss:(DropdownMenu *)menu
{UIButton *titleButton = (UIButton *)self.navigationItem.titleView;titleButton.selected = NO;// 让箭头向下
}/***  下拉菜单显示了*/
- (void)dropdownMenuDidShow:(DropdownMenu *)menu
{UIButton *titleButton = (UIButton *)self.navigationItem.titleView;titleButton.selected = YES;// 让箭头向上
}#pragma mark - Table view data source
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return self.statusFrames.count;
}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{// 获得cellStatusCell *cell = [StatusCell cellWithTableView:tableView];// 给cell传递模型数据cell.statusFrame = self.statusFrames[indexPath.row];return cell;
}-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{StatusFrame *statusFrame=self.statusFrames[indexPath.row];return statusFrame.cellHeight;
}@end

最终效果如下:

章节源代码下载:http://pan.baidu.com/s/1c00SK1q

新浪微博Github:https://github.com/jiangys/Weibo

转载于:https://www.cnblogs.com/jys509/p/4907210.html

iOS 新浪微博-5.0 首页微博列表相关推荐

  1. iOS 新浪微博-5.2 首页微博列表_转发微博/工具栏

    继续于上一篇,还是做首页的功能,这一篇把剩下的首页继续完善. 看看上面的图片,分析: 1.转发微博里面的内容,和原创微博是一样的,由文字+配图组成.这应该放在一个UIView里处理. 2.工具栏也当成 ...

  2. IOS Swift 5.0 获取通讯录列表拨打电话

    一.创建项目 这个很简单,就不多说了 二.实现 UITableView 以及相关布局 也不复杂,不会的可以参考一下我的另一篇,都是最基础的 三.添加权限 获取通讯录数据需要添加请求访问通讯录的权限,第 ...

  3. 新浪微博客户端开发之授权登录+获取微博列表

    新浪微博客户端开发之授权登录+获取微博列表 闲篇: 最近实在是乱得不行,至于怎么乱我也不知该怎么说,那么久没发博客就证明了这点,一般如果小巫有做详尽的计划,并把时间投入到上面的话,我是可以用最短的时间 ...

  4. scrapy 爬取新浪微博 的微博列表及微博内容

    代码地址:GitHub 参考:博客 通过scrapy框架爬取指定账号的信息和微博 截止到目前(2019年01月15日)的微博账号粉丝排名: 爬取方法:提取网页版的微博接口 1.重写start_requ ...

  5. iOS 微信 7.0.16 内测更新!支持只删除聊天列表不删除聊天记录!附内测地址!

    Android 微信 7.0.19 刚刚更新,iOS 微信 7.0.16 也开始内测. 本次内测有哪些更新呢?我们一起来看看! 速览 新增聊天框"不显示"选项: 新增表情搜索: 视 ...

  6. 新浪微博OAuth2.0授权及使用python调用微博API

    通过调用新浪微博API获取数据时数组采集中一个很好的方法,为了获取较新的资讯数据内容,本文主要介绍新浪微博OAuth2.0授权机制.微博开发者平台的使用.python调用微博API等内容,文末提供测试 ...

  7. iOS 商城类 app 首页的实现

    2019独角兽企业重金招聘Python工程师标准>>> iOS 商城类 app 首页的实现 很多人做 iOS开发的人员都应该写过这样的界面,但是呢,具体怎么去优化写这样的界面是我们需 ...

  8. Android 仿微博列表视频(一),静音播放

    新浪微博.QQ空间等一些 APP 有这样的效果(比较常见,就不截视频了):在列表页刷到一个视频的内容,视频自动播放,但是没有声音,如果你正在播放音乐,当视频播放的时候,音乐不会停止:如果点击视频,就进 ...

  9. iOS 类似简单的第三方微博客户端,可进行登录微博浏览相关信息

    Demo地址:https://github.com/ChenNan-FRAM/Fenvo (如果你觉得有用麻烦star一下感激不尽) Fenvo Objective-C, iOS 类似简单的第三方微博 ...

最新文章

  1. 论文阅读笔记三十三:Feature Pyramid Networks for Object Detection(FPN CVPR 2017)
  2. 交叉编译inetutils并配置telnet服务
  3. C++——《算法分析与设计》实验报告——二分搜索算法
  4. PIL 学习笔记(1)
  5. mysql libs 5.1.73_【MySQL案例】mysql-libs-5.1.73-3.el6
  6. Q93:PLY文件对应图形法向量反向问题——以bunny10K为例
  7. XML可扩展语言的发展
  8. 第一章计算机基础知识作业答案,计算机基础作业题1答案
  9. Windows Sever(修改计算机名并加入工作组)
  10. 事件代理(事件委托)
  11. 个人电脑windows装青龙面板,本地运行,无需服务器,本人亲测成功
  12. python中search函数用法_查找匹配函数FIND和SEARCH的基本用法
  13. Arduino 光敏电阻
  14. 桥接,NAT,Host Only的区别
  15. 智能家居DIY系列之智能灯泡
  16. MathType如何导入word
  17. 东大22春电子政务X《电子政务》在线平时作业3参考非答案
  18. “贵系万花筒”:探秘清华计算机系背后的“酒井”文化
  19. 掘金万亿母婴市场,宝宝树价值在哪里? | 一点财经
  20. BUAA小型图书管理系统

热门文章

  1. A股上市公司营收预测
  2. java多线程及线程池使用
  3. Windows7下启用IIS配置ASP运行环境的详细方法----亲测有效
  4. IEEE TMM 2020:细化超分辨网络,解决上采样引起的振荡
  5. SonarQube 7.7 中文插件安装
  6. vs2019 使用Visual-Studio-Translator扩展工具
  7. 解决gedit打不开文件或者闪退问题
  8. 2022 个人目标日历定作工具 微信小程序源码
  9. android wear三星健康,安卓智能手表四种系统有何异同?千万别买到大号手环
  10. 仿闲鱼的搜索历史遇到的一些问题