大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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.定位方法的调用者
有时候希望在页面退出之前做一些事情,但是发现除了 popViewController 方法外,有时候会使用侧滑返回。这个时候就需要捕捉侧滑返回的事件了。
//苹果的api说明 与侧滑返回相关
在当前控制器中重写这两个方法就可以了。
1.第一次push进来的时候两个方法都会调用, parent的值不为空 。
2.当开始使用系统侧滑的时候,会先调用willMove, 而parent的值为空 ;
3.当滑动结束后返回了上个页面,则会调用didMove, parent的值也为空 ,如果滑动结束没有返回上个页面,也就是轻轻划了一下还在当前页面,那么则不会调用didMove方法。
想要在侧滑返回后在上个页面做一些操作的话,可以在didMove方法中根据parent的值来判断。
相信各位读了之前的两篇文章,对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。
在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);
}