iPhone/iOS开启个人热点的纵向适配小结

一.iPhone创建个人热点

iPhone/iOS双环上网,即iPhone通过创建个人热点(Personal Hotspot)实现共享上网,支持便携式Wi-Fi热点、蓝牙共享网络和USB共享网络。

1.若iPhone已开启了WiFi(和蓝牙),则直接创建成功。

其他设备可通过WiFi(或蓝牙)搜索热点名称并连接实现共享上网。

需要说明的是:苹果的蓝牙协议是封闭的,只支持苹果的设备(iPhone/iPad/iMac)间连接,无法与Android等设备的蓝牙进行发现配对!

2.若iPhone只开启了蓝牙,未开启WiFi,则提示

若选择【打开"Wi-Fi"】(Turn on Wi-Fi),则其他设备可通过WiFi搜索热点名称并连接实现共享上网。

若选择【仅蓝牙和USB】(Bluetooth and USB Only),则其他设备可通过蓝牙或USB连接到该iPhone搜索热点名称并连接实现共享上网。

3.若iPhone未开启蓝牙和WiFi,则提示

若选择【打开"Wi-Fi"和蓝牙】(Turn on Wi-Fi and Bluetooth),则其他设备可通过蓝牙/WiFi搜索热点名称并连接实现共享上网。

若选择【仅USB】(USB Only),则其他设备可通过USB连接到该iPhone搜索热点名称并连接实现共享上网。

二.iMac通过USB连接iPhone共享个人热点上网

当iPhone新建了个人热点,iMac(Mac OS X)通过USB连接上iPhone时,将自动连接上iPhone的个人热点(the first
1 Connection)。

在Mac/Xcode上调试iPhone真机时,若只想调试iPhone/Android连接个人热点的情形(以便测试有热点栏和无热点栏的情况),则可在Network Preferences中删除iPhone
USB
接口(interface),防止Mac自动通过USB连接上iPhone热点对调试造成干扰。

三.iPhone/iOS个人热点状态栏

iPhone作为个人热点且有连接时,系统状态栏下面会多一行热点连接提示栏"Personal Hotspot: * Connection",纵向会下压20pt;当所有连接都断开时,热点栏消失,纵向高度恢复正常。

1.系统状态栏

APP_STATUSBAR_HEIGHT=[UIApplication sharedApplication].statusBarFrame.size.height,包含热点栏(如有)高度。

// iOS系统版本

#define SYSTEM_VERSION 
  [[[UIDevice currentDevice] systemVersion] doubleValue]

// 标准系统状态栏高度

#define
SYS_STATUSBAR_HEIGHT                        20

// 热点栏高度

#define HOTSPOT_STATUSBAR_HEIGHT            20

// 导航栏(UINavigationController.UINavigationBar)高度

#define NAVIGATIONBAR_HEIGHT                44

// 工具栏(UINavigationController.UIToolbar)高度

#define TOOLBAR_HEIGHT                            
 44

// 标签栏(UITabBarController.UITabBar)高度

#define TABBAR_HEIGHT

44

// APP_STATUSBAR_HEIGHT=SYS_STATUSBAR_HEIGHT+[HOTSPOT_STATUSBAR_HEIGHT]

#define APP_STATUSBAR_HEIGHT                (CGRectGetHeight([UIApplication sharedApplication].statusBarFrame))

// 根据APP_STATUSBAR_HEIGHT判断是否存在热点栏

#define IS_HOTSPOT_CONNECTED                (APP_STATUSBAR_HEIGHT==(SYS_STATUSBAR_HEIGHT+HOTSPOT_STATUSBAR_HEIGHT)?YES:NO)

// 无热点栏时,标准系统状态栏高度+导航栏高度

#define NORMAL_STATUS_AND_NAV_BAR_HEIGHT    (SYS_STATUSBAR_HEIGHT+NAVIGATIONBAR_HEIGHT)

// 实时系统状态栏高度+导航栏高度,如有热点栏,其高度包含在APP_STATUSBAR_HEIGHT中。

#define STATUS_AND_NAV_BAR_HEIGHT      
           
 (APP_STATUSBAR_HEIGHT+NAVIGATIONBAR_HEIGHT)

2.UIViewController.view.bounds.height

  • SYSTEM_VERSION < 7.0,UIViewController.view.bounds.height包含导航栏高度,不包含系统状态栏高度,也不包含热点栏(如果有)。
  • SYSTEM_VERSION ≥ 7.0,UIViewController.view.bounds.height包含标准系统状态栏高度和导航栏高度,但不包含热点栏(如果有)。

也即当有热点栏时,UIViewController.view.bounds.height都自动扣除了热点栏的高度,iOS<7.0不包含标准系统状态栏,iOS≥7.0包含标准系统状态栏。

由于iOS7把整个屏幕高度(包括状态栏,不包括热点栏)都作为了视图控制器的有效高度,因此从iOS6升级到iOS7时,会出现视图整体上移了一个状态栏的高度(20pt),并和上层的状态栏交叠在一起。

解决方法:设置extendedLayoutIncludesOpaqueBars属性为NO,设置edgesForExtendedLayout为UIRectEdgeNone。

3.UIViewController适应热点栏示例代码

- (void)
viewWillAppear:(BOOL)animated

{

self.extendedLayoutIncludesOpaqueBars = NO;

self.edgesForExtendedLayout = UIRectEdgeNone;

}

// MyViewController接口继承自UIViewController

@interface MyViewController : UIViewController

// MyViewController* myViewController入栈

MyViewController* myViewController = [[MyViewController alloc] init];

[self.navigationController pushViewController:myViewController animated:YES];

- (id)init

{

// 初始非全屏

_bFullScreen = NO;

// 进入该UIViewController之前的状态

_lastStatusBarStyle = [[UIApplication sharedApplication] statusBarStyle];

_lastBarTranslucent = self.navigationController.navigationBar.translucent;

}

- (void) viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

if (_bFullScreen)

{

if (SYSTEM_VERSION >= 7.0)

{

self.extendedLayoutIncludesOpaqueBars = YES;

self.edgesForExtendedLayout = UIRectEdgeAll;

}

else

{

self.wantsFullScreenLayout = YES;

self.navigationController.navigationBar.translucent = YES; // iOS 6下保证导航栏透明

}

}

else

{

[[UIApplication sharedApplication] setStatusBarStyle:_lastStatusBarStyle];

if (SYSTEM_VERSION >= 7.0)

{

// 设置后:有个人热点连接时,UIViewController.view自动下移20;无个人热点连接时,UIViewController.view自动上移20

self.extendedLayoutIncludesOpaqueBars = NO;

self.edgesForExtendedLayout = UIRectEdgeNone;

}

else

{

self.wantsFullScreenLayout = NO;

self.navigationController.navigationBar.translucent = _lastBarTranslucent;

}

}

}

// 手动点击内容区域实现全屏

- (void)setFullScreen:(BOOL)bFull

{

_bFullScreen = bFull;

// 全屏(非全屏)隐藏(显示)系统状态栏

[[UIApplication sharedApplication] setStatusBarHidden:bFullScreen];

// 全屏(非全屏)隐藏(显示)顶部导航栏

[self.navigationController setNavigationBarHidden:bFullScreen animated:YES];

// 全屏(非全屏)隐藏(显示)底部工具栏

[self.navigationController setToolbarHidden:bFullScreen animated:YES];

// 下面计算Custom Content的Rect

if (!_supportFullScreen)

{

CGFloat contentSatrtY = 0;

if (IS_HOTSPOT_CONNECTED) { // iPhone4(s)-iOS6/iOS7屏幕坐标系下:hostView.frame={{0, 40}, {320, 440}}/{{0, 20}, {320, 460}}

contentSatrtY = STATUS_AND_NAV_BAR_HEIGHT;
// 84

if (SYSTEM_VERSION >= 7.0) { // 如果设置了edgesForExtendedLayout=UIRectEdgeNone

contentSatrtY -= HOTSPOT_STATUSBAR_HEIGHT;
// 64(有热点栏时,会自动下移20)

}

} else { // iPhone4(s)-iOS6/iOS7屏幕坐标系下:hostView.frame={{0, 20}, {320, 460}}/{{0, 0}, {320, 480}}

contentSatrtY = NORMAL_STATUS_AND_NAV_BAR_HEIGHT;
// 64

}

// contentSatrtY基于UIViewController.view所在的屏幕坐标系进行排版

contentRect = CGRectMake(0, contentSatrtY, hostView.width, SCREEN_HEIGHT-STATUS_AND_NAV_BAR_HEIGHT-TOOLBAR_HEIGHT);

}

else // 针对iOS6/7分别配置了wantsFullScreenLayout=YES/edgesForExtendedLayout=UIRectEdgeAll,全屏隐藏状态栏(包括热点栏)、导航栏和工具栏之后高度为SCREEN_HEIGHT。

{

contentRect = CGRectMake(0, 0, hostView.width, hostView.height);

}

}

#pragma mark UIApplicationWillChangeStatusBarFrameNotification

// 如有必要,需监听系统状态栏变更通知:UIApplicationWillChangeStatusBarFrameNotification

- (void)handleUIApplicationWillChangeStatusBarFrameNotification:(NSNotification*)notification

{

CGRect newStatusBarFrame = [(NSValue*)[notification.userInfo objectForKey:UIApplicationStatusBarFrameUserInfoKey] CGRectValue];

// 根据系统状态栏高判断热点栏的变动

BOOL bPersonalHotspotConnected = (CGRectGetHeight(newStatusBarFrame)==(SYS_STATUSBAR_HEIGHT+HOTSPOT_STATUSBAR_HEIGHT)?YES:NO);

CGPoint newCenter = CGPointZero;

CGFloat OffsetY = bPersonalHotspotConnected?+HOTSPOT_STATUSBAR_HEIGHT:-HOTSPOT_STATUSBAR_HEIGHT;

if (SYSTEM_VERSION >= 7.0) { // 对没有自动调整的部分二级、三级子View做必要的手动调整

newCenter = self.someSubView.center;

newCenter.y += OffsetY;

self.someSubView.center = newCenter;

} else { // Custom Content对应的view整体调整

newCenter = self.contentView.center;

newCenter.y += OffsetY;

self.contentView.center = newCenter; // contentView为Custom Content对应的view

}

}

@end

时间: 2024-08-24 09:02:53

iPhone/iOS开启个人热点的纵向适配小结的相关文章

iPhone/iOS开启个人热点的相关位置调整小结

冬至已到,圣诞将近,最近公司项目实在太多,三四个项目反复的切换真的让人焦头烂额,趁今天有点空,把维护的三个项目顺利送出,刚好可以缕缕思路,记录一下最近遇到的问题.说不着急那是假的,客户一天天的催的确实令人心烦意乱,但是回过头来想想也确实不易,所以还是说服自己认真对待他们反馈的一个个问题,尽量做到让他们满意也让自己满意.有句话怎么说来,终于完成了,还好我没放弃.哈哈,闲言不多讲,说一下最近遇到解决的一个问题吧,由热点引起状态栏位置变化而导致自定义底部栏位置错位的问题. 关于热点的帖子网上确实不少,

通过电脑系统开启无线热点

通过电脑系统开启无线热点·教程 现在,无线网络已成为我们惯用的上网手段,因为其方便快捷.当我们只有一台计算机能够联网时,我们会采取开启无线热点的方式,以便于更多的人能够连接网络得以上网.我们所熟悉的开启热点的方式有很多,比如在腾讯电脑管家里免费开启热点,使用360随身wifi等手段.那么不用借助这些软件,只依靠操作系统能否解决开启无线热点的问题呢? 接下来,我们就以Win7为例,给大家演示一下. 首先,为了验证无线热点的开启,我们先查看网络共享中心中的适配器,如下图所示: 接下来,我们打开运行窗

ios 开启线程定时请求某个方法

- (void)startLoop { [NSThread detachNewThreadSelector:@selector(loopMethod) toTarget:self withObject:nil]; } - (void)loopMethod { [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(requestIsHaveReview) userInfo:nil repeats:YE

iphone ios 如何使用gcd,block

iphone ios 如何使用gcd,block 转自:http://blog.sina.com.cn/s/blog_45e2b66c01010dhd.html 1.GCD之dispatch queue http://www.cnblogs.com/scorpiozj/archive/2011/07/25/2116459.html 2.iOS中GCD的魔力 http://blog.csdn.net/favormm/article/details/6453260 3.官方 ,内容真的很多 http

怎样在Win7系统建立并开启Wifi热点

http://jingyan.baidu.com/article/48a42057a03cf7a9242504d0.html还在担心手机卡流量太少了吗?不妨试试在Win7系统下建立并开启WiFi热点,有了WiFi,你就可以畅玩支持WiFi的移动设备了. 工具/原料 笔记本(Win7系统) WiFi设备 步骤/方法 1 首先,确定你的笔记本已经开启了无线. 点击电脑左下角的开始,在搜索程序和文件栏输入cmd. 2 在上图中找到Windows命令处理程序cmd.exe,右击选择以管理员身份运行. 3

iOS文字滚动效果 之纵向滚动

原文链接: iOS文字滚动效果 之纵向滚动 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://github.com/MajorLMJ iOS开发者公会-技术1群 QQ群号:87440292 iOS开发者公会-技术2群 QQ群号:232702419 iOS开发者公会-议事区   QQ群号:413102158

IOS 开启定位功能 CLLocationManager 介绍-简单使用

iOS 中的定位功能,主要在 CoreLocation库中,需要用到位置管理器 CLLocationManager 来完成绝大多数事情. 要使用 CLLocationManager 首先需要一个对象~ 以及对它进行简单的设置,最后开启定位功能, 就开始定位了,定位成功或者失败后都会调用代理方法返回信息 1 CLLocationManager *manger; 2 3 manger = [[CLLocationManager alloc] init]; //初始化 4 5 manger.deleg

iOS 键盘自适应(IQKeyboardManager)使用小结

IQKeyboardManager Github地址 经常在开发一个应用程序,我们遇到了一个问题,iPhone的键盘上滑覆盖的UITextField / UITextView.IQKeyboardManager可以防止键盘滑动问题和覆盖UITextField / UITextView无需你输入任何代码,不需要额外的设置要求.使用IQKeyboardManager你只需要添加源文件到你的项目. 主要特点 1)无代码 2)自动工作 3)没有更多的UIScrollView4)没有更多的子类 5)没有更

iOS开发系列之二 - UILabel 用法小结

// 初始化标签 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 100, 300, 150)]; // 设置标签文字 label.text = @"This is a test text.This is a test text.This is a test text."; // 设置标签文字字体 // 使用系统字体 label.font = [UIFont systemFontOfSize:20]; //