ios手机$alert 从右下方位置更改alert弹出框标题怎样解决

整理iOS9适配中出现的坑(图文)_iOS开发_动态网站制作指南
整理iOS9适配中出现的坑(图文)
来源:人气:956
本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的。9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级iOS9,也就逐渐的衍生出了一系列的问题,笔者也在赶忙为自己维护的App做适配,本文写的一些坑基本都是亲身体验了。
一、NSAransportSecurity
iOS9让所有的HTTP默认使用了HTTPS,原来的HTTP协议传输都改成TLS1.2协议进行传输。直接造成的情况就是App发请求的时候弹出网络无法连接。解决办法就是在项目的info.plist 文件里加上如下节点:
NSAppTransportSecurity -&NSAllowsArbitraryLoads
这个子节点的意思是:是否允许任性的加载?! 设为YES的话就将禁用了AppTransportSecurity转而使用用户自定义的设置,这个问题就解决了。
如果你不是在董铂然博客园看到本文,请。
上面说是苹果限制了HTTP协议,但是也并不是说所有的HTTPS都能完美适配iOS9了。
举个栗子,从app内起webView加载https的网页。新建个项目写几行起网页的代码
- (void)loadView{
UIWebView *web = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.view =
- (void)viewDidLoad {
[super viewDidLoad];
UIWebView *web = (UIWebView *)self. //董铂然
NSURL *url = [NSURL URLWithString:@"https://github.com/"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[web loadRequest:request];
中间的url就是我们想要加载的https地址,用https://baidu.com/ 和&https://github.com/ 分别试一下,结果不同
github的网页能打开,百度的网页打不开,下面打印了一行log
NSURL/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
原因是苹果的说首先必须要基于TLS 1.2版本协议。然后证书的加密的算法还需要达到SHA256或者更高位的RSA密钥或ECC密钥,如果不符合,请求将被中断并返回nil.
在浏览器中是可以直接查看这个网站的加密算法的,先点绿锁再点证书信息。
从右边两张图可以看出,github带RSA加密的SHA-256符合苹果的要求,所以才可以展示。
针对百度的情况可以在info.plist中配置如下,如果网站引用的比较多应该是需要针对每个网站进行配置。
NSAppTransportSecurity,NSExceptionDomains,NSIncludesSubdomains,NSExceptionRequiresForwardSecrecy,NSExceptionAllowInsecureHTTPLoads 写在下面便于复制。
其中的ForwardSecrecy理解为超前的密码保护算法,在里有写,一共是11种。配置完毕百度可以访问。
二、Bitcode
bitcode的理解应该是把程序编译成的一种过渡代码,然后苹果再把这个过渡代码编译成可执行的程序。bitcode也允许苹果在后期重新优化我们程序的二进制文件,有类似于App瘦身的思想。
用了xcode7的编译器编译之前没问题的项目可能会出现下列报错。
XXXX& does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
问题的原因是:某些第三方库还不支持bitcode。要不然是等待库的开发者升级了此项功能我们更新库,要不就是把这个bitcode禁用。
禁用的方法就是找到如下配置,选为NO.(iOS中bitcode是默认YES,watchOS中bitcodes是不让改的必须YES。)
三、设置信任
这一条只和企业级应用或inhose 有关,和AppStore渠道的应用无关。
在iOS8只是弹出一个窗问你是否需要让手机信任这个应用,但是在iOS9却直接禁止,如果真的想信任需要自己去手动开启。类似于Mac系统从未知开发者处下载的dmg直接打不开,然后要到系统偏好设置的安全性与隐私手动打开。 下图展示左边iOS8,右边iOS9
用户需要去 设置---》通用---》描述文件 里面自行添加信任。
这种问题的处理方法也就两种:1.提前周知暂时不要升级iOS9 &2.大多是公司员工使用的企业级应用,群发一个指导邮件。&
iOS8中,字体是Helvetica,中文的字体有点类似于&华文细黑&。只是苹果手机自带渲染,所以看上去可能比普通的华文细黑要美观。iOS9中,中文系统字体变为了专为中国设计的&苹方& 有点类似于一种字体&幼圆&。字体有轻微的加粗效果,并且最关键的是字体间隙变大了!
所以很多原本写死了width的label可能会出现&...&的情况。
&iOS9 蛋疼
上面这两张图也可以直观的看出同一个界面,同一个label的变化。
所以为了在界面显示上不出错,就算是固定长度的文字也还是建议使用sizetofit 或者ios向上取整 ceilf() 或者提前计算
CGSize size = [title sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}];
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
五、URL scheme
URL scheme一般使用的场景是应用程序有分享或跳其他平台授权的功能,分享或授权后再跳回来。
在iOS8并没有做过多限制,但是iOS9需要将你要在外部调用的URL scheme列为白名单,才可以完成跳转
如果iOS9没做适配 会报如下错误
canOpenURL: failed for URL : "mqzone://app" - error: "This app is not allowed to query for scheme mqzone"
具体的解决方案也是要在info.plist中设置 LSQueriesSchemes 类型为数组,下面添加所有你用到的scheme
六、statusbar
这个还好只是报一个警告,如果就是不管他,也不会出现问题。
&Error&: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
以前我们为了能够实时的控制顶部statusbar的样式,可能会在喜欢使用
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]
[[UIApplication sharedApplication]setStatusBarHidden:YES];
但是这么做之前需要将 info.plist 里面加上View controller-based status bar appearance &BOOL值设为NO,就是把控制器控制状态栏的权限给禁了,用UIApplication来控制。但是这种做法在iOS9不建议使用了,建议我们使用吧那个BOOL值设为YES,然后用控制器的方法来管理状态栏比如。
- (UIStatusBarStyle)eferredStatusBarStyle
return UIStatusBarStyleLightC
点进头文件可以验证刚才说法:
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController prefetatusBarHidden]");
七、didFinishLaunchingWithOptions
如果运行的时候报下列错误,那就是你的didFinishLaunchingWithOptions写的不对了
***** Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m:3294**
iOS9不允许在didFinishLaunchingWithOptions结束了之后还没有设置window的rootViewController。 也许是xcode7的编译器本身就不支持。
解决的方法当然就是先初始化个值,之后再赋值替换掉
UIWindow *window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];
window.rootViewController = [[UIViewController alloc]init];
八、tableView
虽然现在的iOS9已经推送正式版了,但是iOS9使用时还是会感觉到App比以前更加卡顿了,tableView拖动时卡顿显示的最为明显。 并且之前遇到一个bug,原本好的项目用xcode7一编译,tableView刷新出了问题 ,[tableView reloadData]无效 有一行cell明明改变了但是刷新不出来。 感觉可能是这个方法和某种新加的特性冲突了,猜测可能是reloadData的操作被推迟到下一个RunLoop执行最终失效。
解决的方法是,注释[tableView reloadData],改用局部刷新,问题居然就解决了。
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
九、NSLocalizableString(XCode7问题)
如果你程序启动后出现主页面一片空白,或是报了以下的栈调用错误。那就是NSLocalizableString的死循环导致堆栈溢出了。
#0 0x in -[NSLocalizableString length] ()
#1 0x003052cc in -[NSLocalizableString length] ()
#2 0x003052cc in -[NSLocalizableString length] ()
#3 0x003052cc in -[NSLocalizableString length] ()
#4 0x003052cc in -[NSLocalizableString length] ()
#5 0x003052cc in -[NSLocalizableString length] ()
#6 0x003052cc in -[NSLocalizableString length] ()
#7 0x003052cc in -[NSLocalizableString length] ()
#8 0x003052cc in -[NSLocalizableString length] ()
#9 0x003052cc in -[NSLocalizableString length] ()
#10 0x003052cc in -[NSLocalizableString length] ()
#11 0x003052cc in -[NSLocalizableString length] ()
#12 0x003052cc in -[NSLocalizableString length] ()
#13 0x003052cc in -[NSLocalizableString length] ()
#14 0x003052cc in -[NSLocalizableString length] ()
#15 0x003052cc in -[NSLocalizableString length] ()
#16 0x003052cc in -[NSLocalizableString length] ()
这个的解决方法就是找到特定的页面,然后将English 前面的勾勾上。
十、bundle identifier(Xcode7问题)
如果你遇到了在本地编译通过,但是在CI上打包失败。并且报的错误是和bundle identifier相关,那很有可能是你plist文件中写的bundle&identifier没有起作用。
因为xcode7新增了此功能,在target下面的BuildSetting里面增加了Product Bundle identifier。苹果之后的做法应该是推荐在此处设置bundle identifier,此处的设置会比info.plist里面优先读取。
如果你的Bundle identifier一直没变,可能不会发现此问题。如果改变了,你在plist中修改是无效的。
另一个做法就是在ci打包的配置Execute shell上增加以下代码
"Set :CFBundleIdentifier com.XXX.XXX" "XXX/Supporting Files/XXX-Info.plist"
十一、 ActionSheet
Actionsheet 在iOS8的时候改了一次版,当时是和AlertView二合一,并且以AlertViewController作为载体,之后再present出来,这在当时,苹果应该是想统一各个控件的展示方式,但是很多人可能并没有在意因为直接show那个方法并没有废除,大家都觉得应该是新旧都能用,再加上有的公司可能自己还做了一定扩展,诸多原因导致还是用的旧方法。
在iOS9上使用旧方法直接show,会出现左图的问题。如果用的是AlertViewController的方法则不会出现问题(右图)
我猜测可能是sheet的windowLevel比键盘低导致的。但是将优先级设到10000,然后显示在keyWindow上。
sheet.window.windowLevel = 10000;
[sheet showInView:[UIApplication sharedApplication].keyWindow];
然后没有效果,然后又查了下stackoverflow 有个方法能取出优先级最高的window
UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {
return win1.windowLevel - win2.windowL
}] lastObject];
试了下还是没有效果。 应该键盘的优先级无论如何都是最高的, 想盖在键盘上面的方法行不通。
当然,如果更换的成本比较大,也并不是没有办法,直接设置弹sheet之前收回键盘就好了。
如果你不是在董铂然博客园看到本文,请。&
暂时遇到这些问题,感觉iOS9的出现让所有iOS开发都是菊花一紧,预祝所有的iOS都能及时的做好适配改完bug,下个版本一上线,所有问题都解决。
优质网站模板拒绝访问 | www.jq22.com | 百度云加速
请打开cookies.
此网站 (www.jq22.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(43da7-ua98).
重新安装浏览器,或使用别的浏览器关于iOS App中自定义警告Alert类的弹窗的使用 - 简书
关于iOS App中自定义警告Alert类的弹窗的使用
最近项目不是很紧,把以前遇到的弹窗类的问题总结一下,以避免以后复习查看。(前面文字说明很长,看文章的可以跳过)
一般项目中使用的警告类弹窗是系统自带的UIAlertView 或者UIAlertController就能满足需求,但是其样式是固定的,修改起来比较的有局限性,但是设计师又不想使用这种系统的样式,那我们就只能按照设计师的要求去自定义Alert,那么问题就来了。o(╯□╰)o
如果涉及到网络,我们自定义的弹窗能满足项目的需要,往往也会伴随着Crash(具体情况下面说),安全这一块没有系统的Alert处理的好(大牛写的除外)
我们自定义的Alert没有很大的可扩展性,仅仅能满足自己的项目需要
打个广告我使用的可扩展比较强,非常好用Alert的应该属
,可以根据项目的需要进行自定义View,但是这依旧不能满足我们的设计师的眼光。?
还是乖乖的自定义Alert吧
上面说到了涉及到网络Crash的情况是这样的,我们自定义的Alert需要在一个页面的网络请求返回后弹出,这个时候我们Push或者Pressent到了另一个页面,刚好上个页面的请求返回了,就会出现在我们当前的页面,点击上面的按钮,Crash!!!
如何改进?
使用单利,就算在其他的页面弹出,起码不会造成崩溃
block回调(这种方法不适合我目前的项目)
让自定义的Alert只在显示的页面出现,(需要传进去当前Controller)
这里我就用单利写一个简单的Alert(Frame和按钮的个数 我就写死了)O(∩_∩)O哈哈~ 尴尬?
.h中方法声明
@interface CTTAlertView : UIView
+(id)shareI
-(void)showViewAtViewController:(UIViewController *)controller
withMessage:(NSString *)message
withCancel:(NSString *)cancel
withConfirm:(NSString *)
#import "CTTAlertView.h"
#define kAlertViewH 148.0
#define kAlertViewW 300.0
#define kMargin 10.0
#define kBtnW 100.0
#define kBtnH 22.0
#define kLeftMargin 16.0
#define kBottomMargin 13.0
@interface CTTAlertView ()
@property (nonatomic, strong) UIImageView *imgV
@property (nonatomic, strong) UIView *separatorV
@property (nonatomic, strong) UIView *alertV
@property (nonatomic, strong) UILabel *msgL
@property (nonatomic, strong) UIButton *cancelB
@property (nonatomic, strong) UIButton *confirmB
@implementation CTTAlertView
+(id)shareInstance {
static dispatch_once_t onceT
static CTTAlertView *instance =
dispatch_once(&onceToken, ^{
instance = [[CTTAlertView alloc] init];
-(instancetype)init {
self = [super init];
if (self) {
[self setupViews];
-(instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setupViews];
-(void)setupViews {
self.frame = CGRectMake(0, 0, KWIDTH, KHEIGHT);
self.backgroundColor = RGBACOLOR(0, 0, 0, .5);
//background image view
self.imgView = [[UIImageView alloc] initWithFrame:CGRectMake((KWIDTH - kAlertViewW) / 2.0, (KHEIGHT - kAlertViewH - 64.0) / 2.0, kAlertViewW, kAlertViewH)];
self.imgView.userInteractionEnabled = YES;
self.imgView.contentMode = UIViewContentModeScaleAspectF
self.imgView.image = [UIImage imageNamed:@"pop_alert_icon"];
[self addSubview:self.imgView];
self.alertView = [[UIView alloc] initWithFrame:CGRectMake(self.imgView.frame.origin.x + kMargin, self.imgView.frame.origin.y + kMargin, (kAlertViewW - kMargin * 2), (kAlertViewH - kMargin * 2))];
self.alertView.backgroundColor = [UIColor whiteColor];
self.alertView.layer.cornerRadius = 2.0;
self.alertView.layer.masksToBounds = YES;
[self addSubview:self.alertView];
CGFloat yOffset = self.alertView.frame.size.height - kBottomMargin - kBtnH;
UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
cancelBtn.frame = CGRectMake(kLeftMargin, yOffset, kBtnW, kBtnH);
[cancelBtn setTitleColor:kColor(153, 153, 153, 1)
forState:UIControlStateNormal];
cancelBtn.titleLabel.font = [Yi23Utils pingFangSCLightFont:14];
[cancelBtn addTarget:self
action:@selector(cancelBtnAction:)
forControlEvents:UIControlEventTouchUpInside];
[self.alertView addSubview:cancelBtn];
self.cancelBtn = cancelB
//confirm button
CGFloat xOffset = self.alertView.frame.size.width - kLeftMargin - kBtnW;
UIButton *confirmBtn = [UIButton buttonWithType:UIButtonTypeCustom];
confirmBtn.frame = CGRectMake(xOffset, yOffset, kBtnW, kBtnH);
[confirmBtn setTitleColor:KKhaki
forState:UIControlStateNormal];
confirmBtn.titleLabel.font = [Yi23Utils pingFangSCLightFont:14];
[confirmBtn addTarget:self
action:@selector(confirmBtnAction:)
forControlEvents:UIControlEventTouchUpInside];
[self.alertView addSubview:confirmBtn];
self.confirmBtn = confirmB
//separator line
UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake((self.alertView.frame.size.width - 1.0) / 2.0, self.alertView.frame.size.height - 17.0 - 15.0, 1.0, 17.0)];
separatorView.backgroundColor = kColor(0, 0, 0, 0.1);
[self.alertView addSubview:separatorView];
//message label
CGFloat labelW = self.alertView.frame.size.width - 8 * 2;
self.msgLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 8, labelW, 74.0)];
self.msgLabel.font = [UIFont systemFontOfSize:14];
self.msgLabel.textAlignment = NSTextAlignmentC
self.msgLabel.textColor = [UIColor blackColor];
self.msgLabel.numberOfLines = 0;
self.msgLabel.lineBreakMode = NSLineBreakByWordW
self.msgLabel.preferredMaxLayoutWidth = labelW;
[self.alertView addSubview:self.msgLabel];
-(void)showViewAtViewController:(UIViewController *)controller
withMessage:(NSString *)message
withCancel:(NSString *)cancel
withConfirm:(NSString *)confirm
UIView *bgView = (UIView *)controller.
[bgView addSubview:self];
[self.cancelBtn setTitle:cancel
forState:UIControlStateNormal];
[self.confirmBtn setTitle:confirm
forState:UIControlStateNormal];
self.msgLabel.text = (message == nil) ? @" " :
-(void)removeAlertViewFromSupview {
[self removeFromSuperview];
#pragma mark - ButtonAction
-(void)cancelBtnAction:(UIButton *)sender {
[self removeFromSuperview];
-(void)confirmBtnAction:(UIButton *)sender {
[self removeFromSuperview];
记录一下这个点,方便以后查看,如有代码有什么不妥,请留言多多指教。??
一个走在路上的程序员
效果图: 代码:.h中 typedef void(^SBBlock)(NSInteger num); @interface SBAlertView : UIView /** * 蒙版 */ @property (nonatomic,strong)UIView *blackV...
//设置尺寸为屏幕尺寸的时候self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; //随机数inputValues[i] = arc4random();//plist 加...
// // JackDateAndDateView.m // ZHB // // Created by JackRen on 16/5/10. // Copyright (C) 2016年 atense. All rights reserved. // #import &Jac...
*7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block或__weak给其重新命名一遍 写的方法 (1)Bolck 的实现:返回值(^名字)(形式参数……)=^返回值(实参……){代码,有返回值的话就返回}; (2)...
VLC的集成和使用 VLC介绍 VLC Media Player (VideoLAN) 为 Windows、Linux、OS X、Android、iOS、Windows Phone等平台提供一个视频播放器、解码器。它可以播放来自网络、摄像头、磁盘、光驱的文件,支持包括MPE...
文 | 一隻魚 玉兰,闻其名,就有一种清新脱俗感。玉者,玉洁冰清,洁白无瑕,浑然天成;兰者,兰心蕙质,幽香清远,纵使无人也自香。玉兰中我更偏爱白玉兰,诗人曾形容白玉兰“净若清荷尘不染, 色如白云美若仙,”正因为白玉兰有着这么一种净如清荷的优雅、美若白云的气韵,所以世人都对她...
嗨!你们可以叫我西红柿,或者粉碎。请多指教 说起“青春”,应该有很多人怀念吧!青春说风就是雨,说雨就是风。呵呵,我应该知足了吧!
我在世界最发达的顶端,总比那些无家可归的流浪狗好吧! 如果说我是平凡的,那...
【个人决定以单位名义将公款借给其他单位使用,虽在事后收受对方财物但难以证实借款当时具有谋取个人利益目的的行为定性】 【挪用公款罪受贿罪事后收受财物谋取个人利益】 【姚太文贪污、受贿案(《刑事审判参考》指导案例第805号)裁判摘要:个人决定以单位名义将公款借给其他单位使用,虽...
1 尹璐记不清是什么时候开始长智齿的了,只记得大三那年右半边脸生疼,当时以为是得了什么病,赖在宿舍两天没出门,到第三天疼得扛不住了,才去校医务室。 “要不要上点药?”一个戴着口罩...ios ios alertcontroller 怎么在视图的最上面弹出_百度知道
ios ios alertcontroller 怎么在视图的最上面弹出
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
UI是在主线程操作的,所以你可以在主线程去弹出alert,然后后台线程去做其他的,同时捕获后台线程的数据
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。iOS系统定位权限弹出框和跳转系统设置
1,该Alert为系统级别Alert,为系统控制弹出,弹出的触发条件为,在需要定位时,直接调用定位接口,系统判断当前定位总开关未开启,则会提示用户是否设置定位功能,用户点击后,跳转系统的定位设置页面,如图:
2,该Alert只能弹出提示两次。
(1)不管用户点击了“设置”还是“取消”按钮,当两次弹出后,以后即使系统级别的定位总开关没开启,也不会再次提示,要再次显示,需要卸载客户端,再次安装。
(2)对此APP的运行文件进行了深度解析查看,并没有找到在应用程序的doc或者tmp文件夹下有什么可以标记该状态的记录值,也就是说从系统级别用最高权限写入了App的配置文件。
(3)由于iOS程序的沙盒机制,该标记值我们无法通过代码逻辑进行改写,无法通过删除标记值的方式让这个Alert再次弹出。
3,该Alert中下部的提醒文字可以定制(如我定制成了:“XXX,我也可以把这显示出来了”),定制的方式是在配置的info.plist文件里边根据key来添加相应的多过语言即可
(NSLocationUsageDescription = XXXXXXX)
4,此Alert弹出的逻辑仅限为系统级别的定位服务未开启,而针对在定位服务中关闭特定应用的定位服务的业务,此Alert不会被触发和弹出。
进行授权判断的方式:只能根据定位服务返回的异常信息进行判断用户是否授权了应用程序是否有权限获取定位结果。
没有更多推荐了,

我要回帖

更多关于 alert 恢复弹出前样式 的文章

 

随机推荐