分类: IOS技术

IOS技术

iOS arm64汇编中寄存器和基本指令

iOS汇编(汇编语言依赖于机器)
真机,arm64汇编, GNU汇编
模拟器:x86汇编(Mac电脑) , AT&T汇编

真机:arm64汇编
寄存器:
通用寄存器
64bit的:x0~x28,29个寄存器每个寄存器都是64位的,64位就是8 个字节,一个寄存器*多能放8个字节的数据
32bit的:w0~w28(属于x0~x28的低32bit) 4个字节
x0~x7通常拿来存放函数的参数,更多的参数使用堆栈来传递
x0通常拿来存放函数的返回值
程序状态寄存器
cpsr(current program status register)
spsr(saved program status register) ,异常状态下使用
指令
堆栈
在xcode中建立汇编文件


在汇编文件中如何写函数
.text // 放代码段的 .data//数据段,.stack// 栈段
test: // 函数名称
在外面如何调用汇编文件就要建一个叫arm.h的头文件

汇编指令
ret 返回指令
mov 目的寄存器,源操作数 // 将右边的源操作数复制到左边的目的寄存器中

汇编文件写函数


指令还有next,nexti 表示如果遇到函数直接逃过这个函数,如果遇到代码是一行一行执行,step,遇到代码也是一行一行执行,如果遇到函数直接进去,stepi-> step instruction一条一条汇编指令跳过.si,执行这一句汇编指令,敲c这个函数过掉了.


cmp:将2个寄存器相减,相减的结果会影响cpsr寄存器的标志位
b : 跳转指令, jamp

条件域:


EQ: equal,相等
NE:not equal,不相等
GT:great than,大于
GE great or equal,大于等于
LT:less than,小于
LE:less equal, 小于等于

bl:带返回的跳转指令,跳转完返回到跳转的下一行

内存操作指令
load, 从内存中装载数据,从内存中读数据到寄存器
ldr,ldur,去内存数据放到寄存器中,区别是如果右边立即数为负数则用的是ldur,如果右边立即数为正数则用ldr.立即数为偏移值

ldp:(p是pair的简称,一对的意思)从内存中读取数据放到一对寄存器中
ldp w0, w1, [x2, #0x10],取[x2,#0x10]的前4个字节给w0,接着下面的4个字节给w1

store指令往内存中存储数据
str, stur指令将寄存器里的值往内存中写入数据

stp指令 w0, w1, [x1, #-0x5] ,将w0四个字节的数据放入[x1, #-0x5],再讲w1的四个字节的数据放入[x1, #-0x5]中
先写寄存器w0,w1,再写内存寻址[x1, #-0x5]
寻址方式:

零寄存器:里面存储的值为0
wzr(32bit, Word Zero Register) 4个字节,
xzr(64bit) 8个字节


将4个字节的0赋值给了a,将4个字节的0赋值给了b

程序计数器
pc (Program Counter) 记录CPU当前指令的是哪一条指令,存储着当前CPU正在执行的指令的地址,类似于8086汇编的ip寄存器.
si
register read
链接寄存器
lr (Link Register) ,也就是x30,存储着函数的返回地址


bl与b指令的本质区别
bl指令(带返回值的跳转指令):
将下一条指令的地址存储到lr(x30)寄存器中
跳转到标记处开始执行代码

ret指令函数返回, 将将lr(x30)的值赋值给pc寄存器,pc里面存储的地址值,则cpu马上就执行这个地址对应的指令
而b指令只是跳转

iOS实现App之间的分享

我们在iOS平台上想要实现不同App之间的内容分享一般有几种常用方式:
*种是通过AirDrop实现不同设备的App之间文档和数据的分享;
第二种是给每个App定义一个URL Scheme,通过访问指定了URL Scheme的一个URL,实现直接访问一个APP;
第三种是通过UIDocumentInteractionController或者是UIActivityViewController这俩个iOS SDK中封装好的类在App之间发送数据、分享数据和操作数据;
第四种是通过App Extension,在iOS 8的SDK中提供的扩展新特性实现跨App的数据操作和分享;
还有一种集成第三方SDK实现的有限个App的数据分享,比如社交平台(QQ,微信,新浪微博等)给我们提供的官方SDK,或者是集成了多个社交平台的ShareSDK组件和友盟分享组件等。
谈谈苹果原生提供的基于iOS SDK的分享技术,同时推荐俩篇苹果开发者中心的文档:Inter-App Communication和Document Interaction Programming Topics for iOS。
谈一下如何通过UTI让我们的App支持分享。
原理
参考详解苹果提供的UTI(统一类型标识符)这篇文章中,详细地讲解了一下UTI(Uniform Type Identifier),一套苹果给我们提供用来在基于Cocoa和Cocoa Touch应用程序中识别实体内容类型的规范,而关于实现内容关联的技术也正是基于这套规范。在iOS和Mac OS开发中,苹果给我们提供了注册文档类型的接口,而这种注册的文档类型是全局的,系统中所有的应用程序和服务都可以侦测到。因此我们通过这个底层侦测,可以使用其他可选的第三方App来预览我们的App中不支持的文档,而且我们还可以通过这个接口在我们的App中打开并处理第三方App的文档。

如果我们的App可以处理某些类型的实体内容,那么我们就可以在我们项目中的Info.plist文件中进行注册。关于使用哪种类型和UTI,就要参考我在“详解苹果提供的UTI(统一类型标识符)“这篇文章中的讲解。当一个第三方App通过苹果的底层侦测技术检查有哪些App可以处理它所指定的内容类型时,如果我们的App已经注册了这种类型,那么我们的App图标就会显示在其中,并且作为我们自己的App的一个入口。
主要技术
主要应用到这种底层侦测的技术有iOS SDK中给我们提供的UIDocumentInteractionController、UIActivityViewController 和Quick Look 框架。此外,在iOS 8中,苹果又给开发者提供了App Extension,一种更高大上的方式在App之间的实现分享内容。关于UIDocumentInteractionController、UIActivityViewController、Quick Look 框架以及App Extension的细节,我计划在后面的文章中详细讲解。这篇文章,我们主要是来谈谈如何注册我们App可用的文档类型以及简单使用我们的App来处理第三方App分享的内容。

注册可用类型
我们需要在info.plist文件中,添加一个新的属性CFBundleDocumentTypes(实际上输入的是”Document types”),这是一个数组类型的属性,意思就是我们可以同时注册多个类型。而针对数组中的每一个元素,都有许多属性可以指定,详细的属性列表我们可以从官方文档上找到: Core Foundation Keys —- CFBundleDocumentTypes。这里列举我们在做iOS开发时常用的属性

– CFBundleTypeName(“Icon File Name”)
字符串类型,指定某种类型的别名,也就是用来指代我们规定的类型的别称,一般为了保持唯一性,我们使用UTI来标识。
– CFBundleTypeIconFiles
数组类型,包含指定的png图标的文件名,指定代表某种类型的图标,而图标有具体的尺寸标识:

|Device |Sizes |
|:------|:---------|
|iPad |64 x 64 pixels, 320 x 320 pixels|
|iPhone and iPod touch|22 x 29 pixels, 44 x 58 pixels (high resolution)|

 

  • LSItemContentTypes(“Document Content Type UTIs”)
    数组类型,包含UTI字符串,指定我们的应用程序所有可以识别的类型集合
  • LSHandlerRank(“Handler rank”)
    字符串类型,包含Owner,Default,Alternate,None四个可选值,指定对于某种类型的优先权级别,而Launcher Service会根据这个优先级别来排列显示的App的顺序。优先级别从高到低依次是Owner,Alternate,Default。None表示不接受这种类型。
    而当我们添加完所有属性后,开始运行我们的程序,然后再回到我们的Info界面,就会看到Document types这个列表已经发生了变化,这就证明我们成功的注册好了App可用的类型。

打开第三方应用
我们在上面的步骤中注册好了我们的App可以识别的类型,现在我们可以打开一个使用UIDocumentInteractionController或者是Quick Look框架来展示内容的第三方App,这里以iPhone 上的QQ程序为例。

我们在上面的注册步骤中,注册的LSItemContentTypes仅包含了public.data这个UTI。所以我们先从QQ应用程序的我的文件中,打开不同类型的文件进行对比,大家可以看下图我的文件列表中包含俩种类型的文件,一种是.jpg扩展名的图片文件,一种是.pdf扩展名的文档文件。


当我打开一个图片文件进行预览时,点击其他应用打开,就可以在App列表中看到我们的App图标。简单介绍一下这个页面,*行是苹果在iOS 7之后给我们提供的使用AirDrop在iPhone、iPad或iPod Touch设备之间通过iCloud共享内容的一种方式。第二行是通过文档类型关联技术识别的App的列表。第三行是通过文档关联技术识别的Action的列表,Action表示对文档可进行的操作,如复制,打印等。
程序回调
当我们通过上面步骤,成功地显示了我的app图标之后,点击图标,我们就可以跳转到我的应用中,而苹果在iOS SDK中给我们提供的接收回调的方法在iOS 9之后做出了改变,因此我们需要针对不同的设备版本做出改变:

分享一下自己的手机从ios14降级回ios13.5.1,可以保存资料哦

关于ios14降级后点击图片和网页分享页面出现空白的情况
需要还原系统设置,这样子会重置当前的所有设置(不会清除数据)。

通用—还原—还原所有设置(会重启)

下面是修复问题后的样子


升级ios14测试版
6月22号凌晨ios14测试版推出后,上午立马给我的小7装上尝尝鲜。
想要尝试的请下载描述文件,iphone和ipad通用。

https://www.firedev.xyz/14/iOS_iPadOS_14_AppleSeed_Profile.mobileconfig

注意:使用Safari浏览器(iphone自带的)

ios14主要的不同点是:
App资源库,可以智能分类
小组件,主屏幕和负一屏
画中画,这个实测仅限apple TV可以使用
接下来的一段时间让我深刻体会到了什么是测试版,噩梦开始了
手机发热(堪比某米)
掉电巨快
有时莫名的卡顿
系统占用内存的变大
*让我受不了的还是前面两点
ios14降回ios13.5.1
昨天晚上实在是受不了,决定倒退系统

准备工作
itunes(用来备份手机和还原)
ios13.5.1固件包
1、备份
建议啊,icloud基本备份一下!!!!!!
微信和QQ的聊天记录备份,可以先备份到电脑上,双重保险。
由于 iOS 系统限制,跨版本降级会导致设备数据丢失,理论上从 iOS 14 备份的数据也无法恢复至 iOS 13 系统,你现在用爱思助手或者 iTunes 备份的数据,降回 iOS 13 是无法恢复的。

1.1、首先,在 iOS 14 系统下通过 iTunes 完整备份你的 iPhone 资料。

如果找不到这个页面,请点击这个手机小图标


1.2、备份完成后,打开刚刚备份的文件
windows:C:Users/用户名/AppData/Roaming/Apple Computer/MobileSync/Backup

打开*新的备份文件夹,用记事本/文本编辑工具打开info.plist
(文件被删除了,就不上图了)

Ctrl+F 查找Product Version

在这个字段的下一行就是关于IOS备份的版本号了,因为是在ios14下备份的嘛,这个就是14了

<kev>Product Version</kev>
<string>14.0</string>
<key>Serial Number</key>

把中间的14.0修改为13.5.1,也就是要降级的系统版本。注意啊,这个版本号千万不要写错!!!!!
2、固件包
2.1、在爱思助手官网上下载相应的固件包
链接地址


3、使用itunes进行降级
打开 iTunes,按住 shift(windows)键,点恢复 iPhone,在弹出窗口中选择下载好的 iOS 13.5.1 系统固件等待刷机完成即可


实测
除了邮件账户需要重新添加,别的数据都在。(也可能是icloud有基本备份)
成功了的小伙伴帮我点一下赞噢

【ios】swift教程

学习swift地址
https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html
和其他语言比起来,语法层次确实有些不一样的地方。

在wwdc2019上看到了苹果公司关于swiftui的介绍,感觉这就是未来。
Parentheses()
brackets[]
braces{}

Swift编程语言简介
Swift命令行操作

1 Swift defines away large classes of common programming errors by adopting modern programming patterns:
2
3 Variables are always initialized before use.
4 Array indices are checked for out-of-bounds errors.
5 Integers are checked for overflow.
6 Optionals ensure that nil values are handled explicitly.
7 Memory is managed automatically.
8 Error handling allows controlled recovery from unexpected failures.

A swift tour
下面的内容如果你有不理解的请不要太过于悲观,我们将会在以后继续学习

Simple Values
let 定义常量
var 定义变量

Control Flow
Use if and switch to make conditionals, and use for-in, while, and repeat-while to make loops. Parentheses around the condition or loop variable are optional. Braces around the body are required.

1 if true {
2 print(“this is true”)
3 } else{
4 print(“this is not true”)
5 }
6 var tmp = “”
7 switch tmp{
8 case “1”:
9
10
11
12
13
14 }
15
16 for i in [1, 3, 5,7,9]{
17
18 }
19 for i in 1..<5{
20 print(i)
21 }
22 for i in 1…5{
23 print(i)
24 }

 

1 while condition {
2
3 }

 

1 repeat {
2     print(“至少执行一次”)
3 }while 2 < 1
4

函数和闭包
By default, functions use their parameter names as labels for their arguments. Write a custom argument label before the parameter name, or write _ to use no argument label.

1 func greet(person: String, day: String) -> String {
2     return “Hello \(person), today is \(day).”
3 }
4 greet(person: “Bob”, day: “Tuesday”)

对象和类

实例话一个类

Enumerations and Structures
Protocols and Extensions
Error Handling
异常捕获

iOS开发之Swift教程01-Swift基础

【主要内容】

1.关于Swift

2.Hello World

3.常量和变量

4.类型标注

5.常量和变量的命名

6. 输出常量和变量
7.注释

8.分号

一、关于Swift

苹果在2014年WWDC(苹果开发者大会)发布了Swift,用于编写iOS,Mac OS X和watchOS应用程序。Swift 采用安全的编程模式并添加了很多新特性,而且对于熟悉OC人开发者来说学习Swift也很简单。是不是已经迫不及待要体验Swift了。

二、Hello World

在学习计算机每一门语言的时候*个程序肯定都是Hello World,Swift也一样,下边来看一下Swift如何打印Hello World。print(“Hello World”)
就是这么简单不需要多余的字符或者导入一个库。重要的事情说三遍:在Swift中不需要在每句的结尾加分号!在Swift中不需要在每句的结尾加分号!在Swift中不需要在每句的结尾加分号!

三、常量和变量

常量和变量应该是每一门语言里边都存在的。常量就是在定义之后就不可以再改变的量,而变量就是定义之后还可以改变他的值。那么在Swift中使用let来声明常量,使用var来声明变量。注意常量和变量必须在使用前声明。

下边用常量定义你的身高,用变量定义你的年龄:

//定义常量用let 用常量定义身高
let height = 187

//定义变量用var 变量定义年龄
var age = 35
age = 36
上边声明一个你的身高的常量height,并给它初值187,因为人的身高到一定年龄后是不会再变的。有声明一个你的年龄的变量age,赋初值35,因为年龄每年是可以变化的,今年35岁明年就36岁。
你也可以同时定义多个常量或者变量,只需要用逗号隔开:

//同时定义多个常量和变量
let a = 10, b = 27, c = 58
var d = 3.14, e = 6.28, f = 5.28

注意:

在Swift中如果你声明变量而没有重新改变变量的值,那么编译器会警告你:你的变量XXX永远不会改变,建议你使用let声明成常量,如图:

四、类型标注

当你声明变量或者常量的时候可以加上类型标注(type annotation),说明变量或者常量中要储存的值的类型。格式如下:

//类型标注格式:
//变量/常量 变量名/常量名:类型 = 初始值
let number: Int = 1250
var name: String = “Aventador”
name = “Ferrari”
跟普通定义不同的是,带有类型标注的声明需要在变量名/常量名后边加上一个冒号,冒号后边是类型说明。
用类型标注同样可以同时定义多个变量:

//类型标注同时定义多个变量
var carName,carBrand,carHeight: String
注意:
在Swift中一般很少去写类型标注,因为Swift是一门安全的语言,他有类型安全和类型推断,这个会在后边提到。如果初始化声明的时候没有标注类型,系统会自动推断出变量的类型。

五、常量和变量的命名规则

5.1 你可以用任何的Unicode字符命名

5.2 不能包含数学符号、箭头、保留的(或者非法的)Unicode码位

5.3 不能用连线和制表符

5.4 不能以数字开头,但是可以再名字其他地方出现

5.5 不能重复声明变量名、常量名

你可以像下边这样命名:

六、输出常量、变量

在Swift中可以用  print(items : Any)函数来输出当前常量或者变量的值:

Swift 用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。

将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:

print(“我的*车是\(_car)”)

七、注释

Swift中注释跟OC基本一样,但是Swift要比OC功能更强。可以使用多行注释嵌套,在OC中是不可以的,如图:

八、分号

大部分编程语言在每条语句结尾的地方都需要加上分号表示结束。但是在Swift中不强制大家必须写分号,不写没有任何问题,但是写了也不错。

但是有一种情况必须写分号,就是想要在一行中执行多条语句的时候,如图:

 

iOS 使用UIBezierPath实现不等距曲线图

iOS,关于画线有很多很好的第三方,比如Charts、ECharts等等,但是我没有找到画不等距的,就自己简单的实现了一下。首先看,效果

就是描点画线加动画,没有太难的。
我自定义了一个LineChartView,和几个模型,具体demo下面会给链接

给lineChartview暴露出了几个属性和方法,都有注释

在controller里面进行初始化配置

setChartView方法

s

1 self.chartView.y_TextFont = [UIFont systemFontOfSize:14];
2     self.chartView.minValue = 0;
3     self.chartView.maxValue = 100;
4     NSArray *x_names = @[@”清醒”,@”一般”,@”黄金”];
5     NSArray *xValue = @[@0,@50,@100];
6     NSArray *x_colors = @[[UIColor redColor],[UIColor orangeColor],[UIColor yellowColor]];
7     NSMutableArray *xAxis = [NSMutableArray new];
8     for (int i = 0; i < x_names.count; i++) {
9         XJYAxisModel * model = [XJYAxisModel new];
10         model.clolor = x_colors[i];
11         model.value = xValue[i];
12         model.title = x_names[i];
13         [xAxis addObject:model];
14     }
15     [self.chartView drawLineChartViewWithX_Value_Names:xAxis xCount:xCount];

我在controller里面定义了个方法setXAxis,用于设置x轴线上的模型具体实现

1 – (NSArray *)setXAxis{
2 //    *大值和*小值 -> 每个轴线上的值 , 比如*大值90,*小值是0,10条轴线(9个间隙),则每条轴线的间距是10(0、10、20、30、40、50、60、70、80、90)
3     float min = 0;
4     float max = 90;
5     float space = (max – min)/(xCount – 1);
6     NSMutableArray *xAxisArr = [NSMutableArray new];
7     for (int i = 0 ; i < xCount; i++) {
8         XJXAxisModel *model  = [XJXAxisModel new];
9         model.value = [NSNumber numberWithFloat: i * space];
10         model.title = [NSString stringWithFormat:@”12:0%d”,i];
11         model.clolor = [UIColor whiteColor];
12         model.textFont = [UIFont systemFontOfSize:10];
13         [xAxisArr addObject:model];
14     }
15
16     return xAxisArr;
17 }

页面上弄了一个按钮,用于触发赋值,

1 – (void)refreshData{
2     static int a = 0;
3     if (a == 0) {
4         NSMutableArray *datas = [NSMutableArray new];
5             NSArray *valueXs = @[@0,@5,@11,@19,@25,@31,@39,@43,@51,@59,@70,@85,@90];
6             NSArray *valueYs = @[@0,@10,@55,@99,@88,@99,@77,@87,@10,@53,@80,@10,@0];
7             for (int i = 0; i < valueXs.count; i++) {
8                 XJDataModel *model = [XJDataModel new];
9                 model.xValue = valueXs[i];
10                 model.yValue = valueYs[i];
11                 [datas addObject:model];
12             }
13         [self.chartView drawLineChartViewWithDataModels:datas withXAxisData:[self setXAxis]];
14         a = 1;
15     }else{
16         NSMutableArray *datas = [NSMutableArray new];
17             NSArray *valueXs = @[@0,@5,@11,@19,@25,@31,@39,@43,@51,@59,@70,@85,@90];
18             NSArray *valueYs = @[@0,@90,@55,@9,@88,@19,@77,@87,@10,@93,@80,@10,@0];
19             for (int i = 0; i < valueXs.count; i++) {
20                 XJDataModel *model = [XJDataModel new];
21                 model.xValue = valueXs[i];
22                 model.yValue = valueYs[i];
23                 [datas addObject:model];
24             }
25         [self.chartView drawLineChartViewWithDataModels:datas withXAxisData:[self setXAxis]];
26         a = 0;
27     }
28 }

在画线的具体实现里面,先赋值x轴文案,然后描点画线并设置动画效果

1 – (void)drawLineChartViewWithDataModels:(NSArray<XJDataModel *> *)datas withXAxisData:(NSArray< XJXAxisModel * >*)xAxis{
2     [self reset];
3 //    1. 设置x轴文案
4     [self setXAxisData:xAxis];
5     if (datas.count == 0) {
6         return;
7     }
8 //    [shapeLayer removeFromSuperlayer];
9     //2.获取目标值点坐标
10     NSMutableArray *allPoints = [NSMutableArray array];
11     for (int i = 0; i < datas.count; i++) {
12         XJDataModel *model = [datas objectAtIndex:i];
13         float Y = y_start – scaleY * model.yValue.floatValue;
14         float X = x_start + scaleX * model.xValue.floatValue;
15         NSLog(@”X,Y = (%.2f,%.2f)”,X,Y);
16         CGPoint point = CGPointMake(X, Y);
17         [allPoints addObject:[NSValue valueWithCGPoint:point]];
18     }
19
20 //    画线
21     UIBezierPath *path = [UIBezierPath bezierPath];
22     [path moveToPoint:[allPoints[0] CGPointValue]];
23     CGPoint PrePonit;
24     for (int i =0; i<allPoints.count; i++) {
25         if (i==0) {
26             PrePonit = [allPoints[0] CGPointValue];
27         }else{
28             CGPoint NowPoint = [allPoints[i] CGPointValue];
29             [path addCurveToPoint:NowPoint controlPoint1:CGPointMake((PrePonit.x+NowPoint.x)/2, PrePonit.y) controlPoint2:CGPointMake((PrePonit.x+NowPoint.x)/2, NowPoint.y)]; //三次曲线
30             PrePonit = NowPoint;
31         }
32     }
33     shapeLayer = [CAShapeLayer layer];
34     shapeLayer.path = path.CGPath;
35     shapeLayer.lineWidth = 2.0;
36     shapeLayer.strokeColor = [UIColor orangeColor].CGColor;
37     shapeLayer.fillColor = [UIColor clearColor].CGColor;
38     shapeLayer.borderWidth = 3.0;
39     [self.subviews[0].layer addSublayer:shapeLayer];
40 //    加动画
41     CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@”strokeEnd”];
42     animation.duration = 1.0;
43     animation.fromValue = @0.0f;
44     animation.toValue = @1.0f;
45     [shapeLayer addAnimation:animation forKey:@”strokeEnd”];
46     for (int i = 0; i < datas.count; i++) {
47         CGPoint point =[allPoints[i] CGPointValue];
48         UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(point.x-2.5, point.y-2.5, 5, 5) cornerRadius:5];
49         CAShapeLayer *layer = [CAShapeLayer layer];
50         layer.strokeColor = [UIColor whiteColor].CGColor;
51         layer.fillColor = [UIColor whiteColor].CGColor;
52         layer.path = path.CGPath;
53         [self.subviews[0].layer addSublayer:layer];
54         [pointShapeLayers addObject:layer];
55     }
56 }

 

iOS 高德室内地图导航功能的简单实现

打开高德官网:http://lbs.amap.com/ ,并注册、登录,在控制台中创建应用,拿到Key值。

点击iOS室内地图SDK

开发文档:http://lbs.amap.com/api/ios-indoor-sdk/summary/ ,在下面有相关下载,下载SDK

然后按照开发文档创建和配置工程,另外需要申请室内地图的数据,才能用。

首先,在ViewController里面,导入sdk

#import <IndoorMapSDK/IndoorMapSDK.h>

#import <OnlineLocationSDK/OnlineLocationSDK.h>

然后继承:OIMMapViewDelegate(室内地图),OIMRoutePlanningDelegate(线路规划)

创建对象:

@property (nonatomic,strong) OIMMapView *imapView;

//室内地图路算对象

@property(nonatomic, strong)OIMRoutePlanning* imRoutePlanning;

//路算起点

@property(nonatomic, strong)OIMFeature* selectedFeature;

//路算起点

@property(nonatomic, strong)OIMFeature* routePlanningStart;

在viewDidLoad方法里面初始化OIMMapView

_imapView = [[OIMMapView alloc]initWithFrame:self.view.bounds];

//    _imapView.showsIndoorMap = YES;

_imapView.key = App_key;

[_imapView setBuildingId:BuildingId floorNo:1];

_imapView.delegate = self;

_imapView.showRoutePlanning = YES;

_imapView.showLocationPoint = YES;

_imapView.showZoomControl = NO;

 

[self.view addSubview:_imapView];

其中,App_key是在官网创建应用给的key,BuildingId是申请室内地图数据时,高德给的BuildingId;

然后实现代理方法

#pragma mark – OIMMapViewDelegate

-(void)mapView:(OIMMapView *)mapView didFinishLoadingMap:(NSString *)buildingId floorNo:(int)floorNo

{

}

-(void)mapView:(OIMMapView*)mapView didFailLoadingMap:(NSString*)buildingId floorNo:(int)floorNo withError:(NSError *)error{
[self alert:error.description message:@””];

 

}

//加载楼层

-(void)mapView:(OIMMapView*)mapView willStartLoadingFloor:(NSString*)buildingId floorNo:(int)floorNo{
}

-(void)mapView:(OIMMapView*)mapView didFinishLoadingFloor:(NSString*)buildingId floorNo:(int)floorNo{

}

/*!

*  @brief  点击地图完成

*

*  @param mapView 室内地图对象

*  @param feature 点击的POI

*

*  @since 2.0.0

*/

-(void)mapView:(OIMMapView*)mapView didClickFeature:(OIMFeature*)feature{
//清除所有的选择气泡显示

[self.imapView clearStatus:OIMFeatureStatus_Selected];

//清除所有的高亮显示

[self.imapView setFeature:self.selectedFeature highlight:NO];

//设置点击的对象显示气泡

[self.imapView setFeature:feature status:OIMFeatureStatus_Selected];

//设置点击的对象高亮

[self.imapView setFeature:feature highlight:YES];

self.selectedFeature = feature;

//如果还没有路算起点

if(self.routePlanningStart==nil)

{
//清除路算结果

[self.imapView setShowRoutePlanning:NO];

//设置路算起点

self.routePlanningStart = feature;

//设置路算起点图标

[self.imapView setFeature:feature status:OIMFeatureStatus_RouteStart];

//清除路算终点图标

[self.imapView clearStatus:OIMFeatureStatus_RouteStop];

//清除选择图标

[self.imapView clearStatus:OIMFeatureStatus_Selected];

 

}

else

{
//显示路算结果

[self.imapView setShowRoutePlanning:YES];

//设置路算终点图标

[self.imapView setFeature:feature status:OIMFeatureStatus_RouteStop];

//清除选择图标

[self.imapView clearStatus:OIMFeatureStatus_Selected];

if(self.imRoutePlanning == nil)

{
//初始化室内路算对象

self.imRoutePlanning = [[OIMRoutePlanning alloc]initWithDelegate:self];

//设置路算对象的KEY

self.imRoutePlanning.key = App_key;

}

//路算请求

[self.imRoutePlanning requestRoutePlanning:BuildingId fromPoiId:self.routePlanningStart.pid toPoiId:feature.pid];

//清除路算起点

self.routePlanningStart = nil;

 

}

 

}

这样我们就可以在室内设置起点和终点然后规划路线了。


其实按照sdk的文档,我们可以拿到某个楼层上的所有模块的信息:

NSArray* floorList = [self.imapView getFloorList];

NSLog(@”%@”,floorList);

但是他返回的

(

(null)[0]B1,

(null)[0]F1,

(null)[0]F2,

(null)[0]F3,

(null)[0]F4,

(null)[0]F5

)

打断点是

然后我就问高德,*后人家说这不是技术问题,是人家不提供这个功能(我去,早说嘛,害的我还以为配置有问题,重新搞了好几次)。

所以就不要纠结了。安卓的可以试试,看看行不行。

mac上终端命令行下载东西

首先cd到要下载的文件夹目录下,比如我要下载一个mp4文件,在终端键入

curl -o card.mp4 http://lw1089-hc34.aipai.com/user/596/17601596/1006/card/44113620/card.mp4?to=aipai

iOS transform的简单使用

一、 transform 属性
在OC中,通过 transform 属性可以修改对象的平移、缩放比例和旋转角度。

1)创建“基于控件初始位置”的形变

CGAffineTransformMakeRotation ——旋转

CGAffineTransformMakeTranslation ——平移

CGAffineTransformMakeScale ——缩放

2)创建“基于 transform 参数”的形变

CGAffineTransformTranslate

CGAffineTransformScale

CGAffineTransformRotate

补充:在OC中,所有跟角度相关的数值,都为弧度制 180度 = M_PI , 45度 = M_PI_4 。

正数表示顺时针旋转,负数表示逆时针旋转。

“基于 transform 参数”的形变可以基于控件上一次的状态进行叠加形变,如先旋转再平移。

二、示例
用代码在 viewDidLoad 中添加控制旋转的按钮:

1     //向左旋转按钮
2     UIButton *leftrotatebtn = [UIButton buttonWithType:UIButtonTypeCustom];
3     leftrotatebtn.frame = CGRectMake(125, 450, 80, 40);
4     [leftrotatebtn setTitle:@”向左旋转” forState:UIControlStateNormal];
5    [leftrotatebtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
6     [leftrotatebtn setTag:1];
7    [self.view addSubview:leftrotatebtn];
8     //添加按钮的单击事件
9    [leftrotatebtn addTarget:self action:@selector(rotate:) forControlEvents:UIControlEventTouchUpInside];
10
11     //向右旋转按钮
12     UIButton *rightrotatebtn = [UIButton buttonWithType:UIButtonTypeCustom];
13     rightrotatebtn.frame = CGRectMake(125, 500, 80, 40);
14     [rightrotatebtn setTitle:@”向右旋转” forState:UIControlStateNormal];
15    [rightrotatebtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
16     [rightrotatebtn setTag:0];
17    [self.view addSubview:rightrotatebtn];
18     //添加按钮的单击事件
19     [rightrotatebtn addTarget:self action:@selector(rotate:) forControlEvents:UIControlEventTouchUpInside];

viewDidLoad 是视图加载完成后调用的方法,通常在此方法中执行视图控制器的初始化工作。

添加旋转按钮响应事件:

1 – (void)rotate:(id)sender{
2     UIButton *button = (UIButton *)sender;
3     if (button.tag) {
4         //self.headImageView.transform = CGAffineTransformMakeRotation(-M_PI_4);
5         //逆时针旋转
6         self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, -M_1_PI);
7     } else {
8         //顺时针旋转
9         self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, M_PI_4);
10    }
11 }

iOS兼容问题-transform

iOS兼容问题-transform

*近在弄一个bug,公司在弄一个阅读器的软件,在阅读页点击下面的导航目录时,目录能够从左至右的方向缓慢出来,用的

transform: translate(255px, 0px) translateZ(0px);  //目录出现

transform: translate(0px, 0px) translateZ(0px);    //目录隐藏

来进行目录的显示和隐藏。在安卓手机能够自由切换,并且页面正常但是在苹果手机上就不行。在苹果手机上进行阅读是点击目录然后在进入阅读页,屏幕向右侧滑动会出现白色空白且大小目录一致,然后我就觉得是目录影响了阅读页,开始我认为是因为position定位的问题,原本是position:relative;后来我改成了absolute;空白是没有了;但是引出了一系列的原本没有的bug!!!

所以这个解决方法不行。方寸大乱…..

后来实在没办法了,我就改掉了$Woread.transUtil(“.rb_all, .raad_box_ml”, 0);这样的切换写法也就是上方的transform改成了

//目录出现,阅读页的左边left定位到目录的右侧位置

$(“.raad_box_ml”).css(“left”,”0px”);
$(“.rb_all”).css(“left”,”255px”);

 

//目录隐藏,阅读页的左边left定位到屏幕左边缘

$(“.raad_box_ml”).css(“left”,”-255px”);  //.raad_box_ml目录的class,255px也为目录的宽度
$(“.rb_all”).css(“left”,”0px”);   //.rb_all为整个阅读页(不包括目录)的class

这样写 IOS和Android都能兼容了。

这个问题困扰了我3天左右,我觉得的是transform在IOS下有点不兼容。也许是我想错了,有知道的大神可以指出,虚心接受~~~

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速