iOS-引导页

本文介绍了一个iOS应用中导航页的实现方法,包括如何在AppDelegate中初始化导航页,并通过宏判断是否为首次启动来展示引导页。同时,文章还详细解释了GuideView的创建过程及自适应屏幕尺寸的技术细节。

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

1.在appDlegate 中 初始化导航页

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    self.window = [[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]];

    self.window.backgroundColor = [UIColorwhiteColor];


    // 引导页

    if (![DEF_PERSISTENT_GET_OBJECT(@"showGuide")boolValue])  //DEF_PERSISTENT_GET_OBJECT 为.h 中的宏

//判断是不是第一次进入,一开始bool 给否   !否 == 真 则执行花括号中的内容,开始进行导航页布局

    {

//已进入导航页,立马把bool改为yes  下一次进入时   !真 == 假,则进入else中 

        DEF_PERSISTENT_SET_OBJECT([NSNumbernumberWithBool:YES],@"showGuide");

       GuideView *guide = [[GuideViewalloc] initWithFrame:self.window.bounds]; //初始化导航页

        

       __weak WMAppDelegate *weakSelf =self; //__weak  是为了防止在guide页面,会对weakSelf强引用,造成不能释放的奔溃

        guide.callBack = ^{

        //初始化抽屉效果 (这里是举个例子让它开始进行抽屉,现实是,启动app正常显示流程

            [weakSelfinitMMDrawer];

        };

        [self.windowaddSubview:guide];//把引导页加上去

    }

   else

    {

//这里是第二次进入时,直接初始化抽屉效果(现实是,启动app正常显示流程)

        [selfinitMMDrawer];

    }


2.   在.h 中定义宏

/**

 * 取出永久存储的对象

 *

 * @paramkey    所需对象对应的key

 * @returnkey所对应的对象

 */

#define DEF_PERSISTENT_GET_OBJECT(key) [[NSUserDefaults standardUserDefaults] objectForKey:key] 


3.导航页GuideView.h

/**

 *  App首次开机引导页

 */

@interface GuideView :UIScrollView  //注意这里一定是  UIScrollerView



@property (nonatomic,copy)void (^callBack)(void);


4.导航页GuideView.m

/**

 *  引导页张数

 */

#define DEF_GUIDE_COUNT 3


@implementation GuideView


- (id)initWithFrame:(CGRect)frame

{

   self = [superinitWithFrame:frame];

   if (self

    {

        self.contentSize =CGSizeMake(DEF_WIDTH(self)*DEF_GUIDE_COUNT,DEF_HEIGHT(self));

        self.backgroundColor = [UIColorblackColor];

        self.showsHorizontalScrollIndicator =NO;

       self.pagingEnabled =YES;

        self.backgroundColor = [UIColorclearColor];


       for (int i=0; i<DEF_GUIDE_COUNT; i++) 

        {

           UIImageView *imageView = [[UIImageViewalloc] initWithFrame:CGRectMake(DEF_WIDTH(self)*i,0, DEF_WIDTH(self),DEF_HEIGHT(self))];   //DEF_WIDTH & DEF_WIDTH 屏幕宽高下面写了


/*

/**

 * 获取视图宽度

 * @paramview 视图对象

 * @return宽度

 */

#define DEF_WIDTH(view) view.bounds.size.width


/**

 * 获取视图高度

 * @paramview 视图对象

 * @return高度

 */

#define DEF_HEIGHT(view) view.bounds.size.height


*/

            imageView.image = [UIImageimageWithContentsOfFile:[[[NSBundlemainBundle] bundlePath]stringByAppendingPathComponent:DEF_SCREEN_IS_640_1136?[NSStringstringWithFormat:@"Guide%d-568@2x.png",i]:[NSStringstringWithFormat:@"Guide%d@2x.png",i]]]; //DEF_SCREEN_IS_640_1136判断是否为640*1136


/**

 *  判断屏幕尺寸是否为640*1136

 * @return判断结果(YES: NO:不是)

 */

//#define DEF_SCREEN_IS_640_1136 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640,1136), [[UIScreen mainScreen] currentMode].size) : NO)


            [selfaddSubview:imageView];

            

           if (i == DEF_GUIDE_COUNT-1

            {

                //开始按钮,一般放在最后一张引导页上,frame大小自己根据需要进行调整

               UIButton *button = [[UIButtonalloc] initWithFrame:CGRectMake(0,0, DEF_WIDTH(self),DEF_HEIGHT(self))];

                [button setImage:[UIImageimageNamed:@""]forState:UIControlStateNormal];

                [button addTarget:selfaction:@selector(beginClick)forControlEvents:UIControlEventTouchUpInside];

                imageView.userInteractionEnabled =YES;

                [imageViewaddSubview:button];

            }

        }

    }

    return self;

}


#pragma mark - 点击事件

- (void)beginClick

{

   if (self.callBack) {

        

       self.callBack();

    }

    self.userInteractionEnabled =NO;

    [UIViewanimateWithDuration:0.3animations:^{

       self.alpha =0.0;

    }completion:^(BOOL finished) {

        [selfremoveFromSuperview];

    }];

}


5.根据屏幕高度不同,更改‘现在体验’按钮的位置

               

 CGRect rect = [[UIScreen mainScreenbounds];

                CGSize size = rect.size;

                CGFloat height = size.height;//拿到屏幕高度

                if (height == 480)

                {

                    //4/4s

                    [button setFrame:CGRectMake((DEF_WIDTH(self) - DEF_WIDTH(self)/2)/2 + 20 , DEF_HEIGHT(self)-120DEF_WIDTH(self)/2-4040)];

                }

                else if (height == 568)

                {

                //5/5s

                    [button setFrame:CGRectMake((DEF_WIDTH(self) - DEF_WIDTH(self)/2)/2 + 20 , DEF_HEIGHT(self)-140DEF_WIDTH(self)/2-4040)];


                }

                else if (height == 667)

                {

                //6

                [button setFrame:CGRectMake((DEF_WIDTH(self) - DEF_WIDTH(self)/2)/2 + 20 , DEF_HEIGHT(self)-160DEF_WIDTH(self)/2-4040)];

                }

                else if (height ==736)

                {

                    //6+

                    [button setFrame:CGRectMake((DEF_WIDTH(self) - DEF_WIDTH(self)/2)/2 + 20 , DEF_HEIGHT(self)-180DEF_WIDTH(self)/2-4040)];

                }

总结:应该是比较完善的一套了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值