app ios 设置全屏
2018-04-16 18:34:00 weixin_33744141 阅读数 7

场景一 : 如果自定义了系统导航栏的返回按钮, 系统的左侧边缘返回手势将会失效

解决思路如下:
  • UINavigationController的属性中, 系统的返回手势是 interactivePopGestureRecognizer 这个手势所处理的
  • 一旦在某个页面自定义了系统导航栏的返回按钮, interactivePopGestureRecognizer 就会让当前页面的左侧边缘返回手势失效, 但是其他使用系统返回按钮的页面依然可以右滑返回, 所以系统做了特殊处理
  • 而这种情况是由 interactivePopGestureRecognizerdelegate 所导致的
  • 解决方式是只要设置 interactivePopGestureRecognizerdelegatenil, 如果自定义了系统导航栏的返回按钮, 当前页面也可以右滑返回
  • 需要注意的是, 当UINavigationController 只有一个子控制器时 , 这时如果在屏幕左侧边缘触发右滑手势, app 将会卡住无法响应, 这是因为 interactivePopGestureRecognizerdeleagete此时不能为nil , 需要delegate 来处理这种特殊的情况
  • 自定义一个UINavigationController的子类, 在子类内部做特殊处理
代码如下:
#import "NavViewController.h"

@interface NavViewController ()<UINavigationControllerDelegate>

/** tz_PopDelegate */
@property (nonatomic, strong) id tz_PopDelegate;

@end

@implementation NavViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //保存 interactivePopGestureRecognizer 的delegate
    self.tz_PopDelegate = self.interactivePopGestureRecognizer.delegate;
    self.delegate = self;   
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    NSLog(@"控制器个数: %ld",self.childViewControllers.count);
        self.interactivePopGestureRecognizer.enabled = YES;
    if (viewController == self.viewControllers[0]) {  //如果是在首页,设置interactivePopGestureRecognizer的delegate
        self.interactivePopGestureRecognizer.delegate = self.tz_PopDelegate; // 不支持侧滑
    } else { //如果是二级页面, 设置 interactivePopGestureRecognizer的代理为nil, 支持侧滑
        self.interactivePopGestureRecognizer.delegate = nil; // 支持侧滑
    }
}

@end

场景二 : 系统默认的侧滑返回手势, 只能在左侧边缘右滑触发, 而现在很多app 都有全屏返回这个需求

解决方法:
  • 使用Runtime+KVC 分析 UINavigationControllerinteractivePopGestureRecognizer 属性, 打印 interactivePopGestureRecognizer这个对象
#import "NavViewController2.h"

@interface NavViewController2 ()

@end

@implementation NavViewController2

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"手势 : \n%@", self.interactivePopGestureRecognizer);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
  • 打印结果
手势 : 
<
UIScreenEdgePanGestureRecognizer: 0x7f9def50ee30;
state = Possible; 
delaysTouchesBegan = YES; 
view = <UILayoutContainerView 0x7f9def602b10>; 
target= <(
                    action=handleNavigationTransition:,
                    target=<_UINavigationInteractiveTransition 0x7f9def50c760>
                )>
>
  • 可以发现, interactivePopGestureRecognizer 其实是UIScreenEdgePanGestureRecognizer的一个实例
  • 查看UIScreenEdgePanGestureRecognizer的头文件, 可以发现有一个属性
//
//  UIScreenEdgePanGestureRecognizer.h
//  Copyright (c) 2012-2017 Apple Inc. All rights reserved.
//

#import <UIKit/UIGeometry.h>
#import <UIKit/UIPanGestureRecognizer.h>

NS_ASSUME_NONNULL_BEGIN

/*! This subclass of UIPanGestureRecognizer only recognizes if the user slides their finger
    in from the bezel on the specified edge. */
NS_CLASS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED @interface UIScreenEdgePanGestureRecognizer : UIPanGestureRecognizer
@property (readwrite, nonatomic, assign) UIRectEdge edges; //< The edges on which this gesture recognizes, relative to the current interface orientation
@end

NS_ASSUME_NONNULL_END
  • 但是直接修改edges这个属性并不能扩大手势响应范围
  • 上面的打印结果中, 有个属性是我们所需要的
target= <(
                    action=handleNavigationTransition:,
                    target=<_UINavigationInteractiveTransition 0x7f9def50c760>
                )>
  • 但是直接通过KVC获取这个属性程序会崩溃, 因为interactivePopGestureRecognizer这个对象中并不存在target这个属性
  • 通过Runtime打印interactivePopGestureRecognizer的所有属性, 结果如下:
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"手势 : %@", self.interactivePopGestureRecognizer);
    
    unsigned int count = 0;
    Ivar *var = class_copyIvarList([UIGestureRecognizer class], &count);
    for (int i = 0; i < count; i++) {
        Ivar aVar = *(var + i);
        NSLog(@"成员变量类型%d: %s", i,ivar_getTypeEncoding(aVar));
        NSLog(@"成员变量名%d: %s",i,ivar_getName(aVar));
    }
}
2018-04-17 10:58:53.095436+0800 ATest[1487:44665] 成员变量名0: _gestureFlags
2018-04-17 10:58:53.095597+0800 ATest[1487:44665] 成员变量类型1: @"NSMutableArray"
2018-04-17 10:58:53.095835+0800 ATest[1487:44665] 成员变量名1: _targets
2018-04-17 10:58:53.095989+0800 ATest[1487:44665] 成员变量类型2: @"NSMutableArray"
2018-04-17 10:58:53.096124+0800 ATest[1487:44665] 成员变量名2: _delayedTouches
2018-04-17 10:58:53.096228+0800 ATest[1487:44665] 成员变量类型3: @"NSMutableArray"
2018-04-17 10:58:53.096341+0800 ATest[1487:44665] 成员变量名3: _delayedPresses
2018-04-17 10:58:53.096466+0800 ATest[1487:44665] 成员变量类型4: @"UIView"
2018-04-17 10:58:53.096892+0800 ATest[1487:44665] 成员变量名4: _view
2018-04-17 10:58:53.097113+0800 ATest[1487:44665] 成员变量类型5: d
2018-04-17 10:58:53.097449+0800 ATest[1487:44665] 成员变量名5: _lastTouchTimestamp
2018-04-17 10:58:53.097763+0800 ATest[1487:44665] 成员变量类型6: d
2018-04-17 10:58:53.098047+0800 ATest[1487:44665] 成员变量名6: _firstEventTimestamp
2018-04-17 10:58:53.098333+0800 ATest[1487:44665] 成员变量类型7: q
2018-04-17 10:58:53.098614+0800 ATest[1487:44665] 成员变量名7: _state
2018-04-17 10:58:53.098872+0800 ATest[1487:44665] 成员变量类型8: q
2018-04-17 10:58:53.099156+0800 ATest[1487:44665] 成员变量名8: _allowedTouchTypes
2018-04-17 10:58:53.099388+0800 ATest[1487:44665] 成员变量类型9: q
2018-04-17 10:58:53.099604+0800 ATest[1487:44665] 成员变量名9: _initialTouchType
2018-04-17 10:58:53.099885+0800 ATest[1487:44665] 成员变量类型10: @"NSMutableSet"
2018-04-17 10:58:53.100095+0800 ATest[1487:44665] 成员变量名10: _internalActiveTouches
2018-04-17 10:58:53.100408+0800 ATest[1487:44665] 成员变量类型11: @"_UIForceLevelClassifier"
2018-04-17 10:58:53.100660+0800 ATest[1487:44665] 成员变量名11: _forceClassifier
2018-04-17 10:58:53.100925+0800 ATest[1487:44665] 成员变量类型12: q
2018-04-17 10:58:53.101146+0800 ATest[1487:44665] 成员变量名12: _requiredPreviewForceState
2018-04-17 10:58:53.101982+0800 ATest[1487:44665] 成员变量类型13: @"_UITouchForceObservable"
2018-04-17 10:58:53.102227+0800 ATest[1487:44665] 成员变量名13: _touchForceObservable
2018-04-17 10:58:53.102449+0800 ATest[1487:44665] 成员变量类型14: @"NSObservation"
2018-04-17 10:58:53.102747+0800 ATest[1487:44665] 成员变量名14: _touchForceObservableAndClassifierObservation
2018-04-17 10:58:53.103067+0800 ATest[1487:44665] 成员变量类型15: @"NSMutableArray"
2018-04-17 10:58:53.103271+0800 ATest[1487:44665] 成员变量名15: _forceTargets
2018-04-17 10:58:53.103465+0800 ATest[1487:44665] 成员变量类型16: Q
2018-04-17 10:58:53.103784+0800 ATest[1487:44665] 成员变量名16: _forcePressCount
2018-04-17 10:58:53.104055+0800 ATest[1487:44665] 成员变量类型17: @"NSObservationSource"
2018-04-17 10:58:53.104353+0800 ATest[1487:44665] 成员变量名17: _beganObservable
2018-04-17 10:58:53.104579+0800 ATest[1487:44665] 成员变量类型18: @"NSMutableSet"
2018-04-17 10:58:53.104839+0800 ATest[1487:44665] 成员变量名18: _failureRequirements
2018-04-17 10:58:53.105092+0800 ATest[1487:44665] 成员变量类型19: @"NSMutableSet"
2018-04-17 10:58:53.105312+0800 ATest[1487:44665] 成员变量名19: _failureDependents
2018-04-17 10:58:53.105589+0800 ATest[1487:44665] 成员变量类型20: @"NSMutableSet"
2018-04-17 10:58:53.105847+0800 ATest[1487:44665] 成员变量名20: _activeEvents
2018-04-17 10:58:53.106136+0800 ATest[1487:44665] 成员变量类型21: B
2018-04-17 10:58:53.106677+0800 ATest[1487:44665] 成员变量名21: _keepTouchesOnContinuation
2018-04-17 10:58:53.107423+0800 ATest[1487:44665] 成员变量类型22: @"<UIGestureRecognizerDelegate>"
2018-04-17 10:58:53.107614+0800 ATest[1487:44665] 成员变量名22: _delegate
2018-04-17 10:58:53.107885+0800 ATest[1487:44665] 成员变量类型23: @"NSArray"
2018-04-17 10:58:53.108180+0800 ATest[1487:44665] 成员变量名23: _allowedPressTypes
2018-04-17 10:58:53.108481+0800 ATest[1487:44665] 成员变量类型24: @"NSString"
2018-04-17 10:58:53.108730+0800 ATest[1487:44665] 成员变量名24: _name
2018-04-17 10:58:53.109045+0800 ATest[1487:44665] 成员变量类型25: @"UIGestureEnvironment"
2018-04-17 10:58:53.109347+0800 ATest[1487:44665] 成员变量名25: _gestureEnvironment
  • 可以发现, interactivePopGestureRecognizer这个对象中有_targets这个可变数组, 这是我们想要的
  • 打印_targets变量
    //打印_tagets
    NSMutableArray * _targets = [self.interactivePopGestureRecognizer valueForKey:@"targets"];
    NSLog(@"_targets == %@",_targets);
    NSLog(@"_targets[0] == %@",_targets[0]);
 _targets == (
    "(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7ffa6ec03560>)"
)
2018-04-17 11:13:33.695306+0800 ATest[1617:52185] _targets[0] == (action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7ffa6ec03560>)
  • 可以发现, _targets这个数组中的元素是 target-action这种格式的, 可以猜测系统的手势中, 是通过一个对象来保存手势的taget 和这个taget对应的action的, 并把这个对象添加到_targets这个数组中保存起来, 通过断点调试得到保存target-action的是UIGestureRecognizerTarget这个私有类
  • 最终解决方法如下:
@interface NavViewController2 () <UIGestureRecognizerDelegate>
@property (nonatomic, weak) UIPanGestureRecognizer *popRecognizer;

@end

@implementation NavViewController2

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 注意 : 要让interactivePopGestureRecognizer失效
    self.interactivePopGestureRecognizer.enabled = NO;
    
    //自定义pan手势
    UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizer alloc] init];
    popRecognizer.delegate = self;
    popRecognizer.maximumNumberOfTouches = 1;
    [self.interactivePopGestureRecognizer.view addGestureRecognizer:popRecognizer];
    
    NSMutableArray *_targets = [self.interactivePopGestureRecognizer valueForKey:@"_targets"];
    
    //获取保存target-action的对象, 是私有类 UIGestureRecognizerTarget 的实例
    id gestureRecognizerTarget = [_targets firstObject];
    
    //获取UIGestureRecognizerTarget中保存的target, 是私有类_UINavigationInteractiveTransition的实例
    id interactiveTransition = [gestureRecognizerTarget valueForKey:@"_target"];
    
    //获取UIGestureRecognizerTarget中保存的action, 是interactiveTransition中响应手势的方法
    SEL handleTransition = NSSelectorFromString(@"handleNavigationTransition:");
    
    //绑定taget-action
    [popRecognizer addTarget:interactiveTransition action:handleTransition];
}

#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    /**
     *  这里有两个条件不允许手势执行:
     *  1、当前控制器为根控制器;
     *  2、如果这个push、pop动画正在执行(私有属性)
     */
    return self.viewControllers.count != 1 && ![[self valueForKey:@"_isTransitioning"] boolValue];
}

@end
  • 现在, 我们的app就支持丝滑的全屏返回手势了
  • 还可以发现一个有趣的东西, 执行以下打印:
NSLog(@"\ninteractivePopGestureRecognizer.delegate:\n%@\ninteractiveTransition:\n%@",self.interactivePopGestureRecognizer.delegate, interactiveTransition);
    NSLog(@"-----------------------------------------");
NSLog(@"\ninteractivePopGestureRecognizer.view:\n%@\nself.view:\n%@",self.interactivePopGestureRecognizer.view, self.view);
2018-04-17 11:59:32.095941+0800 ATest[2222:78230] 
interactivePopGestureRecognizer.delegate:
<_UINavigationInteractiveTransition: 0x7fadf3404690>
interactiveTransition:
<_UINavigationInteractiveTransition: 0x7fadf3404690>
2018-04-17 11:59:32.096143+0800 ATest[2222:78230] -----------------------------------------
2018-04-17 11:59:32.096798+0800 ATest[2222:78230] 
interactivePopGestureRecognizer.view:
<UILayoutContainerView: 0x7fadf3602b60; frame = (0 0; 375 667); autoresize = W+H; gestureRecognizers = <NSArray: 0x60400024f0c0>; layer = <CALayer: 0x60000003c140>>
self.view:
<UILayoutContainerView: 0x7fadf3602b60; frame = (0 0; 375 667); autoresize = W+H; gestureRecognizers = <NSArray: 0x60400024f0c0>; layer = <CALayer: 0x60000003c140>>
  • 可以看到, self.interactivePopGestureRecognizer.delegate 跟我们辛辛苦苦才获得的interactiveTransition原来是同个对象, 这样我们可以直接使用self.interactivePopGestureRecognizerdelegate作为自定义手势的target
  • 同样的, self.interactivePopGestureRecognizer.view其实就是UINavigationControllerview, 所以可以对我们上面的viewDidLoad代码做下简化
- (void)viewDidLoad {
    [super viewDidLoad];
    // 注意 : 要让interactivePopGestureRecognizer失效
    self.interactivePopGestureRecognizer.enabled = NO;
    //自定义pan手势
    UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizer alloc] init];
    popRecognizer.delegate = self;
    popRecognizer.maximumNumberOfTouches = 1;
    [self.view addGestureRecognizer:popRecognizer];
    
    //获取action
    SEL handleTransition = NSSelectorFromString(@"handleNavigationTransition:");
    //绑定taget-action
    [popRecognizer addTarget:self.interactivePopGestureRecognizer.delegate action:handleTransition];  
}
运行, 效果是一样的
2018-03-29 21:15:36 lyxleft 阅读数 1433

要让APP在iPhone X上变成全面屏显示(占满整个屏幕),而不是上下有没用的黑条,其实很容易,只需要:

LaunchImage 中添加一个和 iPhone X 相关的启动图片

即一张尺寸:1125 * 2436 的启动图片,让UI小姐姐帮忙切一张就好了。或自己用“预览”-“工具”-“调整大小”来简单制作一个测试下。

添加之后,对launchImage - show in finder,找到contents.json文件,添加如下这段代码。

{
    "extent" : "full-screen",
    "idiom" : "iphone",
    "subtype" : "2436h",
    "filename" : "forIPX.png",
    "minimum-system-version" : "11.0",
    "orientation" : "portrait",
    "scale" : "3x"
}

forIPX是我起的图片的名字,可改。

上述代码段如果插在中间的话,别忘了结尾逗号隔开。

然后回到Xcode,重新运行APP,你就发现在iPhone X上变成全屏啦~

如果你原本写的tabbar、导航栏等不能自动适配iPhone X,那么请看这篇博文:

https://blog.csdn.net/chenyblog/article/details/77987751

2012-08-15 12:54:15 wswqiang 阅读数 1043
1:在 ios app 中 调用系统 功能时,如 摄像头/照片库,里面 button 上的 文字 一般是 英文的
如果要修改成中文的,plist 文件中做如下设置
Localization native development region  —— China 
Localized resources can be mixed —— YES
2015-12-26 11:14:05 cj772728583 阅读数 2361
刚接触ios开发的童鞋应该会对于app版本号吗有些疑问,因为target不仅仅在summary中有版本号,同样在Info.plist等地方也有版本号码的地方,一头乱码,不知吗?其实xcode在summary中已经将app最基本的设置进行了全面的封装,其余的plist,build setting等地方会跟着summary设置的改变而改变。


Bundle display name     app名字   在plist 中加一个  字符串



一个version,一个build,都是设置版本的地方,有什么区别呢? 

在ios中(Android等工程中也一样),有两种version,一种是 CFBundleVersion ("Bundle Version"),也就是我们看到的version,另一种是CFBundleShortVersionString ("Bundle version string, short"),也就是我们看到的Build。

普通情况下,我们只使用version即可,设置为"1.0", "1.1", "2.0" , etc,但如果你要使用两个版本号时候,需要将build设置为1,2,3...等递增的整数,有什么用呢? 

version我们可以通过App Store、itunes或其它软件看到,是给用户看的,而build是我们在团队开发中内部只用的,只有我们自己可以看到。比如团队打算发布1.0版本的时候,会发布很多build版本供测试或QA团队进行测试,你发布了很多build,因为一直在修改着代码,因此当你收到一条bug信息时候,你怎么知道是那个build引起的问题呢,这时候build版本号的有点就可以体现出来了,不是吗。 

我这里有一段代码,可以在xcode编译时候自动增加build号码。 

先把 Info.plist 里的版本号改成某个数字,然后 Targets → your target → Build Phases → Run Script 的地方加上: 

[cpp]  view plain copy print ?
  1. version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PRODUCT_SETTINGS_PATH`  
  2. version=`expr $version + 1`  
  3. /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $version" $PRODUCT_SETTINGS_PATH  
  4. #/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $version" $PRODUCT_SETTINGS_PATH 这行代码会让version也自增,一般不需要  

 

2017-04-18 18:03:20 souprock 阅读数 475

App的名字设置方式有很多种,如果在App打包上线时不做修改,最终App的名字就是Xcode在建立工程时的名字。好的习惯是工程建立时使用英文(pinyin),那么App也就是“英文”名字了,虽然Xcode也支持直接用中文命名工程(甚至是方法名……),但有时也会因此产生一些不必要的麻烦甚至莫名其妙的bug。

本文主要介绍两种设置App名称的方法,第一种较为简单,第二种涉及简单的版本国际化与本地化(Localization)的问题。


1.Bundle display name

先看此方法的具体设置步骤:

  • 建立工程如下,如果不设置App名,默认的App名就是工程名了。

QQ截图20160309174314.png

  • 点击工程-TARGETS-Info,添加“Bundle display name”,string值填写要设置的App名称。

QQ截图20160309174324.png

  • 再次编译,效果如下,这个方法就是这么简单了。

1468630-7d782f2d30827276.png

具体也没太多好说的,检索App名称设置时,大部分答案也是这个,因为比较简单。

这里提一下Bundle name和Bundle display name:

Bundle name - is folder name, where your app (including executable file and all resources) will be stored (Cool Program.app)。建议不要修改bundle name
Bundle display name - is what will be shown on iPhone screen,即当你安装该app到iPhone上显示的name。
注意:Bundle Display name must correspond to Bundle name,即bundle display name和bundle name不能相差太远。例如bundle name设置为 TheApplication, 而 bundle display name设置为“金瓶梅”,则apple会拒绝你的app。

2.InfoPlist.strings->CFBundleDisplayName

这种方法较为繁琐,但是可以支持多语言版本名称的设置,即Localization,也先看具体步骤:

  • 新建一个Strings File,命名应该不一定非得是InfoPlist.strings,应该是沿用习惯。

54.png

  • 点击工程-PROJECT-Info-Localizations,添加简体中文支持,如果想支持繁体,也可继续添加,其他语言亦然。

QQ截图20160309174007.png

QQ截图20160309174019.png

  • 点击之前创建的InfoPlist.strings - 点击右边的“Localizion”- 添加简体中文

1468630-d4b52eb0f01a6ad1.png

可以选择支持英文

1468630-a885a69c4cf737ca.png

QQ截图20160309173853.png

  • 分别设置中英文名字

"CFBundleDisplayName" = "中文名字";

"CFBundleDisplayName" = "EnglishName";

名字字符串自己填写就好,这里只是示范

QQ截图20160309173740.png

  • 编译工程

分别切换模拟器的设置中的语言至中英文模式,分别查看appiocn下面的名字的变化:

'.png

3.关于默认语言的设置:Localization native development region

Xcode建立工程时,默认语言环境是英文,所以在调用一些系统空间时(例如相机相册),其控制按键的标题都是英文显示的状态,快速的设置方法就是设置Localization native development region的值,具体步骤可以参考此文:Localization native development region 更改语言无效 中的第一段内容。

4. Localizations版本国际化

这个就是为了让APP支持多国语言环境,最好的Demo应该是环信的官方Demo,这里只是介绍一下简单的用法:

  1. 同添加InfoPlist.strings的做法相同,添加一个Localizable.strings文件

  2. 对应中英文(其他语言自行添加),分别添加下列语句:

1
2
3
4
5
6
7
8
9
"alertTitle" "标题";
"alertMessage" "信息";
"alertOk" "确认";
"alertOther" "其他";
 
"alertTitle" "title";
"alertMessage" "message";
"alertOk" "confirm";
"alertOther" "other";

关于上述的key和value,只是示范,可自行定义,调用这些key-value需要利用NSLocalizedString(<#key#>, <#comment#>)系统宏,例如:NSLocalizedString(@"alertTitle", @"这是一句注解,根据情况写"),第一个参数即在strings文件中自定义的key,根据不同的语言环境,系统会自动检测这个key对应的value(中文还是英文),第二个参数是注释,为了便于理解,可以为nil。
实际用例:

1
2
3
4
5
6
7
- (void)createAlertViewWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancel:(NSString *)cancel andOther:(NSString *)other
  {
      UIAlertView * alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancel otherButtonTitles:other, nil];
      [alert show];
  }
  //调用
  [self createAlertViewWithTitle:NSLocalizedString(@"alertTitle", @"这是一句注解,根据情况写") message:NSLocalizedString(@"alertMessage", @"") delegate:nil cancel:NSLocalizedString(@"alertOk", nil) andOther:NSLocalizedString(@"alertOther", nil)];

分别设置系统的语言环境至中英文模式,效果如下:

QQ截图20160309173458.png

上面的写法看起来比习惯上直接写string去设置标题要麻烦许多,但是常用的标题可以进行二次宏定义管理,那样不仅使用方便,还便于统一管理。
看一下环信Demo中的示范:

1468630-1b6e905c3d91a528.png


iOS 设置App的名称

阅读数 533

iOS 设置App的名称

阅读数 10792

iOS App状态栏设置

阅读数 274

IOS app plist 设置

阅读数 467

iOS的App图标设置

阅读数 289

没有更多推荐了,返回首页