IOS第三天-新浪微博 - 版本新特性,OAuth授权认证
*********版本新特性
#import "HWNewfeatureViewController.h" #import "HWTabBarViewController.h" #define HWNewfeatureCount 4 @interface HWNewfeatureViewController () <UIScrollViewDelegate> @property (nonatomic, weak) UIPageControl *pageControl; @property (nonatomic, weak) UIScrollView *scrollView; @end @implementation HWNewfeatureViewController - (void)viewDidLoad { [super viewDidLoad]; // 1.创建一个scrollView:显示所有的新特性图片 UIScrollView *scrollView = [[UIScrollView alloc] init]; scrollView.frame = self.view.bounds; [self.view addSubview:scrollView]; self.scrollView = scrollView; // 2.添加图片到scrollView中 CGFloat scrollW = scrollView.width; CGFloat scrollH = scrollView.height; for (int i = 0; i<HWNewfeatureCount; i++) { UIImageView *imageView = [[UIImageView alloc] init]; imageView.width = scrollW; imageView.height = scrollH; imageView.y = 0; imageView.x = i * scrollW; // 显示图片 NSString *name = [NSString stringWithFormat:@"new_feature_%d", i + 1]; imageView.image = [UIImage imageNamed:name]; [scrollView addSubview:imageView]; // 如果是最后一个imageView,就往里面添加其他内容 if (i == HWNewfeatureCount - 1) { [self setupLastImageView:imageView]; } } #warning 默认情况下,scrollView一创建出来,它里面可能就存在一些子控件了 #warning 就算不主动添加子控件到scrollView中,scrollView内部还是可能会有一些子控件 // 3.设置scrollView的其他属性 // 如果想要某个方向上不能滚动,那么这个方向对应的尺寸数值传0即可 scrollView.contentSize = CGSizeMake(HWNewfeatureCount * scrollW, 0); scrollView.bounces = NO; // 去除弹簧效果 scrollView.pagingEnabled = YES; scrollView.showsHorizontalScrollIndicator = NO; scrollView.delegate = self; // 4.添加pageControl:分页,展示目前看的是第几页 UIPageControl *pageControl = [[UIPageControl alloc] init]; pageControl.numberOfPages = HWNewfeatureCount; pageControl.backgroundColor = [UIColor redColor]; pageControl.currentPageIndicatorTintColor = HWColor(253, 98, 42); pageControl.pageIndicatorTintColor = HWColor(189, 189, 189); pageControl.centerX = scrollW * 0.5; pageControl.centerY = scrollH - 50; [self.view addSubview:pageControl]; self.pageControl = pageControl; // UIPageControl就算没有设置尺寸,里面的内容还是照常显示的 // pageControl.width = 100; // pageControl.height = 50; // pageControl.userInteractionEnabled = NO; // UITextField *text = [[UITextField alloc] init]; // text.frame = CGRectMake(10, 20, 100, 50); // text.borderStyle = UITextBorderStyleRoundedRect; // [self.view addSubview:text]; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { double page = scrollView.contentOffset.x / scrollView.width; // 四舍五入计算出页码 self.pageControl.currentPage = (int)(page + 0.5); // 1.3四舍五入 1.3 + 0.5 = 1.8 强转为整数(int)1.8= 1 // 1.5四舍五入 1.5 + 0.5 = 2.0 强转为整数(int)2.0= 2 // 1.6四舍五入 1.6 + 0.5 = 2.1 强转为整数(int)2.1= 2 // 0.7四舍五入 0.7 + 0.5 = 1.2 强转为整数(int)1.2= 1 } /** * 初始化最后一个imageView * * @param imageView 最后一个imageView */ - (void)setupLastImageView:(UIImageView *)imageView { // 开启交互功能 imageView.userInteractionEnabled = YES; // 1.分享给大家(checkbox) UIButton *shareBtn = [[UIButton alloc] init]; [shareBtn setImage:[UIImage imageNamed:@"new_feature_share_false"] forState:UIControlStateNormal]; [shareBtn setImage:[UIImage imageNamed:@"new_feature_share_true"] forState:UIControlStateSelected]; [shareBtn setTitle:@"分享给大家" forState:UIControlStateNormal]; [shareBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; shareBtn.titleLabel.font = [UIFont systemFontOfSize:15]; shareBtn.width = 200; shareBtn.height = 30; shareBtn.centerX = imageView.width * 0.5; shareBtn.centerY = imageView.height * 0.65; [shareBtn addTarget:self action:@selector(shareClick:) forControlEvents:UIControlEventTouchUpInside]; [imageView addSubview:shareBtn]; // shareBtn.backgroundColor = [UIColor redColor]; // shareBtn.imageView.backgroundColor = [UIColor blueColor]; // shareBtn.titleLabel.backgroundColor = [UIColor yellowColor]; // top left bottom right // EdgeInsets: 自切 // contentEdgeInsets:会影响按钮内部的所有内容(里面的imageView和titleLabel) // shareBtn.contentEdgeInsets = UIEdgeInsetsMake(10, 100, 0, 0); // titleEdgeInsets:只影响按钮内部的titleLabel shareBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0); // imageEdgeInsets:只影响按钮内部的imageView // shareBtn.imageEdgeInsets = UIEdgeInsetsMake(20, 0, 0, 50); // shareBtn.titleEdgeInsets // shareBtn.imageEdgeInsets // shareBtn.contentEdgeInsets // 2.开始微博 UIButton *startBtn = [[UIButton alloc] init]; [startBtn setBackgroundImage:[UIImage imageNamed:@"new_feature_finish_button"] forState:UIControlStateNormal]; [startBtn setBackgroundImage:[UIImage imageNamed:@"new_feature_finish_button_highlighted"] forState:UIControlStateHighlighted]; startBtn.size = startBtn.currentBackgroundImage.size; startBtn.centerX = shareBtn.centerX; startBtn.centerY = imageView.height * 0.75; [startBtn setTitle:@"开始微博" forState:UIControlStateNormal]; [startBtn addTarget:self action:@selector(startClick) forControlEvents:UIControlEventTouchUpInside]; [imageView addSubview:startBtn]; } - (void)shareClick:(UIButton *)shareBtn { // 状态取反 shareBtn.selected = !shareBtn.isSelected; } - (void)startClick { // 切换到HWTabBarController /* 切换控制器的手段 1.push:依赖于UINavigationController,控制器的切换是可逆的,比如A切换到B,B又可以回到A 2.modal:控制器的切换是可逆的,比如A切换到B,B又可以回到A 3.切换window的rootViewController */ UIWindow *window = [UIApplication sharedApplication].keyWindow; window.rootViewController = [[HWTabBarViewController alloc] init]; // modal方式,不建议采取:新特性控制器不会销毁 // HWTabBarViewController *main = [[HWTabBarViewController alloc] init]; // [self presentViewController:main animated:YES completion:nil]; } - (void)dealloc { HWLog(@"HWNewfeatureViewController-dealloc"); } /* 1.程序启动会自动加载叫做Default的图片 1> 3.5inch 非retain屏幕:Default.png 2> 3.5inch retina屏幕:Default@2x.png 3> 4.0inch retain屏幕: Default-568h@2x.png 2.只有程序启动时自动去加载的图片, 才会自动在4inch retina时查找-568h@2x.png */ /* 一个控件用肉眼看不见,有哪些可能 1.根本没有创建实例化这个控件 2.没有设置尺寸 3.控件的颜色跟父控件的背景色一样(实际上已经显示了,只不过用肉眼看不见) 4.透明度alpha <= 0.01 5.hidden = YES 6.没有添加到父控件中 7.被其他控件挡住了 8.位置不对 9.父控件发生了以上情况 10.特殊情况 * UIImageView没有设置image属性,或者设置的图片名不对 * UILabel没有设置文字,或者文字颜色和跟父控件的背景色一样 * UITextField没有设置文字,或者没有设置边框样式borderStyle * UIPageControl没有设置总页数,不会显示小圆点 * UIButton内部imageView和titleLabel的frame被篡改了,或者imageView和titleLabel没有内容 * ..... 添加一个控件的建议(调试技巧): 1.最好设置背景色和尺寸 2.控件的颜色尽量不要跟父控件的背景色一样 */ @end
**********HWNewfeatureViewController .h
#import <UIKit/UIKit.h> @interface HWNewfeatureViewController : UIViewController @end
************OAuth授权认证
#import "HWOAuthViewController.h" #import "AFNetworking.h" @interface HWOAuthViewController () <UIWebViewDelegate> @end @implementation HWOAuthViewController - (void)viewDidLoad { [super viewDidLoad]; // 1.创建一个webView UIWebView *webView = [[UIWebView alloc] init]; webView.frame = self.view.bounds; webView.delegate = self; [self.view addSubview:webView]; // 2.用webView加载登录页面(新浪提供的) // 请求地址:https://api.weibo.com/oauth2/authorize /* 请求参数: client_id true string 申请应用时分配的AppKey。 redirect_uri true string 授权回调地址,站外应用需与设置的回调地址一致,站内应用需填写canvas page的地址。 */ NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/oauth2/authorize?client_id=3235932662&redirect_uri=http://"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [webView loadRequest:request]; } #pragma mark - webView代理方法 - (void)webViewDidFinishLoad:(UIWebView *)webView { // HWLog(@"----webViewDidFinishLoad"); } - (void)webViewDidStartLoad:(UIWebView *)webView { // HWLog(@"----webViewDidStartLoad"); } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // 1.获得url NSString *url = request.URL.absoluteString; // 2.判断是否为回调地址 NSRange range = [url rangeOfString:@"code="]; if (range.length != 0) { // 是回调地址 // 截取code=后面的参数值 int fromIndex = range.location + range.length; NSString *code = [url substringFromIndex:fromIndex]; // 利用code换取一个accessToken [self accessTokenWithCode:code]; } return YES; } /** * 利用code(授权成功后的request token)换取一个accessToken * * @param code 授权成功后的request token */ - (void)accessTokenWithCode:(NSString *)code { /* URL:https://api.weibo.com/oauth2/access_token 请求参数: client_id:申请应用时分配的AppKey client_secret:申请应用时分配的AppSecret grant_type:使用authorization_code redirect_uri:授权成功后的回调地址 code:授权成功后返回的code */ // 1.请求管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; // mgr.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN的AFJSONResponseSerializer默认不接受text/plain这种类型 // 2.拼接请求参数 NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"client_id"] = @"3235932662"; params[@"client_secret"] = @"227141af66d895d0dd8baca62f73b700"; params[@"grant_type"] = @"authorization_code"; params[@"redirect_uri"] = @"http://"; params[@"code"] = code; // 3.发送请求 [mgr POST:@"https://api.weibo.com/oauth2/access_token" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { HWLog(@"请求成功-%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { HWLog(@"请求失败-%@", error); }]; } @end
***
#import <UIKit/UIKit.h> @interface HWOAuthViewController : UIViewController @end
没有失败, 只有放弃...