IOS开发基础知识--碎片44

1:App跳转至系统Settings

跳转在IOS8以上跟以下是有区别的,如果是IOS8以上可以如下设置:

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
   [[UIApplication sharedApplication] openURL:url];
}  

如果要兼容IOS7则要设置在URL Types中添加一个新项只填写prefs,然后设置一下上面那个URLWithString,对应的字符串如下:

About — prefs:root=General&path=About
Accessibility — prefs:root=General&path=ACCESSIBILITY
Airplane Mode On — prefs:root=AIRPLANE_MODE
Auto-Lock — prefs:root=General&path=AUTOLOCK
Brightness — prefs:root=Brightness
Bluetooth — prefs:root=General&path=Bluetooth
Date & Time — prefs:root=General&path=DATE_AND_TIME
FaceTime — prefs:root=FACETIME
General — prefs:root=General
Keyboard — prefs:root=General&path=Keyboard
iCloud — prefs:root=CASTLE
iCloud Storage & Backup — prefs:root=CASTLE&path=STORAGE_AND_BACKUP
International — prefs:root=General&path=INTERNATIONAL
Location Services — prefs:root=LOCATION_SERVICES
Music — prefs:root=MUSIC
Music Equalizer — prefs:root=MUSIC&path=EQ
Music Volume Limit — prefs:root=MUSIC&path=VolumeLimit
Network — prefs:root=General&path=Network
Nike + iPod — prefs:root=NIKE_PLUS_IPOD
Notes — prefs:root=NOTES
Notification — prefs:root=NOTIFICATIONS_ID
Phone — prefs:root=Phone
Photos — prefs:root=Photos
Profile — prefs:root=General&path=ManagedConfigurationList
Reset — prefs:root=General&path=Reset
Safari — prefs:root=Safari
Siri — prefs:root=General&path=Assistant
Sounds — prefs:root=Sounds
Software Update — prefs:root=General&path=SOFTWARE_UPDATE_LINK
Store — prefs:root=STORE
Twitter — prefs:root=TWITTER
Usage — prefs:root=General&path=USAGE
VPN — prefs:root=General&path=Network/VPN
Wallpaper — prefs:root=Wallpaper
Wi-Fi — prefs:root=WIFI
Setting —prefs:root=INTERNET_TETHERING

然后如下代码:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=WIFI"]];

一段实例代码:

    NSURL *url;
    if (isIOS8) {
        url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    }
    else
    {
        url=[NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"];
    }
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }

2:iOS 获得手机当前语言,运用语言包跟地理名字运用

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *allLanguage = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [allLanguage objectAtIndex:0];
NSLog(@"The current language is : %@", currentLanguage); 

iOS 9 之前:以上返回结果:语言字符串代码。例如:"zh-Hans";iOS 9:以上返回结果:语言字符串代码 + 地区代码。例如:"zh-Hans-US"

简体中文:zh-Hans;繁体中文:zh-Hant;香港中文:zh-HK;澳门中文:zh-MO;台湾中文:zh-TW;新加坡中文:zh-SG

iphone 上的系统语言如果设为中文,则placemarks中打印出来的内容为中文城市名打印结果为 "北京市",iphone 上的系统语言如果设为英文,则placemarks中打印出的内容为英文城市名打印结果为"beijing”,所以在获取地理名字时要做一个强制转换语言,让它可以兼容不管是什么语言都可以获取;下面一段时把中文强制转成英语,最后再转返手机默认的语言;

/**
 *  通过实现代理方法,来获取到位置数据
 */
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    // course 方向(0°到359.9°,0°代表正北)
    // speed 速度 m/s
    // CLLocation 这个类封装了经纬度,海拔,移动方向,速度和位置等相关的信息

    CLLocation *location = [locations lastObject];

    // 地理反编码
    // 1. 提供一个经纬度的坐标数据创建一个CLLocation对象(coorfinate : 坐标)
    CLLocation *locationForRecode = [[CLLocation alloc] initWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude];

    // 2. 创建地理反编码-反编码对象
    CLGeocoder *geoCoder = [[CLGeocoder alloc] init];

#warning keySteps :change System Language to English!!
    // 如果当前系统语言为中文 则:先将 系统语言强制转换成英文,,获取到地理位置信息后再转为默认值

    // 获取当前默认的系统语言 (先保存下来)
    NSMutableArray *userDefaultLanguages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
    // 强制 转化为英文 (因为在请求天气预报的城市名时,需要英文状态下的城市名,)
//    NSLog(@"%@",userDefaultLanguages);
//    系统默认语言 :zh-Hans-CN, en-CN
         // 将语言强制转化为 英文
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en-CN", nil] forKey:@"AppleLanguages"];

    // 3. 利用编码反编码对象,进行编码反编码操作
    [geoCoder reverseGeocodeLocation:locationForRecode completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (error) {
            // 反编码出错 打印错误信息
            NSLog(@"地理编码出错:%@",error);
        }else{
            // 反编码成功,打印位置信息
            //            NSLog(@"%@",[placemarks lastObject].locality);

            NSString *cityName = [placemarks lastObject].locality;

            NSLog(@"placemarks==>>%@",placemarks);

            NSLog(@"%s,%@",__FUNCTION__,cityName);
            // 调用 block
            self.passCityNameToWeatherBlock(cityName);

            // 当 block 将英文城市名传出去后,立即 Device 语言 还原为默认的语言
            [[NSUserDefaults standardUserDefaults] setObject:userDefaultLanguages forKey:@"AppleLanguages"];
        }
    }];
}

 3:设置navigationBar统一样式技巧总结

自定义一个WZYNavigationController继承于UINavigationController

#import "WZYNavigationController.h"  

@interface WZYNavigationController ()  

@end 

@implementation WZYNavigationController  

// 当类被加载到内存的时候调用
+ (void)load
{  

}  

// 当类第一次使用时调用
// 我们要在这个方法中设置指定当前自定义的控制器的导航条的样式
+ (void)initialize
{
    /** 如果当前的navigationBar属于WZYNavigationController的,那么我们利用appearanceWhenContainedInInstancesOfClasses方法
        来获取该类型的bar,然后统一设置属性。
        注意后面参数是一个 “类的数组”
     */
    UINavigationBar *navigationBar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[WZYNavigationController class]]];  

    // bgImage
    [navigationBar setBackgroundImage:[UIImage imageNamed:@"navBg"] forBarMetrics:UIBarMetricsDefault];  

    // 字体属性
    NSMutableDictionary *dictAttr = [NSMutableDictionary dictionary];
    dictAttr[NSFontAttributeName] = [UIFont systemFontOfSize:20];
    dictAttr[NSForegroundColorAttributeName] = [UIColor whiteColor];
    [navigationBar setTitleTextAttributes:dictAttr];  

    //更改导航条主题颜色
    navigationBar.tintColor = [UIColor whiteColor];  

    //调整返回按钮当中标题的位置.(我们只要返回按钮的那个图片,但是不要上面的文字,移走文字就好了)
    UIBarButtonItem *item = [UIBarButtonItem appearance];
    [item setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];
}  

// 对于只修改nav的根控制器的某些样式,我们需要获取到nav的根控制器,但是上面的方法是类方法,拿不到rootVC,所以说要在pushViewController 中获取我们需要的控制器。
// 由于根控制器本质上也是由nav push而来的,所以说该方法能获得所有push的控制器
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.childViewControllers.count == 0) { // 判断是根控制器么,只有根控制器才需要设置menuIcon,其余push的控制器不需要
        UIImage *leftBarBtnImage = [UIImage imageWithOriginalImageName:@"menuIcon"];
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:leftBarBtnImage style:0 target:self action:@selector(menuClick)];
    }  

    // 设置完样式之后再push(先push再设置还有什么鸟用?!)
    [super pushViewController:viewController animated:animated];
}  

// leftBarBtn的监听方法,点击之后应跳转到leftView
// 为了拿到leftView,需要通知
- (void)menuClick
{
    // 发送一个通知
    [[NSNotificationCenter defaultCenter] postNotificationName:WZYLeftViewDidOpenDragNotification object:nil];
}  

@end

 4:[NSBundle mainBundle] pathForResource: ofType: 获取不到数据

从bundle中获取数据,明明把数据添加到项目中了,但就是不对。

NSString *newDataName = [[NSBundle mainBundle] pathForResource:dataName ofType:format];  为空

解决方法:

当时添加是直接拖拽过去,没有真正加入到bundle中,需要在项目设置中,build phases-》copy bundle resources 下面添加自己的数据就可以了。

时间: 2024-08-09 10:39:14

IOS开发基础知识--碎片44的相关文章

iOS开发基础知识--碎片35

iOS开发基础知识--碎片35 1:iOS视图控制对象生命周期 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewController对象的视图即将消失.被覆盖或是隐藏时调用: viewDidDisappear-UIViewController对象的视图已经消

iOS开发基础知识--碎片8

iOS开发基础知识--碎片8  1:用UIImageView作为背景,但直接把按钮或者 UITextField放在上面无法相应事件. 解决办法:UIImageView默认的UserInteractionEnabled是NO,把它修改成YES,或者可以直接在XCODE上面的view有个属性勾选User Interaction Enabled 遇到的场景(在滚动视图里面放一个图片视图,在图片视图上又放置一个按键,发现一直没有响应效果); 2:AFnetWorking报"Request failed:

iOS开发基础知识--碎片17

iOS开发基础知识--碎片17 iOS开发基础知识--碎片17 1:contentSize.contentInset和contentOffset区别 contentSize 是scrollview中的一个属性,它代表scrollview中的可显示区域,假如有一个scrollview,它的frame为(0,0,320,480),而它的contentSize为(320,960).也就是说,这个scrollview整个内容的大小为(320,960),要通过上下滑动scrollview来查看(320,4

iOS开发基础知识--碎片32

 iOS开发基础知识--碎片32 1:动画属性UIViewAnimationOptions说明 a:常规动画属性设置(可以同时选择多个进行设置) UIViewAnimationOptionLayoutSubviews:动画过程中保证子视图跟随运动. UIViewAnimationOptionAllowUserInteraction:动画过程中允许用户交互. UIViewAnimationOptionBeginFromCurrentState:所有视图从当前状态开始运行. UIViewAnimat

iOS开发基础知识--碎片1

iOS开发基础知识--碎片1  一:NSString与NSInteger的互换 NSInteger转化NSString类型:[NSString stringWithFormat: @"%d", NSInteger]; NSString转化 NSInteger类型:NSInteger = [NSString intValue]; *其它几个同理 [NSString boolValue].[NSString floatValue].[NSString doubleValue] 二:Obje

iOS开发基础知识--碎片3

iOS开发基础知识--碎片3  iOS开发基础知识--碎片3 十二:判断设备 //设备名称 return [UIDevice currentDevice].name; //设备型号,只可得到是何设备,无法得到是第几代设备 return [UIDevice currentDevice].model; //系统版本型号,如iPhone OS return [UIDevice currentDevice].systemVersion; //系统版本名称,如6.1.3 return [UIDevice

iOS开发基础知识--碎片2

iOS开发基础知识--碎片2 六:获得另一个控件器,并实现跳转 UIStoryboard* mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController *registerViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"registerView

iOS开发基础知识--碎片23

iOS开发基础知识--碎片23  1:关于UITableView中关于行重复加载的问题 在Cell里重写prepareForReuse,对一些控件进行清空: 比较简单: -(void)prepareForReuse{ [super prepareForReuse]; _content_label.text = nil; _time_date_label.text = nil; _name_label.text = nil; _career_label.text = nil; } 下面这个是我在c

iOS开发基础知识--碎片21

iOS开发基础知识--碎片21  1:[UIScreen mainScreen].scale知识点 当屏幕分别为640x940时[[UIScreen mainScreen] scale]=2.0 当屏幕分别为320x480时[[UIScreen mainScreen] scale]=1.0 2:如何正确的绘制1像素的线 #define SINGLE_LINE_WIDTH (1 / [UIScreen mainScreen].scale) #define SINGLE_LINE_ADJUST_OF