最终效果图:
iPad中重要的屏幕适配技巧,
先添加一个contentVIEw占位,
并且只在vIEwDIDLoad方法中设置frame,
因为iPad中无论横屏还是竖屏,W都是窄的那一条边,
因此,先添加一个contentVIEw到主控制器的右侧,
并让它随着主控制器宽高自动伸缩,
而子控制器的vIEw只需添加到contentVIEw中即可,x 0 y 0宽高就是contentVIEw的bounds
代码片段:
//// 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.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中子控制器的屏幕适配所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)