ios开发的一些奇巧淫技,ios骚操作

ios 开发若干技巧

1.定义函数时,希望传入的参数不为nil,或者为nil时会有警告显示:

创新互联是专业的舒兰网站建设公司,舒兰接单;提供成都网站制作、网站设计、外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行舒兰网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

如下:

- (instanceype)initWithFoo:(NSString *)foo bar:(NSString *)bar sark:(NSString *)sark

__atttribute__((nonnull(1, 2)));

p.s. index从1开始,不是0,且只对对象生效。

该技巧同样来自,sunnyxx大神的微信,逗比狗~

2.定义函数时,希望子类override该方法时候,必须调用super,否则编译器直接报错。

@interface OldSix:NSObject

- (void)fooWithNothing __attribute__((objc_requires_super));

该技巧同样来自,sunnyxx大神的微信,逗比狗~

wait~~~~~

/*检查子类在重写该方法时有没有调用自己(父类)的实现

*对于一些可以被继承的类,需要子类在重某一调用父类的实现以保证正确的行为,通过在头文件方法的声明末尾添加`NS_REQUIRES_SUPER`

*可以让编译器检查子类方法有调用父类的实现。具体使用方法如下:

* - (void)viewWillAppear:(BOOL)animated NS_REQUIRES_SUPER;

*/

但是根据我的实际测试,发现sunnyxx大神仙的方法,没有任何显示效果,不知道是不是我打开的方式不对还是怎么,

总之,NS_REQUIRES_SUPER的方法亲测可用。

3.误删系统sdk头文件的解决办法

在终端中输入:

$ cd ~/Library/Developer/Xcode/DerivedData/ModuleCache/

$ rm -rf *

4.ARC下打印retainCount

extern uintptr_t _objc_rootRetainCount(id obj);

id test = [NSString new];

NSLog(@"retain count %lu",_objc_rootRetainCount(test));

5.工程报错下,仍然可以编译成功

6.定位方法的调用者

iOS开发技巧-捕捉侧滑返回事件

有时候希望在页面退出之前做一些事情,但是发现除了 popViewController 方法外,有时候会使用侧滑返回。这个时候就需要捕捉侧滑返回的事件了。

//苹果的api说明 与侧滑返回相关

在当前控制器中重写这两个方法就可以了。

1.第一次push进来的时候两个方法都会调用, parent的值不为空 。

2.当开始使用系统侧滑的时候,会先调用willMove, 而parent的值为空 ;

3.当滑动结束后返回了上个页面,则会调用didMove, parent的值也为空 ,如果滑动结束没有返回上个页面,也就是轻轻划了一下还在当前页面,那么则不会调用didMove方法。

想要在侧滑返回后在上个页面做一些操作的话,可以在didMove方法中根据parent的值来判断。

Cocoapods,让iOS开发更简单(三):实践经验汇总

相信各位读了之前的两篇文章,对pods的使用已经相当熟练了。不过在纷繁复杂的实际使用场景下,可能还是会遇到一些问题。本文就结合自己的实践经验,做一些快问快答,希望大家能多多补充交流。话不多说,那我们就即刻开始吧!

pod系列文章

Cocoapods,让iOS开发更简单(一):走近Cocoapods

Cocoapods,让iOS开发更简单(二):创建私有库

Cocoapods,让iOS开发更简单(三):实践经验汇总

一文带你快速分清静态库-动态库-Framework

一般推荐使用指定版本或范围版本号,以确保依赖的稳定性。

总结 :能用pod install解决问题的,就不要用pod update。因为pod update会把依赖库全部检查一遍,不仅慢有时候还会出现坑。

忽略Pods警告,有些第三方Pod集成进来会有一大堆警告信息,在Podfile中对应的target或分组下加上关键字inhibit_all_warnings!就可以把警告忽略。

作用:

在pods中用frameworks替代.a静态库。

场景:

swift项目pods默认开启(use_frameworks!),OC项目pods默认关闭(#use_frameworks!),同时需满足以下两点,

解析:

swift工程依赖了OC工程的话,需要use_modular_headers!

示例:

为某个 Pods 使用模块化标头,可以使用以下语法:

pod 'TestPodLib', :modular_headers = true

另外,当全局使用 use_modular_headers! 属性时,同时还可以使用以下方法从模块化标头中排除特定的Pod:

pod 'TestPodLib', :modular_headers = false

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

常用的方式调用pod中的素材是不生效的,因为默认是从mainBundle中读取的,如

打在pod中的素材已经不在mainBundle中而在对应组件下的bundle 里面,所以应该这么调用:

在用CocoaPods集成第三方库之后,默认情况下,使用类似#import XXX/YYY.h的方式引入第三方库的头文件。

pod search只会搜索本地缓存的库,如果想搜索到最新的第三方框架或者某个框架的最新版本,必须先使用pod repo update。

iOS开发技巧(OC版):关于iOS11适配的一些坑

在iOS11以前, 自定义UIViewController时, 从来没有考虑过topLayoutGuide和bottomLayoutGuide这两个属性.但是在iOS11出来之后,这两个属性被废弃,取而代之的就是safeArea的概念,safeArea是描述你的视图部分不被任何内容遮挡的方法。 它提供两种方式:safeAreaInsets或safeAreaLayoutGuide来提供给你safeArea的参照值,即 insets 或者 layout guide。 safeArea区域如图所示:

在除了iPhone X以外的型号手机上, UINavigationController 就是 topLayoutGuide区域. UITabBarController就是bottomLayoutGuide.但是这两个属性在iOS11已经被取代了. 取而代之的就是safeArea区域(iPhone X图区域4部分)

当我们自定义一个UIViewController, 内部嵌套了UINavigationController 或者UITabBarController的时候. 运行程序会出现以下错误:

原因是少了:

具体是为什么,没有细研究.不过解决办法如下:

因为我是创建的空项目所以只有LaunchScreen.storyboard..如果你的项目里还有Main.storyboard,那么 你需要把第四个勾勾也去掉.

区域一: 高度30

区域二:高度14

区域三:高度44

区域五:高度49

区域六:高度14

区域七:高度20

更新iOS11以后, UITabBarController上的图标文字由原来的垂直放置, 变成水平放置

iPhone X 横竖屏在尺寸上有很多细微的差别.

我们打印UINavigationController  navigationBar的时候发现他的高度为44.也就是上图绿色区域.但是在实际显示的时候确实红色区域,高度为32.整个高度向上12.也就是蓝色区域.

我们打印UITabBarController  tabBar的时候发现他的高度为32,就是橘色区域,红色区域为功能区,高度为21.我们是何止tabBar颜色的时,包括橘色区和红色区.

待更新

解决方案: 准备一张尺寸:1125 * 2436的启动图片,  添加到Assret中

解决方案: 通过改变按钮的 contentEdgeInsets和imageEdgeInsets的值成功改变了按钮的偏移问题,单独设置contentEdgeInsets也可达到一定的效果。

解决方案:iOS11弃用了automaticallyAdjustsScrollViewInsets属性,新增contentInsetAdjustmentBehavior来替代它

- (void)createView:(BOOL)useForRendering showRightAway:(BOOL)showRightAway;

{

if(_view == nil)

{

    NSString *deviceVersion = [self getDeviceVersion];

    if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])

    {

        CGRect bounds = CGRectMake(34, 0, 744, 375);

        _window  = [[UIWindow alloc] initWithFrame:bounds];

    }

    else

    {

        _window = [[UIWindow alloc] initWithFrame: _screen.bounds];

    }

  _window.screen = _screen;

  if(_screen == [UIScreen mainScreen])

    {

       _view = [[GetAppController() init] unityView];

        NSAssert([_view isKindOfClass:[UnityView class]], @"You MUST use UnityView subclass as unity view");

    }

    else

    {

        _view = [(useForRendering ? [UnityRenderingView alloc] : [UIView alloc]) initWithFrame: _screen.bounds];

    }

  _view.contentScaleFactor = UnityScreenScaleFactor(self.screen);

    [self updateScreenSize];

  if(showRightAway)

    {

        [_window addSubview:_view];

        [_window makeKeyAndVisible];

    }

}

}

- (NSString*)getDeviceVersion

{

struct utsname systemInfo;

uname(systemInfo);

NSString *deviceVersion = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

NSLog(@"添加获取手机型号方法 ++ %@", deviceVersion);

return deviceVersion;

}

- (void)updateScreenSize

{

CGSize layerSize    = _view.layer.bounds.size;

NSString *deviceVersion = [self getDeviceVersion];

if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])

{

    layerSize = CGSizeMake(744, 375);

}

CGFloat scale      = UnityScreenScaleFactor(_screen);

_screenSize = CGSizeMake(layerSize.width * scale, layerSize.height * scale);

}


分享题目:ios开发的一些奇巧淫技,ios骚操作
当前网址:http://abwzjs.com/article/phcshi.html