当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS开发之路--微博新特性页面

iOS开发之路--微博新特性页面

2019年07月24日  | 移动技术网IT编程  | 我要评论

问谁是英雄火与风,梦想皇后,兰州扫黄

beyondappdelegate.m

//
// beyondappdelegate.m
// 20_帅哥no微博
//
// created by beyond on 14-8-3.
// copyright (c) 2014年 com.beyond. all rights reserved.
//

#import "beyondappdelegate.h"
#import "beyondviewcontroller.h"
#import "newfeatureviewcontroller.h"
#import "oauthviewcontroller.h"
#define kversioncodekey (nsstring *)kcfbundleversionkey
@implementation beyondappdelegate
// 应用最先执行的方法
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions
{
  // 1,创建窗口
  self.window = [[uiwindow alloc] initwithframe:[[uiscreen mainscreen] bounds]];
  // 2,设置窗口的背景色
  self.window.backgroundcolor = [uicolor whitecolor];
  // 3,调用自定义方法,判断是不是第一次使用本版本的app,如果是第一次使用,则将窗口的根控制器设为了newfeature控制器,否则 就直接让主控制器成为了窗口的根控制器
  [self versioncodecheck];
  // 4,让窗口可见
  [self.window makekeyandvisible];
  return yes;
}

// 自定义方法,判断是不是第一次使用本版本的app,如果是第一次使用,则将窗口的根控制器设为了newfeature控制器,否则 就直接让主控制器成为了窗口的根控制器
- (void)versioncodecheck
{
  // 1,使用用户偏好,从沙盒中取出旧的版本号

  nsstring *oldversioncode = [[nsuserdefaults standarduserdefaults] objectforkey:kversioncodekey];
  nsstring *currentversioncode = [[[nsbundle mainbundle]infodictionary] objectforkey:kversioncodekey];
 
  // 根据版本号的比较结果 进入不同的控制器
  //[self stepintoviewcontroller:currentversioncode oldversion:oldversioncode];
  //return;
  
#warning block test -===============以下内容,和其中调用的方法,仅用于block调用测试
  if ([currentversioncode isequaltostring:oldversioncode]) {
  //if(0){
    [self enterbeyondvc];
  } else {
    // 关键 ,并且保存版本号
    [[nsuserdefaults standarduserdefaults]setobject:currentversioncode forkey:kversioncodekey];
    
    // 进入新特性控制器
    newfeatureviewcontroller *newvc = [[newfeatureviewcontroller alloc]init];
    newvc.startblock = ^(bool isselected){
      log(@"%d",isselected);
      [self enterbeyondvc];
    };
    self.window.rootviewcontroller = newvc;
  }
}

#warning block test
- (void) enterbeyondvc
{
  // 1,如果进行过oauth授权,则直接进入主控制器,否则 进行oauth授权控制器
  if (1) {
    oauthviewcontroller *oauthvc = [[oauthviewcontroller alloc]init];
    self.window.rootviewcontroller = oauthvc;
    return;
  }
  
  
  // 进入主控制器
  beyondviewcontroller *vc =[[beyondviewcontroller alloc]init];
  self.window.rootviewcontroller = vc;
}

- (void)stepintoviewcontroller:(nsstring *)curversion oldversion:(nsstring *)oldversion
{
  // 比较新旧版本号
  uiviewcontroller *rootviewcontroller = nil;
#warning 测试新特性的view
  if ([curversion isequaltostring:oldversion]) {
   //  if (0){
    // 说明不是第一次运行,直接实例化主控制器,将主控制器设置为窗口的根控制器
    // 进入主控制器(主界面之前 先把状态栏,恢复) ios 7 无效
    // [[uiapplication sharedapplication] setstatusbarhidden:no withanimation:uistatusbaranimationfade];
    rootviewcontroller = [[beyondviewcontroller alloc]init];
  } else {
    // 说明是第一次运行,进入新特性控制器,将新特性控制器设置为窗口的根控制器,并且保存版本号
    // 进入新特性控制器(新特性界面之前 先把状态栏,隐藏) ios 7 无效
    // [uiapplication sharedapplication].statusbarhidden = yes;
    // [[uiapplication sharedapplication]setstatusbarhidden:yes withanimation:uistatusbaranimationslide];
    rootviewcontroller = [[newfeatureviewcontroller alloc]init];
    // 关键 ,并且保存版本号
    [[nsuserdefaults standarduserdefaults]setobject:curversion forkey:kversioncodekey];
  }
  // 设置窗口的根控制器,为相应的控制器
  self.window.rootviewcontroller = rootviewcontroller;
}
@end

newfeatureviewcontroller.h

//
// newfeatureviewcontroller.h
// 20_帅哥no微博
//
// created by beyond on 14-8-3.
// copyright (c) 2014年 com.beyond. all rights reserved.
// 只使用一次,版本新特性控制器,在第一次运行本版本时启用

#import <uikit/uikit.h>

@interface newfeatureviewcontroller : uiviewcontroller
// 定义一个block作为成员变量,点击开始按钮时,初始化主控制器,让其成为窗口的根控制器
// block用copy
@property (nonatomic,copy) void(^startblock)(bool isshare);
@end

newfeatureviewcontroller.m

//
// newfeatureviewcontroller.m
// 20_帅哥no微博
//
// created by beyond on 14-8-3.
// copyright (c) 2014年 com.beyond. all rights reserved.
// 只使用一次,版本新特性控制器,在第一次运行本版本时启用
/*
 写在前面:
 当一个控件不显示 的时候,检查下面三个属性:
 没有宽度和高度
 x y 坐标不正确
 没有添加到父控件中
 当一个控制不能点击的时候,检查下面个属性:
 自己的userinteraction = no
 父控件的userinteraction = no
 控件本身已经超出了它所在的控制器范围
 pagecontroller的高度不能更改,那么就可以置高度为0,其他控件同理
 
 4,居中显示 的标准步骤:先设置center,再设置bounds
 
 5,切换按钮图片可以通过切换按钮的状态来完成
 
 normal:普通
 highlighted : 高亮(人为长按的时候)
 disabled :失效(通过代码控制)
 selected : 选中 (通过代码控制)
 
 */
#import "newfeatureviewcontroller.h"

#define kpicnum 4

#warning viewsize 要改成kwinsize
#define viewsize self.view.bounds.size

@interface newfeatureviewcontroller ()<uiscrollviewdelegate>
{
  // 页面指示控制器
  uipagecontrol *_pagecontrol;
  
  // 因为开启按钮的点击事件中需要分享按钮的选中状态
  uibutton *_sharebtn;
}

@end

@implementation newfeatureviewcontroller

- (bool)prefersstatusbarhidden
{
  // 在loadview之前 还要先
  nslog(@"prefers bar hidden");
  return yes;
  
}

- (void)loadview
{
  nslog(@"load view");
  // 新特性,让imageview成为控制器的view,然后才再imageview上面添加一层scrollview
  uiimageview *imgview = [[uiimageview alloc]init];
  // 设置控制器view(即imgview)的尺寸为全屏
  imgview.frame = [uiscreen mainscreen].bounds;
  nslog(@"%@",nsstringfromcgrect(imgview.frame));
  // 使用分类中的方法,如果是iphone5,加载 -568h的图片
  imgview.image = [uiimage fullscrennimagenamed:@"new_feature_background.png"];
  
  // 让控制器的view可以与用户交互
  imgview.userinteractionenabled = yes;
  // 直接让imgeview成为控制器的view
  self.view = imgview;
}
- (void)viewdidload
{
  [super viewdidload];
  nslog(@"view did load ");

  // 1,调用自定义方法,加载uiscrollview,并且批量添加uiimageview,每个imageview中放一张图片
  [self adduiscrollview];
  
  // 2,调用自定义方法,加载uipagecontrol
  [self adduipagecontrol];
}

// 自定义方法,加载uiscrollview,并且批量添加uiimageview,每个imageview中放一张图片
- (void) adduiscrollview
{
  // 1.加载uiscrollview,并且批量添加uiimageview,每个imageview中放一张图片
  uiscrollview *scrollview = [[uiscrollview alloc] init];
  // 显示的可视区域大小
  scrollview.frame = self.view.bounds;
  // 水平滚动条
  scrollview.showshorizontalscrollindicator = no;
  // 按可视区域进行分页
  scrollview.pagingenabled = yes;
  // 滚动的范围
  scrollview.contentsize = cgsizemake(kpicnum * viewsize.width, 0);
  // 代理 可以监听滚动的各类事件
  scrollview.delegate = self;
  // 添加到self.view即imageview
  [self.view addsubview:scrollview];
  
  // 2,根据索引添加kpicnum张图片排列而成的kpicnum个imageview到scrollview里面
  for (int i = 0; i<kpicnum; i++) {
    [self addimageviewtoscrollview:scrollview atindex:i];
  }

}
// 自定义方法,加载uipagecontrol
- (void) adduipagecontrol
{
  // 1,加载uipagecontrol
  _pagecontrol = [[uipagecontrol alloc] init];
  // 居中最好是先设置center,再设置bounds
  _pagecontrol.center = cgpointmake(viewsize.width * 0.5, viewsize.height * 0.95);
  _pagecontrol.bounds = cgrectmake(0, 0, 100, 0);
  // 设置总页数
  _pagecontrol.numberofpages = kpicnum;
  // 重点~从图片中加载颜色 默认颜色和当前页的颜色
  _pagecontrol.pageindicatortintcolor = [uicolor colorwithpatternimage:[uiimage imagenamed:@"new_feature_pagecontrol_point.png"]];
  _pagecontrol.currentpageindicatortintcolor = [uicolor colorwithpatternimage:[uiimage imagenamed:@"new_feature_pagecontrol_checked_point.png"]];
  // 禁止默认的交互事件
  _pagecontrol.userinteractionenabled = no;
  // 添加到self.view即imageview
  [self.view addsubview:_pagecontrol];
}

// scrollview的代理方法,用于动态控制pagecontrol的当前圆点,滚动减速完毕就会调用(即scrollview静止)
- (void)scrollviewdidenddecelerating:(uiscrollview *)scrollview
{
  // 当前的第几页就是偏移的x除以单张宽度
  _pagecontrol.currentpage = scrollview.contentoffset.x / scrollview.frame.size.width;
}

// 自定义方法,根据索引添加kpicnum张图片排列而成的kpicnum个imageview到scrollview里面
- (void)addimageviewtoscrollview:(uiscrollview *)scrollview atindex:(int)i
{
  // 1.创建imageview
  uiimageview *imageview = [[uiimageview alloc] init];
  // 因为是一张张水平排列,所以根据索引计算 frame ,通过结构体必须强转为cgrect
  imageview.frame = (cgrect){{i * viewsize.width, 0} , viewsize};
  
  
  // 2.设置图片
  nsstring *name = [nsstring stringwithformat:@"new_feature_%d.png", i + 1];

  // 使用分类中的方法,如果是iphone5,加载 -568h的图片
  imageview.image = [uiimage fullscrennimagenamed:name];
  
  // 3.添加
  [scrollview addsubview:imageview];
  
  // 4.如果是最后一张图片,添加2个按钮(分享、开始)
  if (i == kpicnum - 1) {
    // 必须让最后一张imageview可以进行点击,这样它里面的2个按钮才可以点击
    imageview.userinteractionenabled = yes;
    
    
    // 最后一张图片页面,有两个按钮,一个是开始
    [self addstartbtninimageview:imageview];
    // 最后一张图片页面,有两个按钮,另一个是分享微博按钮,默认是选中状态
    [self addsharebtninimageview:imageview];
  }
}

// 最后一张图片页面,有两个按钮,一个是分享
- (void) addsharebtninimageview:(uiimageview *)imageview
{
  
  // 2.1.创建自定义样式的按钮
  _sharebtn = [uibutton buttonwithtype:uibuttontypecustom];
  // 添加到最后一张imageview里面
  [imageview addsubview:_sharebtn];
  
  // 2.2.设置按钮背景图片
  // 调用自己写的分类方法,设置按钮正常和高亮状态的背景图片,并且返回 图片的尺寸
  cgsize sharebtnnormalbgimgsize = [_sharebtn setbtnbgimgfornormalandselectedwithname:@"new_feature_share_false.png" selectedname:@"new_feature_share_true.png"];
  
  // 2.3.边框(居中,先center,后bounds)
  _sharebtn.center = cgpointmake(viewsize.width * 0.5, viewsize.height * 0.75);
  // 按钮宽高,就按背景图片宽高
  _sharebtn.bounds = (cgrect){cgpointzero, sharebtnnormalbgimgsize};
  
  // 2.4.监听
  [_sharebtn addtarget:self action:@selector(sharebtnclick:) forcontrolevents:uicontroleventtouchupinside];
  // 2.5.高亮状态下不要改变图片颜色
  _sharebtn.adjustsimagewhenhighlighted = no;
  // 2.6.默认选中
  _sharebtn.selected = yes;
  
}
// 分享按钮点击事件,只要切换不同的选中状态,就可以显示不同的两张图片(正常图片是不勾选,选中状态的图片是勾选)
- (void)sharebtnclick:(uibutton *)sharebtn
{
  sharebtn.selected = !sharebtn.isselected;
}
// 最后一张图片页面,有两个按钮,一个是开始
- (void) addstartbtninimageview:(uiimageview *)imageview
{
    
  // 1.1.创建开启按钮
  // 使用自定义样式
  uibutton *startbtn = [uibutton buttonwithtype:uibuttontypecustom];
  // 添加到最后一张imageview里面
  [imageview addsubview:startbtn];
  
  
  // 1.2.设置背景图片等个性样式
  // 调用自己写的分类方法,设置按钮正常和高亮状态的背景图片,并且返回 图片的尺寸
  cgsize startbtnbgimgsize = [startbtn setbtnbgimgfornormalandhighightedwithname:@"new_feature_finish_button.png"];
  // 1.3.边框
  startbtn.center = cgpointmake(viewsize.width * 0.5, viewsize.height * 0.85);
  // 按钮的宽高 与 背景图片的宽高一样大
  startbtn.bounds = (cgrect){cgpointzero, startbtnbgimgsize};
  
  // 1.4.监听
  [startbtn addtarget:self action:@selector(startbtnclick) forcontrolevents:uicontroleventtouchupinside];
  
}

// 点击开始按钮时,调用block完成,以下功能:初始化主控制器,让其成为窗口的根控制器
- (void)startbtnclick
{
  // 直接调用block (即另外一个类里面的一段代码来执行)
  if (_startblock) {
    _startblock(_sharebtn.isselected);
  }
}

@end

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网