iOS_21团购_iPad中子控制器的屏幕适配

iOS_21团购_iPad中子控制器的屏幕适配,第1张

概述最终效果图: iPad中重要的屏幕适配技巧, 先添加一个contentView占位, 并且只在viewDidLoad方法中设置frame, 因为iPad中无论横屏还是竖屏,W都是窄的那一条边, 因此,先添加一个contentView到主控制器的右侧, 并让它随着主控制器宽高自动伸缩, 而子控制器的view只需添加到contentView中即可,x 0 y 0宽高就是contentView的boun

最终效果图:







iPad中重要的屏幕适配技巧,

先添加一个contentVIEw占位,

并且只在vIEwDIDLoad方法中设置frame,

因为iPad中无论横屏还是竖屏,W都是窄的那一条边,

因此,先添加一个contentVIEw到主控制器的右侧,

并让它随着主控制器宽高自动伸缩,

而子控制器的vIEw只需添加到contentVIEw中即可,x 0 y 0宽高就是contentVIEwbounds



代码片段:

////  MainVIEwController.m//  帅哥_团购////  Created by beyond on 14-8-13.//  copyright (c) 2014年 com.beyond. All rights reserved.//  主控制器,左侧是dock,右侧是子控制器#import "MainVIEwController.h"#import "Dock.h"#import "DockDelegate.h"// 自定义的导航器#import "BeyondNavigationController.h"// dock上面的【四个】按钮对应的控制器#import "DealListController.h"#import "MapController.h"#import "CollectionController.h"#import "mineController.h"@interface MainVIEwController ()<DockDelegate>{    // 重要的屏幕适配技巧,先添加一个contentVIEw占位,并且只在vIEwDIDLoad方法中设置frame,因为iPad中无论横屏还是竖屏,W都是窄的那一条边,因此,先添加一个contentVIEw到主控制器的右侧,并让它随着主控制器宽高自动伸缩,而子控制器的vIEw只需添加到contentVIEw中即可,x 0 y 0 宽高就是contentVIEw的bounds    UIVIEw *_contentVIEw;}@end@implementation MainVIEwController- (voID)vIEwDIDLoad{    [super vIEwDIDLoad];    log(@"%@",NsstringFromCGRect(self.vIEw.frame));    self.vIEw.backgroundcolor = [UIcolor whitecolor];    // 1.添加Dock到主控制器    [self addDock];    // 2.重要的屏幕适配技巧,x 0 y 0 宽高就是contentVIEw的bounds    [self addContentVIEw];        // 3.添加所有的子控制器,共4个,与dock里面的最上面4个tab按钮相对应    [self addAllChildControllers];        }// 1.添加Dock到主控制器- (voID)addDock{    Dock *dock = [[Dock alloc] init];    // dock内部设置了高度和右间距,自动拉伸,宽度也重写了setFrame固定为100    dock.frame = CGRectMake(0,self.vIEw.frame.size.height);    // dock内部的栏目被点击的时候,可以调用代理的方法(block效果也一样)    dock.delegate = self;    [self.vIEw addSubvIEw:dock];}// 1-1,实现dock的代理方法- (voID)dock:(Dock *)dock tabChangeFromIndex:(int)fromIndex toIndex:(int)toIndex{    log(@"%d--点击了-%d",fromIndex,toIndex);    // 1.先移除旧的子控制器(导航包装了的)    UIVIEwController *oldVC = self.childVIEwControllers[fromIndex];    [oldVC.vIEw removeFromSupervIEw];        // 2.添加新的子控制器(导航包装了的)    UIVIEwController *newVC = self.childVIEwControllers[toIndex];    // 3.子控制器的vIEw直接添加到了contentVIEw,并宽高自动伸缩,占满contentVIEw,即可完成竖屏与横屏适配    newVC.vIEw.autoresizingMask = UIVIEwautoresizingFlexibleHeight | UIVIEwautoresizingFlexibleWIDth;    // 占满contentVIEw,即可完成竖屏与横屏适配    newVC.vIEw.frame = _contentVIEw.bounds;    [_contentVIEw addSubvIEw:newVC.vIEw];    }// 2.重要的屏幕适配技巧,x 0 y 0 宽高就是contentVIEw的bounds- (voID)addContentVIEw{    // 添加contentvIEw到主控制器的右侧    _contentVIEw = [[UIVIEw alloc] init];    // 宽为主控制器的宽 - dock宽    CGfloat contentVIEwW = self.vIEw.frame.size.wIDth - kDockItemW;    // 高度为控制器的高    CGfloat contentVIEwH = self.vIEw.frame.size.height;    // 重要,宽和高都自动伸缩    _contentVIEw.autoresizingMask = UIVIEwautoresizingFlexibleHeight | UIVIEwautoresizingFlexibleWIDth;    // 仅要在vIEw DID Load时候,设置一次contentVIEw的frame即可    _contentVIEw.frame = CGRectMake(kDockItemW,contentVIEwW,contentVIEwH);    [self.vIEw addSubvIEw:_contentVIEw];}// 3.添加所有的子控制器,与dock里面的最上面4个tab按钮相对应- (voID)addAllChildControllers{    // 1.团购_子控制器    DealListController *dealVC = [[DealListController alloc] init];    dealVC.vIEw.backgroundcolor = [UIcolor purplecolor];    BeyondNavigationController *nav = [[BeyondNavigationController alloc] initWithRootVIEwController:dealVC];    [self addChildVIEwController:nav];        // 2.地图_子控制器    MapController *mapVC = [[MapController alloc] init];    mapVC.vIEw.backgroundcolor = [UIcolor yellowcolor];    nav = [[BeyondNavigationController alloc] initWithRootVIEwController:mapVC];    [self addChildVIEwController:nav];        // 3.收藏_子控制器    CollectionController *collectionVC = [[CollectionController alloc] init];    collectionVC.vIEw.backgroundcolor = [UIcolor greencolor];    nav = [[BeyondNavigationController alloc] initWithRootVIEwController:collectionVC];    [self addChildVIEwController:nav];        // 4.我的_子控制器    mineController *mineVC = [[mineController alloc] init];    mineVC.vIEw.backgroundcolor = [UIcolor bluecolor];    nav = [[BeyondNavigationController alloc] initWithRootVIEwController:mineVC];    [self addChildVIEwController:nav];        // 5.并手动调用dock的代理方法,默认选中团购_子控制器    [self dock:nil tabChangeFromIndex:0 toIndex:0];}@end


用到的自定义导航控制器:

////  BeyondNavigationController.m//  帅哥_团购////  Created by beyond on 14-8-14.//  copyright (c) 2014年 com.beyond. All rights reserved.//#import "BeyondNavigationController.h"@interface BeyondNavigationController ()@end@implementation BeyondNavigationController// 优化,第一次使用该类,实例化对象的时候调用,且只会调用一次+ (voID)initialize{    // 1.appearance方法返回一个导航栏的全局的外观对象    // 修改了这个外观对象,相当于修改了整个项目中的外观    UINavigationbar *navibar = [UINavigationbar appearance];        // 2.设置导航栏的背景图片(从中心拉伸一个像素)    [navibar setBackgroundImage:[UIImage image@R_863_4041@Withname:@"bg_navigation.png"] forbarMetrics:UIbarMetricsDefault];        // 3.设置导航栏文字的主题    [navibar setTitleTextAttributes:@{                                  NSForegroundcolorAttributename : [UIcolor blackcolor],NSShadowAttributename : [NSValue valueWithUIOffset:UIOffsetZero]                                  }];        // 4.同理,修改所有UIbarbuttonItem的全局外观    UIbarbuttonItem *barBtnItem = [UIbarbuttonItem appearance];    // 修改item的背景图片    [barBtnItem setBackgroundImage:[UIImage image@R_863_4041@Withname:@"bg_navigation_right.png"] forState:UIControlStatenormal barMetrics:UIbarMetricsDefault];    [barBtnItem setBackgroundImage:[UIImage image@R_863_4041@Withname:@"bg_navigation_right_hl.png"] forState:UIControlStateHighlighted barMetrics:UIbarMetricsDefault];        // 修改item上面的文字样式    NSDictionary *dict = @{                           NSForegroundcolorAttributename : [UIcolor darkGraycolor],NSShadowAttributename : [NSValue valueWithUIOffset:UIOffsetZero],NSFontAttributename : [UIFont systemFontOfSize:16]                           };    [barBtnItem setTitleTextAttributes:dict forState:UIControlStatenormal];    [barBtnItem setTitleTextAttributes:dict forState:UIControlStateHighlighted];        // 5.设置状态栏样式    [UIApplication sharedApplication].statusbarStyle = UIStatusbarStylelightContent;}@end



Dock视图

////  Dock.m//  帅哥_团购////  Created by beyond on 14-8-13.//  copyright (c) 2014年 com.beyond. All rights reserved.//  主控制器左侧是dock,右侧是与dock栏目相对应的子控制器#import "Dock.h"// dock最下方的更多按钮#import "DockItemmore.h"// dock下面倒数第2个【定位】按钮#import "DockItemLocation.h"//  dock最上方的四个按钮(团购,地图,收藏,我的)都使用本类的实例#import "DockItemTab.h"#include "DockDelegate.h"@interface Dock(){    // dock最上方的四个按钮(团购,我的)中被点亮变白色的那一个(即被选中的那一个,图片设置是disable状态为白色)    DockItemTab *_currentTab;}@end@implementation Dock- (ID)initWithFrame:(CGRect)frame{    self = [super initWithFrame:frame];    if (self) {        // 1,设置dock永远在主控制器的左侧,以及背景        [self setDockpositionAndBg];        // 2.添加dock顶部的团购logo        [self addlogo];        // 3.添加dock最下面的【更多】按钮        [self addMoreBtn];        // 4.添加dock下面倒数第2个【定位】按钮        [self addLocationBtn];        // 5.添加dock最上方的四个按钮(团购,我的)        [self addFourTabBtn];    }    return self;}// 1,以及背景- (voID)setDockpositionAndBg{    // 1.让dock可以自动伸缩(高度 + 右边间距)    self.autoresizingMask = UIVIEwautoresizingFlexibleHeight | UIVIEwautoresizingFlexibleRightmargin;        // 2.设置dock背景颜色,用图片进行平铺    self.backgroundcolor = [UIcolor colorWithPatternImage:[UIImage imagenamed:@"bg_tabbar.png"]];}// 2.添加dock顶部的团购logo- (voID)addlogo{    UIImageVIEw *logo = [[UIImageVIEw alloc] init];    logo.image = [UIImage imagenamed:@"ic_logo.png"];    // 设置尺寸    CGfloat scale = 0.65;    CGfloat logoW = logo.image.size.wIDth * scale;    CGfloat logoH = logo.image.size.height * scale;    // 居中,先设置宽高,再设置中心点XY    logo.bounds = CGRectMake(0,logoW,logoH);    // 设置位置    logo.center = CGPointMake(kDockItemW*0.5,kDockItemH*0.5);    [self addSubvIEw:logo];}// 3.添加dock最下面的【更多】按钮- (voID)addMoreBtn{    DockItemmore *moreBtn = [[DockItemmore alloc] init];    CGfloat y = self.frame.size.height - kDockItemH;    // 因为moreBtn按钮是自动伸缩的,一直在dock的最底部,并且其父类已经在内部固定好了宽高    moreBtn.frame = CGRectMake(0,y,0);    [self addSubvIEw:moreBtn];}// 4.添加dock下面倒数第2个【定位】按钮- (voID)addLocationBtn{    DockItemLocation *locBtn = [[DockItemLocation alloc] init];    // 因为locBtn按钮是自动伸缩的,一直在dock的底部的倒数第2个,并且其父类已经在内部固定好了宽高    CGfloat y = self.frame.size.height - kDockItemH * 2;    locBtn.frame = CGRectMake(0,0);    //    loc.enabled = NO;    [self addSubvIEw:locBtn];}// 5.添加dock最上方的四个按钮(团购0,地图1,收藏2,我的3)-(voID)addFourTabBtn{    // 1.使用抽取的方法添加一个TabBtn(团购)    [self addOneTabBtn:@"ic_deal.png" selectedIcon:@"ic_deal_hl.png" index:0];        // 2.使用抽取的方法添加一个TabBtn(地图)    [self addOneTabBtn:@"ic_map.png" selectedIcon:@"ic_map_hl.png" index:1];        // 3.使用抽取的方法添加一个TabBtn(收藏)    [self addOneTabBtn:@"ic_collect.png" selectedIcon:@"ic_collect_hl.png" index:2];        // 4.使用抽取的方法添加一个TabBtn(我的)    [self addOneTabBtn:@"ic_mine.png" selectedIcon:@"ic_mine_hl.png" index:3];        // 5.添加标签底部的分隔线    UIImageVIEw *divIDerimgVIEw = [[UIImageVIEw  alloc] init];    divIDerimgVIEw.frame = CGRectMake(0,kDockItemH * 5,kDockItemW,2);    divIDerimgVIEw.image = [UIImage imagenamed:@"separator_tabbar_item.png"];    [self addSubvIEw:divIDerimgVIEw];}// 5-1,使用抽取的方法添加一个TabBtn(团购0,我的3),参数index决定y值- (voID)addOneTabBtn:(Nsstring *)iconname selectedIcon:(Nsstring *)selectedIconname index:(int)index{    // (团购,我的)TabBtn使用同一个父类,它们只是Y值不同    DockItemTab *tab = [[DockItemTab alloc] init];    // 设置按钮背景和选中的图片    [tab setIcon:iconname selectedIcon:selectedIconname];    tab.frame = CGRectMake(0,kDockItemH * (index+1),0);    // 因为是选项卡,只要用户手指tap一下就触发    [tab addTarget:self action:@selector(tabBtnClick:) forControlEvents:UIControlEventtouchDown];    // tag 0 1 2 3  (团购0,我的3)    tab.tag = index;    [self addSubvIEw:tab];    // 默认选中index == 0的这个 (团购0,我的3)    if (index == 0) {        [self tabBtnClick:tab];    }}// 5-2,因为是dock添加了tab,所以dock担当起监听tab的点击的任务,同时,又是主控制器添加了dock,所以主控制器就必须成为dock的代理,dock通知其代理,告诉代理,它内部的tab被人点击了- (voID)tabBtnClick:(DockItemTab *)tab{    // 0.因为要传两个tag,必须先通知dock的代理(因为dock是添加到了主控制器,所以dock的代理就是主控制器)    if ([_delegate respondsToSelector:@selector(dock:tabChangeFromIndex:toIndex:)]) {        // 调用代理的方法,相当于通知代理,self dock里面的按钮从哪一个切换到了哪一个        [_delegate dock:self tabChangeFromIndex:_currentTab.tag toIndex:tab.tag];    }    // 1.控制状态    // 先把上一个置灰,因为图片设置是enable状态是黑色    _currentTab.enabled = YES;    // 再把被点的这一个置白,图片设置是disable状态下为高亮白色    tab.enabled = NO;    // 最后把这一个被点击的按钮置为当前    _currentTab = tab;}#pragma mark 1,重写setFrame方法:内定自己的宽度,防止外部更改宽高- (voID)setFrame:(CGRect)frame{    frame.size.wIDth = kDockItemW;    [super setFrame:frame];}@end
总结

以上是内存溢出为你收集整理的iOS_21团购_iPad中子控制器的屏幕适配全部内容,希望文章能够帮你解决iOS_21团购_iPad中子控制器的屏幕适配所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1088690.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存