【麦子学院】Objective-C Class Ivar Layout 的使用方法详解
麦子学院Android开发教程TelephonyManager类的使用

Android中经常会涉及到TelephonyManager类的使用,下面我们来看看相关的代码:main.xml布局文件java代码:1.<?xml version="1.0" encoding="utf-8"?>2.<LinearLayoutxmlns:android="/apk/res/android"3.android:orientation="vertical"4.android:layout_width="fill_parent"5.android:layout_height="fill_parent">6.7.8.<ScrollView9.android:fillViewport="true"10.android:layout_width="fill_parent"11.android:layout_height="fill_parent">12.13.<ListView14.android:id="@+id/listView"15.android:layout_width="fill_parent"16.android:layout_height="fill_parent" />17.</ScrollView>18.</LinearLayout>复制代码array.xml文件java代码:1.<?xml version="1.0" encoding="utf-8"?>2.<resources>3.4.<string-array name="listItem">5.<item>设备编号</item>6.<item>SIM卡国别</item>7.<item>SIM卡序列号</item>8.<item>SIM卡状态</item>9.<item>软件版本</item>10.<item>网络运营商代号</item>11.<item>网络运营商名称</item>12.<item>手机制式</item>13.<item>设备当前位置</item>14.</string-array>15.<string-array name="simState">16.<item>状态未知</item>17.<item>无SIM卡</item>18.<item>被PIN加锁</item>19.<item>被PUK加锁</item>20.<item>被NetWork PIN加锁</item>21.<item>已准备好</item>22.</string-array>23.<string-array name="phoneType">24.<item>未知</item>25.<item>GSM</item>26.<item>CDMA</item>27.</string-array>28.</resources>复制代码清单文件java代码:1.<?xml version="1.0" encoding="utf-8"?>2.3.<manifest xmlns:android="/apk/res/android"4.package="eoe.demo" android:versionCode="1"5.android:versionName="1.0">6.<application android:icon="@drawable/icon"7.android:label="@string/app_name">8.<activity android:name=".TelephonyManagerActivity"9.android:label="@string/app_name">10.<intent-filter>11.<action android:name="android.intent.action.MAIN" />12.13.<category14.android:name="UNCHER" />15.</intent-filter>16.</activity>17.18.</application>19.<uses-sdk android:minSdkVersion="7" />20.<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION" /> 21.<uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />22.</manifest>复制代码TelephonyManagerActivity类java代码:1.package eoe.demo;2.3.import java.util.ArrayList;4.import android.app.Activity;5.import android.content.Context;6.import android.os.Bundle;7.import android.telephony.TelephonyManager;8.import android.view.Gravity;9.import android.view.View;10.import android.view.ViewGroup;11.import android.widget.BaseAdapter;12.import android.widget.LinearLayout;13.import android.widget.ListView;14.import android.widget.TextView;15.16.public class TelephonyManagerActivity extends Activity {17.private ListView listView=null;18.private TelephonyManager tm=null;19.private String[] phoneType=null;20.private String[] simState=null;21.private String[] listItems=null;22.23.ArrayList<String> listValues=new ArrayList<String>();24.BaseAdapter adapter=new BaseAdapter(){25.public int getCount() {26.return listItems.length;27.}28.29.public Object getItem(int position) {30.return listItems[position];31.}32.33.public long getItemId(int position) {34.return position;35.}36.37.public View getView(int position, View convertView, ViewGroup parent) {38.LinearLayout ll=new LinearLayout(TelephonyManagerActivity.this);39.ll.setOrientation(LinearLayout.VERTICAL);40.TextView tvItem=new TextView(TelephonyManagerActivity.this);Item.setTextSize(24);Item.setText(listItems[position]);Item.setGravity(Gravity.LEFT);//设置在父容器中的对齐方式44.ll.addView(tvItem);45.TextView tvValue=new TextView(TelephonyManagerActivity.this);Value.setTextSize(18); //设置字体大小Value.setText(listValues.get(position)); //设置显示的内容Value.setPadding(0, 0, 10, 10); //设置四周边界Value.setGravity(Gravity.RIGHT);50.ll.addView(tvValue);51.return ll;52.}53.54.};55.56.@Override57.public void onCreate(Bundle savedInstanceState) {58.super.onCreate(savedInstanceState);59.setContentView(yout.main);60.listItems=getResources().getStringArray(R.array.listItem);61.simState=getResources().getStringArray(R.array.simState);62.phoneType=getResources().getStringArray(R.array.phoneType);63.tm=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);64.listView=(ListView)findViewById(R.id.listView);65.initListValues();66.listView.setAdapter(adapter);67.}68.69./**70.* 获取各个数据项的值71.*/72.public void initListValues(){73.listValues.add(tm.getDeviceId());//获取设备编号74.listValues.add(tm.getSimCountryIso());//获取SIM卡国别75.listValues.add(tm.getSimSerialNumber());//获取SIM卡序列号76.listValues.add(simState[tm.getSimState()]);//获取SIM卡状态77.listValues.add((tm.getDeviceSoftwareVersion()!=null?tm.getDeviceSoftwareVersion():"未知"));78.//获取软件版本79.listValues.add(tm.getNetworkOperator());//获取网络运营商代号80.listValues.add(tm.getNetworkOperatorName());//获取网络运营商名称81.listValues.add(phoneType[tm.getPhoneType()]);//获取手机制式82.listValues.add(tm.getCellLocation().toString());//获取设备当前位置83.}84.}如需了解更多相关知识,请至麦子学院官网查询(/)。
【麦子学院】iOS开发自动布局高级用法详解

【麦子学院】iOS开发自动布局高级用法详解最近在网上看到一个iOS大牛写的iOS开发自动布局高级用法,觉得很有意思,分享出来,大家一起学习。
熟悉iOS开发的人,可能都知道,iOS6出来以后,autolayout自动布局就出现了,但是刚开始大家都不怎么用,直到iPhone 5s、iPhone6出来后,屏幕变得越来越多样,单纯用if来判断尺寸已完全不能满足了,自动布局才逐渐走进程序猿的编程代码中。
Autolayout自动布局为什么能被大家所常用呢?可能大家都知道之前有一个自动伸缩的autoresizing属性,主要适用于一个控件和自己父控件之间的关系,而只有autolayout 才真正可以在任意两个控件中建立关系。
autoresizingautoresizing需要注意的是 storyboard中设置的约束和手码中设置的约束是相反的。
storyboard图形页面里点的右边的线和下边的线的意思是“固定”而手码中常用的autoresizingMasks属性中的枚举都是Flexible可“伸缩”的。
所以假如想要让右边和下边的距离固定,在代码中应该设置左边和上边的可伸缩约束。
yellowView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin;有了autolayout之后这个自动伸缩很少用了一共七个属性。
无,宽可伸缩,高可伸缩,左间距可伸缩,右间距可伸缩,上间距可伸缩,下间距可伸缩UIViewAutoresizingNone = 0,UIViewAutoresizingFlexibleWidth = 1 << 1,UIViewAutoresizingFlexibleHeight = 1 << 4, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleRightMargin = 1 << 2, UIViewAutoresizingFlexibleTopMargin = 1 << 3, UIViewAutoresizingFlexibleBottomMargin = 1 << 5每个枚举值都是位移枚举,可以在一行代码中传多个值。
麦子学院Android开发教程之receiver定制自动启动程序

Android开发过程中,有时需要用receiver定制一个自动启动程序,具体如下:android 有一个系统Broadcast 其action ="android.intent.action.BOOT_COMPLETED" 用途就是通知系统已经启动完毕.我们的做法就是创建一个BroadcastReceiver 用来接收该Broadcast 在收到以后通过startActivity / startService 来启动目标应用直接上代码把:1.AndroidManifest.xml文件Java代码1.<?xml version="1.0" encoding="utf-8"?>2.<manifest xmlns:android="/apk/res/android"3. package=""4. android:versionCode="1"5. android:versionName="1.0">6. <application android:icon="@drawable/icon"android:label="@string/app_name">7. <activity android:name=".SystemUpApp"8. android:label="@string/app_name">9. <intent-filter>10. <action android:name="android.intent.action.MAIN" />11. <category android:name="UNCHER" />12. </intent-filter>13. </activity>14. <receiver android:name="UpNotificationListener" >15. <intent-filter>16. <actionandroid:name="android.intent.action.BOOT_COMPLETED" />17. <category android:name="android.intent.category.HOME" />18. </intent-filter>19. </receiver>20. </application>21. <uses-sdk android:minSdkVersion="2" />22.23.</manifest>24.复制代码2. SystemUpApp.java文件Java代码1.package ;2.3.import android.app.Activity;4.import android.os.Bundle;5.6.public class SystemUpApp extends Activity {7. /** Called when the activity is first created. */8. @Override9. public void onCreate(Bundle savedInstanceState) {10. super.onCreate(savedInstanceState);11. setContentView(yout.main);12. }13.}14.复制代码3. UpNotificationListener.java文件Java代码1.package com.android.AppSystemUp;2.3.import android.content.BroadcastReceiver;4.import android.content.Context;5.import android.content.Intent;6.7.public class UpNotificationListener extends BroadcastReceiver {8. @Override9. public void onReceive(Context context, Intent intent) {10. // TODO Auto-generated method stub11. Intent i = new Intent(context, SystemUpApp.class);12.13. i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);14.15. context.startActivity(i);16.17. }18.}19.20.复制代码4.main.xml文件Java代码1.<?xml version="1.0" encoding="utf-8"?>2.<RelativeLayoutxmlns:android="/apk/res/android"3. android:orientation="vertical" android:layout_width="fill_parent"4. android:layout_height="fill_parent">5. <TextView android:id="@+id/text"android:layout_width="wrap_content"6. android:layout_height="wrap_content" android:text="Start Afterthe System launch Completely"7. android:layout_centerInParent="true" android:ellipsize="marquee"/>8.</RelativeLayout>9.复制代码如需了解更多相关知识,请至麦子学院官网查询(/)。
【麦子学院】Objective-C语言的现代语法和新特性详解

【麦子学院】Objective-C语言的现代语法和新特性详解在iOS应用开发中,虽然Swift已经发展到了2.0版本,是一款很强大的基础语言,各种特性使用起来也很方便简洁,但是毕竟是一门新语言,现在大部分的iOS商业项目中还是使用的稳定性比较好的Objective-C语言。
本文小编为大家分享的就是Objective-C的一些现代语法和新特性,一起来看下吧。
instancetype在instancetype有效的情况下,应该尽量去使用instancetype。
至于什么是合适的时候,可以参考stack overflow上面所说:“Use instancetype whenever it's appropriate, which is whenever a class returns an instance of that same class.”Properties使用Properties来代替实例变量有很多优势:1、Auto synthesized getters and setters. 使用@property声明的属性能自动生成getter 与setter方法。
2、Better declaration of intent of a set of methods. 比为属性声明一系列方法代码上要清晰很多。
3、Property keywords that express additional information about behavior. Property使用其他的一些关键子可以表达一些实例变量无法表达的信息,比如 assign, weak, atomic等等。
Property方法有一个非常简明的命名规范,getter方法的名称是property的名称,setter方法的名称是在property名称之前添加set前缀(驼峰法)。
通过还可以通过getter 关键字指定getter的名称。
ios layoutifneeded 用法

ios layoutifneeded 用法layoutIfNeeded 是iOS 开发中UIView 类的一个方法,用于立即更新视图的布局。
在 Auto Layout 环境中,这个方法会强制立即调用未完成的布局操作,确保视图层次的布局已经被计算和应用。
一般情况下,iOS 在下一次运行循环时才会执行布局。
但有时,你可能希望立即执行布局,而不等到下一次运行循环。
这时就可以使用 layoutIfNeeded 方法。
使用方式如下:// Swift 语言示例youtIfNeeded()objectiveCopy code// Objective-C 语言示例[yourView layoutIfNeeded];这个方法通常在以下几种情况下使用:立即更新布局:当你对某个视图进行了约束变更后,调用layoutIfNeeded 会立即触发布局更新,而不是等到下一次运行循环。
动画中的布局更新:在执行视图动画时,有时你可能希望立即执行布局以确保动画效果的正确呈现。
获取视图的准确尺寸:如果你希望获取视图最新的尺寸信息,可以在调用 layoutIfNeeded 后再获取。
示例:// 在修改约束后立即更新布局yourConstraint.constant = 50youtIfNeeded()// 在动画中立即更新布局UIView.animate(withDuration: 0.3) {// 修改约束或其他属性youtIfNeeded()}请注意,过度使用 layoutIfNeeded 可能会导致性能问题,因为它会强制立即计算布局。
在大多数情况下,系统自动的布局计算机制足以满足需求,只有在需要时才应该手动调用。
layout基本知识培训

1
3
2
6
机密
1阶
宁波现代俊铭企业管理咨询有限公司
工厂总平面布置的方法
专业、用心、服务
Professional Canninessd Service
1 送货车
斜面
墙
接收办 公室
2 隔板
1
磅秤
零 1件
架
台5
点数台 4
4 3
零 2件
架
零 件 架
检验台
2
机密
台
台
1
4
2
废品桶 开包处
接 收1
台 6
台
2
台 7
原则五:在作业的角度注意:安全及便于操作
机密
宁波现代俊铭企业管理咨询有限公司
专业、用心、服务
Professional Canninessd Service
二、LAYOUT改善的基本原则
原则六:对于未来变化具有充分应变力,方案有弹性 对应产量变化、工艺变化、设备更新等情况。
为将来的大
型生产作准 备
预测生产量的增加
Professional Canninessd Service
为了有效的利用空间,工厂的各区块式进行适当的设计与布置。 - 生产线, 仓库, 配套设施, Dock场, 公司内道路和出入门
机密
宁波现代俊铭企业管理咨询有限公司
yout概要
6.本次课程Layout范围
·建筑物、工场Layout方面,工场长(事业部长)的想法非常重要。
原则四:尽可能利用立体空间(面积最小原则) 减少地面放置立体空间摆放
里面有效利 用两层
网架式 立体存储
由小型升降机提供组装零件 利用空间时,要特别注意安全 货物必须易拿易放
学习Objective-C入门教程(全)

学习Objective-C入门教程1,前言相信iPhone不久就要在国内发布了,和我们在国内可以通过正规渠道买得到的iPodTouch一样,iPhone也是一个激动人心的产品。
iPhone发布的同时,基于iPhone的程序也像雨后春笋一样在iTunes里面冒出来。
你将来也许会考虑买一个iPhone,体验一下苹果的富有创意的种种应用;你也许会考虑向iTunes的社区的全世界的人们展示一下你非凡的创意,当然也可以通过你的创意得到一些意想不到的收益。
OK,你也许迫不及待的准备开发了。
但是先等一下,让我们回忆一下最初的电影是怎么拍摄的。
这个很重要,因为和iPhone的开发比较类似。
在最初因为器材比较原始,所以拍摄电影需要很高的技术,那个时候的电影的导演基本上是可以熟练操作摄影器材的人。
随着器材的完善,使用也简单起来。
于是器材的使用不是决定一个电影的质量的唯一的因素,取而代之的是故事或者说电影的创意。
iPhone的开发也是这样。
当然从入门到掌握的过程来说任何事情都是开始比较难,随着掌握的程度的加深,你将会觉得开发iPhone应用程序是一件简单而且轻松的事情,到了那个时候,你的主要的制胜武器就不是开发技术,而是你的创意了。
对于你来说,我在这里写的东西都是有关“摄影器材”也就是介绍如何使用iPhone的平台来开发应用程序。
iPhone的开发语言是Objective-C。
Objective-C是进行iPhone开发的主要语言,掌握了Objective-C的基本语法以及数据结构之后,你需要熟悉一下iPhone的SDK。
笔者很难做到在一篇文章里面把所有的东西都介绍清楚,所以笔者打算分成两个主题,一个是Objective-C,一个是iPhone开发。
本系列将侧重于Objective-C。
当然,任何一种开发语言都无法脱离于运行环境,Objective-C也不例外。
所以在本系列当中也会穿插的介绍一些SDK里面的一些特性,主要是数据结构方面,比如说NSString,NSArray等等。
麦子学院Android开发课程Gallery与GridView浅析

GridView(网格视图)简介GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的。
主要用于设置Adapter。
GridView常用的XML属性:下面有三个例子,第一个是只显示图片的,第二个是显示图片文字的(这里的图片是Android系统自带的图片),第三个是显示自定义的图片文字。
前面两个例子的实现都不是很难,第三个例子的实现有些复杂,学习GridView的时候,就想着能不能自定义自己喜欢的图片加上文字,在网上找些资料,一般都是第二个例子的形式的,最后在视频学习上找到了能实现自定义自己的图片的例子。
自己就照着例子去学习,修改成了第三个例子。
例:MainActivity.java1.package com.android.gridview.activity;2.3.import android.app.Activity;4.import android.content.Context;5.import android.os.Bundle;6.import android.view.View;7.import android.view.ViewGroup;8.import android.widget.AdapterView;9.import android.widget.AdapterView.OnItemClickListener;10.import android.widget.BaseAdapter;11.import android.widget.GridView;12.import android.widget.ImageView;13.import android.widget.Toast;14.15.public class MainActivity extends Activity {16. @Override17. public void onCreate(Bundle savedInstanceState) {18. super.onCreate(savedInstanceState);19. setContentView(yout.main);20. GridView gv = (GridView)findViewById(R.id.GridView1);21.//为GridView设置适配器22. gv.setAdapter(new MyAdapter(this));23.//注册监听事件24. gv.setOnItemClickListener(new OnItemClickListener()25. {26. public void onItemClick(AdapterView<?> parent, View v, int position, long id)27. {28. Toast.makeText(MainActivity.this, "pic" + position,Toast.LENGTH_SHORT).show();29. }30. });31. }32.}33.//自定义适配器34. class MyAdapter extends BaseAdapter{35.//上下文对象36. private Context context;37.//图片数组38. private Integer[] imgs = {39. R.drawable.pic0, R.drawable.pic1, R.drawable.pic2,40. R.drawable.pic3, R.drawable.pic4, R.drawable.pic5,41. R.drawable.pic6, R.drawable.pic7, R.drawable.pic8,42. R.drawable.pic0, R.drawable.pic1, R.drawable.pic2,43. R.drawable.pic3, R.drawable.pic4, R.drawable.pic5,44. R.drawable.pic6, R.drawable.pic7, R.drawable.pic8,45. };46. MyAdapter(Context context){47. this.context = context;48. }49. public int getCount() {50. return imgs.length;51. }52.53. public Object getItem(int item) {54. return item;55. }56.57. public long getItemId(int id) {58. return id;59. }60.61.//创建View方法62. public View getView(int position, View convertView, ViewGroup parent) {63. ImageView imageView;64. if (convertView == null) {65. imageView = new ImageView(context);66. imageView.setLayoutParams(new youtParams(75, 75));//设置ImageView对象布局67. imageView.setAdjustViewBounds(false);//设置边界对齐68. imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);//设置刻度的类型69. imageView.setPadding(8, 8, 8, 8);//设置间距70. }71. else {72. imageView = (ImageView) convertView;73. }74. imageView.setImageResource(imgs[position]);//为ImageView设置图片资源75. return imageView;76. }77.}78.79.80.main.xml1.<?xml version="1.0" encoding="utf-8"?>2.<LinearLayout xmlns:android="/apk/res/android"3. android:orientation="vertical"4. android:layout_width="fill_parent"5. android:layout_height="fill_parent"6. >7. <GridView8. android:id="@+id/GridView1"9. android:layout_width="wrap_content"10. android:layout_height="wrap_content"11. android:columnWidth="90dp"12. android:numColumns="3"13. android:verticalSpacing="10dp"14. android:horizontalSpacing="10dp"15. android:stretchMode="columnWidth"16. android:gravity="center"17. />18.</LinearLayout>效果图:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【麦子学院】Objective-C Class Ivar Layout 的使用方法详解
虽然现在swift语言的使用越来越广泛了,但作为iOS开发20多年御用开发语言的Objective-C仍有着相当大的用户群,现在要从事iOS开发,不会Objective-C根本就不能
称之为iOS开发者。
今天小编就为大家介绍一下Objective-C Class Ivar Layout的相关应用。
当定义一个类的实例变量的时候,可以指定其修饰符:
@interface Sark : NSObject {
__strong id _gayFriend; // 无修饰符的对象默认会加 __strong
__weak id _girlFriend;
__unsafe_unretained id _company;
}
@end
这使得 ivar (instance variable) 可以像属性一样在 ARC 下进行正确的引用计数管理。
那么问题来了,假如这个类是动态生成的:
Class class = objc_allocateClassPair(NSObject.class, "Sark", 0);
class_addIvar(class, "_gayFriend", sizeof(id), log2(sizeof(id)), @encode(id));
class_addIvar(class, "_girlFriend", sizeof(id), log2(sizeof(id)), @encode(id));
class_addIvar(class, "_company", sizeof(id), log2(sizeof(id)), @encode(id));
objc_registerClassPair(class);
该如何像上面一样来添加 ivar 的属性修饰符呢?刨根问底了一下,发现 ivar 的修饰信息存放在了 Class 的 Ivar Layout 中:
struct class_ro_t {
uint32_t flags;
uint32_t instanceStart;
uint32_t instanceSize;
#ifdef __LP64__
uint32_t reserved;
#endif
const uint8_t * ivarLayout; // <- 记录了哪些是 strong 的 ivar
const char * name;
const method_list_t * baseMethods;
const protocol_list_t * baseProtocols;
const ivar_list_t * ivars;
const uint8_t * weakIvarLayout; // <- 记录了哪些是 weak 的 ivar
const property_list_t *baseProperties;
};
ivarLayout 和 weakIvarLayout 分别记录了哪些 ivar 是 strong 或是 weak,都未记录的就是基本类型和 __unsafe_unretained 的对象类型。
这两个值可以通过 runtime 提供的几个 API 来访问:
const uint8_t *class_getIvarLayout(Class cls)
const uint8_t *class_getWeakIvarLayout(Class cls)
void class_setIvarLayout(Class cls, const uint8_t *layout)
void class_setWeakIvarLayout(Class cls, const uint8_t *layout)
但我们几乎没可能用到这几个 API,IvarLayout 的值由 runtime 确定,没必要关心它的存在,但为了解决上述问题,我们试着破解了 IvarLayout 的编码方式。
举个例子说明,若类定义为:
@interface Foo : NSObject {
__strong id ivar0;
__weak id ivar1;
__weak id ivar2;
}
@end
则储存 strong ivar 的 ivarLayout 的值为 0x012000
储存 weak ivar 的 weakIvarLayout 的值为 0x1200
一个 uint8_t 在 16 进制下是两位,所以编码的值每两位一对儿,以上面的 ivarLayout 为例:
前两位 01 表示有 0 个非 strong 对象和 1 个 strong 对象
之后两位 20 表示有 2 个非 strong 对象和 0 个 strong 对象
最后两位 00 为结束符,就像 cstring 的 \0 一样
同理,上面的 weakIvarLayout:
前两位 12 表示有 1 个非 weak 对象和接下来连续 2 个 weak 对象
00 结束符
这样,用两个 layout 编码值就可以排查出一个 ivar 是属于 strong 还是 weak 的,若都没有找到,就说明这个对象是 unsafe_unretained.
以上就是Objective-C Class Ivar Layout的使用方法,这个知识点在iOS开发中还是比较重要的,看完上面的介绍,大家可以自己动手操作下,加深相关知识的掌握。
推荐阅读:《iOS开发环境及常用工具详解》。