ios 7第一个应用程序HelloWorld
第一个应用程序HelloWorld
iOS7 Beta已经发布了,迫不及待地下载了iOS 7及Xcode 5并体验了一下。先做一个简单的Hello World看看都有哪些变化吧。
1. 启动 Xcode5-DP ;
2. 从菜单选择 File - New Project... ,弹出如下窗口:
注意,在此多了一个 SpriteKit Game 的模板,暂时先不管它,还是选择熟悉的 Single View Application ,然后单击Next按钮;
3. 在接下来的对话框的 Product Name 输入框中输入: HelloWorld ,如下图所示:
备注 :相比较 Xcode 4.6 版本,新建项目选项中没有了 Use Storyboards(使用故事板) 、 Use Automatic Reference Counting(使用自动引用计数) 和 Include Unit Tests(包含单元测试) 三个选项。
4. 单击 Next 按钮,在接下来的对话框中选择保存项目的位置,建议勾选上 Create git repository on My Mac 选项,虽然本文不准备涉及有关git的内容,不过使用代码管理器开发是一个非常好的习惯~_~。选择好位置之后,单击 Create 按钮。
5. 接下来Xcode会自动为您创建并打开项目,不过映入眼帘的是白茫茫一片啊,呵呵。先看下菜单有什么变化,见下图:
回顾一下4.6的菜单,见下图:
不难发现多了三项,分别是: Find(查找) 、 Debug(调试) 、 Source Control(源代码控制) 。具体细节朋友们可以自己探索一下,本文不再赘述了。
6. 单击下图中箭头位置的 Open project and targets list(打开项目及目标列表) 按钮;
7. 现在Xcode的界面有那么一丝熟悉的味道了,~_~,如下图所示:
标注1:可以选择开发者账号,如果您有多个开发者账号,在这里选择一个就可以了;
标注2:设置设备方向;
标注3:应用程序启动时是否隐藏状态栏;
备注 :除标注1是新增选项之外,其他两项是在Xcode4.6版本中都已经包含的,这几个选项也是在新建iOS项目时经常会修改的。
8. 向下滚动项目属性窗口,可以看到图标和应用程序图像设置属性,如下图所示:
备注: Images.xcassets 是Xcode 5的一个新特性,其引入的一个主要原因是为了方便应用程序同时支持iOS 6和iOS 7,具体内容本文暂不介绍,有兴趣的朋友可以参阅苹果官方的 iOS 7 UI Transition Guide 。
9. 单击项目属性的 Capabilities 选项卡,如下图所示:
其中包含了iCloud、Game Center、Passbook、IAP、Maps等功能的开关,并附有引入这些功能的简单提示~_~
OK,有关Xcode 5界面的变化,先简单先熟悉到这,下面完成一个简单的HelloWorld :]
9. 开始之前,先运行一下看看效果,如下图所示:
太平了,都看不见了,呵呵。
10. 单击Main.storyboard,添加一个Text Field,一个Label和一个Button,调整并设置各控件大小、位置以及默认文字,如下图所示:
11. 单击工具栏右侧中间的按钮,打开助理编辑器,并切换到 ViewController.h 文件,如下图所示:
12. 用Control+拖拽的方式,将Text Field和Label的IBOutlet拖拽到头文件中,并将Button的Action拖拽到头文件中,完成后的头文件如下所示:
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextField * helloText; @property (weak, nonatomic) IBOutlet UILabel * helloLabel; - (IBAction)clickHelloButton:( id )sender; @end
13. 单击上图中标注2的位置,切换到 ViewController.m 文件,使用如下代码替换clickHelloButton:方法:
- (IBAction)clickHelloButton:( id )sender { // 清空空白字符 NSString *str = [_helloText.text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if (str.length > 0 ) { [_helloText setText:str]; [_helloLabel setText:[NSString stringWithFormat: @" Hello %@! " , str]]; } }
14. 运行应用程序,如下图所示:
搞定,收工!
下期预告:iOS7初体验之单元测试。
原创文章,如需转载请注明出处,谢谢!
欢迎访问本人技术微博 趣味苹果开发 相互交流,共同进步!
欢迎访问本人新浪微博 可可爸刘凡
用趣味的心态,开发有趣味的应用!
分类: iOS开发 , 工作随笔
标签: iOS7 , HelloWorld
IOS定位核心与地图
IOS定位核心与地图
Core Location 以及 Map 框架包通常能给我们的应用程序添加定位和地图相关的服务。 Core Location 框架包通常是使用硬件设备来进行定位服务的, Map 框架包通常能够使你的应用程序做一些地图展示与交互的相关功能。地图的定位服务一般需要依赖设备的硬件组成部分。如果有定位的硬件设备,那么肯定是可以利用地图框架包来进行地图的一些相关的操作。
为了能够在项目中使用到位置服务以及地图展示的相关功能,你必须要导入 Core Location 和 Map 这两个框架包。如果你不知道怎么做,那么请参照如下步骤。
1. 点击你的项目工程图标文件。
2. 然后选择 target 选项,如图 1 所示。
3. 然后选择 Build Phase 模块栏。
4. 然后点开 Link Binary With Libraries 栏目,在点击 + 号按钮。
图 1 添加相关的框架包
5.添加MapKit.framework和CoreLocation.framework这两个库
6.在使用地图和定位的地方,导入:
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
MKMapView是UIView的子类,所以可以像一个普通的View一样添加到ViewController的View当中。
以下是相关的代码
ViewController.h
# import <UIKit/UIKit.h>
# import <CoreLocation/CoreLocation.h>
# import <MapKit/MapKit.h>
# import " MyAnnotation.h "
@ interface ViewController : UIViewController <MKMapViewDelegate,CLLocationManagerDelegate>
// MapView
@property (nonatomic,strong) MKMapView *myMapView;// 地图控件
// LocationManager
@property (nonatomic,strong) CLLocationManager *myLocationManager;// 位置管理器
@property (nonatomic,strong) CLGeocoder *myGeoCoder ;// 地理位置和真实地址转换
@end
ViewController.m
# import " ViewController.h "
# import " MKMapView+ZoomLevel.h "@ interface ViewController ()
@end
@implementation ViewController
@synthesize myMapView;
@synthesize myLocationManager;
@synthesize myGeoCoder;- ( void )viewDidLoad
{[ super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 设置根View的背景颜色
self.view.backgroundColor = [UIColor colorWithRed:0x33 / 255.0f green:0x66 / 255.0f blue:0x99 / 255.0f alpha:0xFF / 255.0f];// 初始化MapView并且设置MapView显示的边界
self.myMapView = [[MKMapView alloc]initWithFrame:self.view.bounds];// self.myMapView.mapType = MKMapTypeSatellite;
// self.myMapView.mapType = MKMapTypeHybrid;self.myMapView.mapType = MKMapTypeStandard;
self.myMapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;self.myMapView. delegate = self;
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(40.034122, 116.289574);
MyAnnotation *annotation = [[MyAnnotation alloc]initWithCoordinate:coordinate title:@" 我的位置 " subTitle:@" 这里就是寡人的位置,嘿嘿! "];annotation.pinColor = MKPinAnnotationColorPurple;
[self.myMapView addAnnotation:annotation];
[self.myMapView setShowsUserLocation:YES];
[self.myMapView setCenterCoordinate:coordinate zoomLevel:15 animated:YES];
[self.view addSubview:myMapView];
if ([CLLocationManager locationServicesEnabled]){
self.myLocationManager = [[CLLocationManager alloc]init];
self.myLocationManager. delegate = self;// // 提示用户是否允许当前应用使用地理位置,已过时,在Info.plist中使用NSLocationUsageDescription键值替换
// self.myLocationManager.purpose = @"提示用户是否允许当前应用使用位置,已过时";[self.myLocationManager startUpdatingLocation];
} else {NSLog(@" >>>>>>>>>> 位置服务不可用 <<<<<<<<<<<< ");
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@" 提示 " message:@" 您的位置服务当前不可用,请打开位置服务后重试 " delegate :nil cancelButtonTitle:@" 确定 " otherButtonTitles:nil, nil];[alertView show];
}
CLLocation *location = [[CLLocation alloc]initWithLatitude:40.034122 longitude:116.289574];
self.myGeoCoder = [[CLGeocoder alloc]init];
[self.myGeoCoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks,NSError *error){if (error == nil && [placemarks count] > 0){
CLPlacemark *pm = [placemarks objectAtIndex:0];NSLog(@" 国家:%@ " ,pm.country);
NSLog(@" 邮编:%@ ",pm.postalCode);NSLog(@" Locality:%@ ",pm.locality);
} else if (error == nil && [placemarks count] == 0){NSLog(@" 没有地址返回 ");
} else if (error != nil){NSLog(@" 出错了:%@ ",error);
}}];
[self.myGeoCoder geocodeAddressString:@" 中国北京市海淀区花园东路10号高德大厦 " completionHandler:^(NSArray *placemarks,NSError *error){
if (nil == error && [placemarks count] > 0){NSLog(@" placemarks count:%i ",[placemarks count]);
CLPlacemark *pm = [placemarks objectAtIndex:0];NSLog(@" longitude=%f ",pm.location.coordinate.longitude);
NSLog(@" latitude=%f ",pm.location.coordinate.latitude);} else if ([placemarks count] == 0 && error == nil){
NSLog(@" 找不到给定地址的经纬度 ");} else if (nil != nil){
NSLog(@" 发生了错误:%@ ",error);}
}];
}
- ( void )didReceiveMemoryWarning
{
[ super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}
-( void )viewDidUnload{
[ super viewDidUnload];self.myMapView = nil;
[self.myLocationManager stopUpdatingLocation];self.myLocationManager = nil;
}-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{return YES;
}
/*******************************************************************************************/
/*******************************************************************************************//*************************** MapView的Delegate的方法,全部都是Option的 *************************/
/*******************************************************************************************//*******************************************************************************************/
/*******************************************************************************************/- ( void )mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated {
NSLog(@" mapView:regionWillChangeAnimated:方法被调用 ");
}// 用户的地理位置发生改变的时候调用
- ( void )mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {NSLog(@" mapView:regionDidChangeAnimated:方法被调用 ");
}// 当地图界面将要加载的时候将会调用这个方法
- ( void )mapViewWillStartLoadingMap:(MKMapView *)mapView{NSLog(@" mapViewWillStartLoadingMap:方法被调用 ");
}// 当地图界面加载完成的时候将要调用这个方法
- ( void )mapViewDidFinishLoadingMap:(MKMapView *)mapView{NSLog(@" mapViewDidFinishLoadingMap:方法被调用 ");
}// 当地图界面加载失败的时候调用这个方法
- ( void )mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error{NSLog(@" mapViewDidFailLoadingMap:withError:方法被调用,error is:%@ " , [error description]);
}// 添加到地图的Annotation
// mapView:viewForAnnotation: provides the view for each annotation.// This method may be called for all or some of the added annotations.
// For MapKit provided annotations (eg. MKUserLocation) return nil to use the MapKit provided annotation view.- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{MKAnnotationView *view = nil;
if ([annotation isKindOfClass:[MyAnnotation class ]] == NO){return view;
}if ([mapView isEqual:self.myMapView] == NO){
return view;}
MyAnnotation *senderAnnotation = (MyAnnotation*)annotation;
NSString *pinReusableIdentifier = [MyAnnotation reusableIdentifierForPinColor:senderAnnotation.pinColor];MKPinAnnotationView *annotationView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:pinReusableIdentifier];
if (annotationView == nil){annotationView = [[MKPinAnnotationView alloc]initWithAnnotation:senderAnnotation reuseIdentifier:pinReusableIdentifier];
[annotationView setCanShowCallout:YES];}
annotationView.pinColor = senderAnnotation.pinColor;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths objectAtIndex:0];
NSString *cachePath = [documentPath stringByAppendingString:@" /images "];
NSString *cacheFile = [cachePath stringByAppendingString:@" icon.image "];if ([[NSFileManager defaultManager]fileExistsAtPath:cacheFile]){
UIImage *image = [UIImage imageWithContentsOfFile:cacheFile];
if (image != nil){annotationView.image = image;
NSLog(@" 通过本地设置图片 ");} else {
[self setAnnotionImageByUrl:annotationView cacheFile:cacheFile];}
} else {[self setAnnotionImageByUrl:annotationView cacheFile:cacheFile];
}view = annotationView;
return view;
}-( void ) setAnnotionImageByUrl:(MKPinAnnotationView *)annotationView cacheFile:(NSString *) cacheFile{
NSLog(@" 通过网络设置文件 ");
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(queue, ^{
NSURL *url = [NSURL URLWithString:@" http://www.baidu.com/img/duanwulogo_94a0060bda0885d1c2320ca0d7d7c342.gif "];
NSData *data = [NSData dataWithContentsOfURL:url];if (data != nil){
[data writeToFile:cacheFile atomically:YES];
UIImage *image = [UIImage imageWithData:data];
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{if (image != nil){
annotationView.image = image;}
});}
});}
/**
// mapView:didAddAnnotationViews: is called after the annotation views have been added and positioned in the map.
// The delegate can implement this method to animate the adding of the annotations views.
// Use the current positions of the annotation views as the destinations of the animation.- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
// mapView:annotationView:calloutAccessoryControlTapped: is called when the user taps on left & right callout accessory UIControls.
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control;- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view NS_AVAILABLE(NA, 4_0);
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view NS_AVAILABLE(NA, 4_0);
- (void)mapViewWillStartLocatingUser:(MKMapView *)mapView NS_AVAILABLE(NA, 4_0);
- (void)mapViewDidStopLocatingUser:(MKMapView *)mapView NS_AVAILABLE(NA, 4_0);- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation NS_AVAILABLE(NA, 4_0);
- (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error NS_AVAILABLE(NA, 4_0);- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState
fromOldState:(MKAnnotationViewDragState)oldState NS_AVAILABLE(NA, 4_0);
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay NS_AVAILABLE(NA, 4_0);
// Called after the provided overlay views have been added and positioned in the map.
- (void)mapView:(MKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews NS_AVAILABLE(NA, 4_0);- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated NS_AVAILABLE(NA, 5_0);
*/
/*******************************************************************************************/
/*******************************************************************************************/
/*************************** 位置相关 *************************//*******************************************************************************************/
/*******************************************************************************************//*******************************************************************************************/
-( void )locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{NSLog(@" Latitude=%f ",newLocation.coordinate.latitude);
NSLog(@" Longitude=%f ",newLocation.coordinate.longitude);}
-( void )locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
NSLog(@" 获得位置失败 ");
}@end
MKMapView+ZoomLevel.h
# import <MapKit/MapKit.h>
@ interface MKMapView (ZoomLevel)
- ( void )setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinatezoomLevel:(NSUInteger)zoomLevel
animated:(BOOL)animated;@end
MKMapView+ZoomLevel.m
# import " MKMapView+ZoomLevel.h "
@implementation MKMapView (ZoomLevel)
#define MERCATOR_OFFSET 268435456#define MERCATOR_RADIUS 85445659.44705395
#pragma mark -
#pragma mark Map conversion methods- ( double )longitudeToPixelSpaceX:( double )longitude
{
return round(MERCATOR_OFFSET + MERCATOR_RADIUS * longitude * M_PI / 180.0);}
- ( double )latitudeToPixelSpaceY:( double )latitude
{return round(MERCATOR_OFFSET - MERCATOR_RADIUS * logf((1 + sinf(latitude * M_PI / 180.0)) / (1 - sinf(latitude * M_PI / 180.0))) / 2.0);
}- ( double )pixelSpaceXToLongitude:( double )pixelX
{
return ((round(pixelX) - MERCATOR_OFFSET) / MERCATOR_RADIUS) * 180.0 / M_PI;}
- ( double )pixelSpaceYToLatitude:( double )pixelY
{return (M_PI / 2.0 - 2.0 * atan(exp((round(pixelY) - MERCATOR_OFFSET) / MERCATOR_RADIUS))) * 180.0 / M_PI;
}#pragma mark -
#pragma mark Helper methods
- (MKCoordinateSpan)coordinateSpanWithMapView:(MKMapView *)mapView
centerCoordinate:(CLLocationCoordinate2D)centerCoordinateandZoomLevel:(NSUInteger)zoomLevel
{// convert center coordiate to pixel space
double centerPixelX = [self longitudeToPixelSpaceX:centerCoordinate.longitude];double centerPixelY = [self latitudeToPixelSpaceY:centerCoordinate.latitude];
// determine the scale value from the zoom level
NSInteger zoomExponent = 20 - zoomLevel;double zoomScale = pow(2, zoomExponent);
// scale the map's size in pixel space
CGSize mapSizeInPixels = mapView.bounds.size;double scaledMapWidth = mapSizeInPixels.width * zoomScale;
double scaledMapHeight = mapSizeInPixels.height * zoomScale;
// figure out the position of the top-left pixel
double topLeftPixelX = centerPixelX - (scaledMapWidth / 2);
double topLeftPixelY = centerPixelY - (scaledMapHeight / 2);
// find delta between left and right longitudes
CLLocationDegrees minLng = [self pixelSpaceXToLongitude:topLeftPixelX];
CLLocationDegrees maxLng = [self pixelSpaceXToLongitude:topLeftPixelX + scaledMapWidth];CLLocationDegrees longitudeDelta = maxLng - minLng;
// find delta between top and bottom latitudes
CLLocationDegrees minLat = [self pixelSpaceYToLatitude:topLeftPixelY];CLLocationDegrees maxLat = [self pixelSpaceYToLatitude:topLeftPixelY + scaledMapHeight];
CLLocationDegrees latitudeDelta = -1 * (maxLat - minLat);
// create and return the lat/lng span
MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
return span;}
#pragma mark -
#pragma mark Public methods- ( void )setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel
animated:(BOOL)animated{
// clamp large numbers to 28
zoomLevel = MIN(zoomLevel, 28);
// use the zoom level to compute the region
MKCoordinateSpan span = [self coordinateSpanWithMapView:self centerCoordinate:centerCoordinate andZoomLevel:zoomLevel];MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span);
// set the region like normal
[self setRegion:region animated:animated];}
@end
MyAnnotation.h
# import <Foundation/Foundation.h>
# import <CoreLocation/CoreLocation.h># import <MapKit/MapKit.h>
#define REUSABLE_PIN_RED @" Red "
#define REUSABLE_PIN_GREEN @" Green "#define REUSABLE_PIN_PURPLE @" Purple "
@ interface MyAnnotation : NSObject <MKAnnotation>
@property (nonatomic,readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, readonly, copy) NSString *title;@property (nonatomic, readonly, copy) NSString *subtitle;
@property (nonatomic,unsafe_unretained) MKPinAnnotationColor pinColor;
-(id) initWithCoordinate:(CLLocationCoordinate2D) coordinate
title:(NSString*) paramTitlesubTitle:(NSString*) paramSubTitle;
// 得到颜色+(NSString *) reusableIdentifierForPinColor:(MKPinAnnotationColor) paramColor;
@end
MyAnnotation.m
# import " MyAnnotation.h "
@implementation MyAnnotation
@synthesize coordinate,title,subtitle,pinColor;
-(id) initWithCoordinate
:(CLLocationCoordinate2D) paramCoordinate title:(NSString *)paramTitle subTitle:(NSString *)paramSubTitle{
self = [ super init];if (self != nil){
coordinate = paramCoordinate;title = paramTitle;
subtitle = paramSubTitle;pinColor = MKPinAnnotationColorGreen;
}return self;
}
+(NSString *)reusableIdentifierForPinColor:(MKPinAnnotationColor)paramColor
{NSString *result = nil;
switch (paramColor) {case MKPinAnnotationColorRed:
result = REUSABLE_PIN_RED;break ;
case MKPinAnnotationColorGreen:result = REUSABLE_PIN_GREEN;
break ;case MKPinAnnotationColorPurple:
result = REUSABLE_PIN_PURPLE;}
return result;}
@end
注意,在使用用户的位置的时候,系统会弹出是否允许应用使用位置的对话框,这个对话框中的提示文字,可以自己进行定义
在系统版本是6.0(包括6.0)以上的时候,在Info.plist文件中进行定义
<key> NSLocationUsageDescription </key>
<string> 是否可以使用位置?如果需要使用本应用,是必须的! </string>
在6.0以下,这样进行定义
// // 提示用户是否允许当前应用使用地理位置,已过时,在Info.plist中使用NSLocationUsageDescription键值替换 // self.myLocationManager.purpose = @"提示用户是否允许当前应用使用位置,已过时";
分类: IOS
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于ios 7第一个应用程序HelloWorld的详细内容...