zoukankan      html  css  js  c++  java
  • IOS开发基础知识--碎片13

    1:运行程序报the file couldn't be opened because you don't have permission to view it 

    解决办法:项目—>targets->build settings->build options->changed the value of the "Compiler for C/C++/Objective-C" to Default Compiler. 

    2:百度地图引用

    1.1如图引用的是.framework形式开发包时,引入的命名空间则是
    #import <BaiduMapAPI/BMapKit.h>//引入所有的头文件
    #import <BaiduMapAPI/BMKMapView.h>//只引入所需的单个头文件
    如果是引入用的是.a形式开发包时,引入的命名空间则是
    #import “BMapKit.h"
    
    1.2百度地图现在提供的两个.framework的包,一个是真机一个是测试机,可以使用终端的命令把它合成一个;

    3:自定义大头针百度地图

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //百度地图初始化
        _mapView=[[BMKMapView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-NAVBARHEIGHT)];
        _mapView.delegate=self;
        [self.view addSubview:_mapView];
        
        //标出坐标点
        [self addPointAnnotation];
    }
    
    //添加标注
    - (void)addPointAnnotation
    {
        for (int i=0; i<self.coordinates.count; i++) {
            coordinateBean *model=self.coordinates[i];
            
            BMKPointAnnotation* pointAnnotation = [[BMKPointAnnotation alloc]init];
            CLLocationCoordinate2D coor;
            coor.latitude = model.latitude;
            coor.longitude = model.longitude;
            pointAnnotation.coordinate = coor;
            
            //通过title来起到传值的作用
            pointAnnotation.title=[NSString stringWithFormat:@"%d",i];
            [_mapView addAnnotation:pointAnnotation];
            //显示弹出窗
            [_mapView selectAnnotation:pointAnnotation animated:YES];
            
            
            
            //判断那个是中心,没有则0必传参数
            if (i==self.selectIndex) {
                BMKCoordinateRegion region; ////表示范围的结构体
                region.center.latitude  = model.latitude;// 中心中
                region.center.longitude = model.longitude;
                region.span.latitudeDelta = 0;//经度范围(设置为0.1表示显示范围为0.2的纬度范围)
                region.span.longitudeDelta = 0;//纬度范围
                
                [_mapView setRegion:region];
            }
        }
    }
    //处理自定义弹出视图
    - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation
    {
        if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
            BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myrenameMark"];
            newAnnotationView.pinColor = BMKPinAnnotationColorPurple;
            newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
           
            newAnnotationView.image = [UIImage imageNamed:self.mapPointImageName];   //把大头针换成别的图片
            
            int selectIndex=[((BMKPointAnnotation *)annotation).title intValue];
            //获得值
            coordinateBean *model=[self.coordinates objectAtIndex:[((BMKPointAnnotation *)annotation).title intValue]];
            
            
            UIView *popView=[[UIView alloc]initWithFrame:CGRectMake(0, 3, 100, 20)];
            
            UIImage *img=[UIImage imageNamed:@"mapViewBackground"];
            UIEdgeInsets edge=UIEdgeInsetsMake(0, 20, 0, 10);
            img=[img resizableImageWithCapInsets:edge resizingMode:UIImageResizingModeStretch];
            UIImageView *myimage=[[UIImageView alloc] initWithImage:img];
            myimage.frame=CGRectMake(30, 0, 100, 40);
            myimage.userInteractionEnabled=YES;
            
            [popView addSubview:myimage];
            
            
            //自定义显示的内容
            UILabel *driverName = [[UILabel alloc]initWithFrame:CGRectMake(0, 3, 100, 15)];
            driverName.backgroundColor=[UIColor clearColor];
            driverName.text=model.title;
            driverName.font = [UIFont systemFontOfSize:12];
            driverName.textColor = [UIColor blackColor];
            driverName.textAlignment = NSTextAlignmentLeft;
            [myimage addSubview:driverName];
            
            UILabel *carName = [[UILabel alloc]initWithFrame:CGRectMake(0, 18, 100, 15)];
            carName.backgroundColor=[UIColor clearColor];
            carName.text=model.comments;
            carName.font = [UIFont systemFontOfSize:12];
            carName.textColor = [UIColor blackColor];
            carName.textAlignment = NSTextAlignmentLeft;
            [myimage addSubview:carName];
            
            
            BMKActionPaopaoView *pView = [[BMKActionPaopaoView alloc]initWithCustomView:popView];
            pView.frame = CGRectMake(0, 0, 100, 40);
            ((BMKPinAnnotationView*)newAnnotationView).paopaoView = nil;
            ((BMKPinAnnotationView*)newAnnotationView).paopaoView = pView;
            newAnnotationView.tag=selectIndex+10;
            
            return newAnnotationView;
        }
        return nil;
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    /**
     *  @author wujunyang, 15-05-12 13:05:05
     *
     *  @brief  跟对百度地图的处理
     *  @param animated <#animated description#>
     */
    -(void)viewWillAppear:(BOOL)animated
    {
        [_mapView viewWillAppear];
    
        _mapView.delegate=self;
        _locationService.delegate=self;
    }
    /**
     *  @author wujunyang, 15-01-06 10:01:53
     *
     *  跟对百度地图的处理
     *
     *  @param animated <#animated description#>
     */
    -(void)viewWillDisappear:(BOOL)animated
    {
        [_mapView viewWillDisappear];
        _mapView.delegate=nil;
        _locationService.delegate=nil;
    }
    
    其中有个自定义model:
    
    @interface coordinateBean : NSObject
    //纬度
    @property(assign,nonatomic)float latitude;
    //经度
    @property(assign,nonatomic)float longitude;
    //标题
    @property(strong,nonatomic)NSString *title;
    //注解
    @property(strong,nonatomic)NSString *comments;
    @end

     4:自动隐藏和显示工具栏和导航条

    toolbar属性、toolbarItems与上一讲的navigationBar、navigationItem类似。只不过toolbarItems没有navigationItem的左右区分,它就自己一个人在做事,相当于没有下属。可以在toolbar上设置很多,比如背景颜色、背景图片、背景样式、大小位置(不过有些貌似设置无效),当然和navigationBar一样,对于它的是否显示和隐藏是由它的老爸即navigationController控制的。
    
    所以[self.navigationController setNavigationBarHidden:YES animated:YES];也会把底部的toolBarItems给隐藏起来,如果要隐藏导航又不想底部toolBarItems被隐藏掉,可以用普通的view替代toolBarItems;
    
    首先在viewDidLoad里设置toolBarHidden = NO, 默认是YES(隐藏的)
    
    为了让toolbar显示,需要设置为NO(不隐藏)。
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.title = @"隐藏导航栏";
        // self.toolbarItems
        self.navigationController.toolbar.barStyle = self.toolBar.barStyle;
        self.navigationController.toolbarHidden = NO;
    
        [self.navigationController.toolbar setTranslucent:YES];
    
         self.toolbarItems = [[[NSMutableArray alloc] initWithArray:self.toolBar.items] autorelease];
    }
     
    在点击中间button的时候的显示和隐藏navigation bar和toolBar
    
    
    实现代码如下:
    
    - (IBAction)toggleNavigationBar:(id)sender
    {
        //Check the current state of the navigation bar...
        BOOL navBarState = [self.navigationController isNavigationBarHidden];
        //Set the navigationBarHidden to the opposite of the current state.
        [self.navigationController setNavigationBarHidden:!navBarState animated:YES];
        [self.navigationController setToolbarHidden:!navBarState animated:YES];
        //Change the label on the button.
        if (navBarState)
        {
            [button setTitle:@"隐藏 Navigationr and toolbar" forState:UIControlStateNormal];
            [button setTitle:@"隐藏 Navigation Bar toolbar" forState:UIControlStateHighlighted];
        }
        else
        {
            [button setTitle:@"显示 Navigation Bar toolbar" forState:UIControlStateNormal];
            [button setTitle:@"显示 Navigation Bar toolbar" forState:UIControlStateHighlighted];
        }
    }

    5:View代码结构的一些建议

    在viewDidload里面只做addSubview的事情,然后在viewWillAppear里面做布局的事情,最后在viewDidAppear里面做Notification的监听之类的事情。至于属性的初始化,则交给getter去做。
    
    @interface CustomObject()
    @property (nonatomic, strong) UILabel *label;
    @end
    
    @implement
    
    #pragma mark - life cycle
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        [self.view addSubview:self.label];
    }
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    
        self.label.frame = CGRectMake(1, 2, 3, 4);
    }
    
    #pragma mark - getters and setters
    
    - (UILabel *)label
    {
        if (_label == nil) {
            _label = [[UILabel alloc] init];
            _label.text = @"1234";
            _label.font = [UIFont systemFontOfSize:12];
            ... ...
        }
        return label;
    }
    @end
    
    注意:*重点,在get方法里面不能写self.noLabel;千万不要用“点”语法,这样会造成get方法死循环,因为“点”语法就是调用的get方法,所以要用下划线属性名的方法得到对象(在内存这其实是一个指针)。
    @interface MasonryViewController ()
    @property(nonatomic,strong)UIView *conView;
    @property(nonatomic,assign)int intstate;
    @end
    
    @implementation MasonryViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self.view addSubview:self.conView];
    }
    //懒加载
    -(UIView *)conView
    {
        if(_conView==nil)
        {
            _conView=[[UIView alloc]init];
            _conView.backgroundColor=[UIColor redColor];
        }
        return _conView;
    }
    
    -(int)intstate
    {
        _intstate=0;
        return _intstate;
    }
    
    //布局约束
    -(void)viewDidLayoutSubviews
    {
        [self.conView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.view.mas_top).with.offset(100);
            make.left.equalTo(self.view.mas_left).with.offset(60);
            make.right.equalTo(self.view.mas_right).with.offset(0);
            make.height.equalTo(@50);
        }];
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }

    6: iOS中的生成随机数方法

    生成0-x之间的随机正整数
    
    int value =arc4random_uniform(x + 1);
    
    生成随机正整数
    
    int value = arc4random() 
    
    通过arc4random() 获取0到x-1之间的整数的代码如下:
    
    int value = arc4random() % x; 
    
    获取1到x之间的整数的代码如下: 
    
    int value = (arc4random() % x) + 1; 
    
    最后如果想生成一个浮点数,可以在项目中定义如下宏:
    
    #define ARC4RANDOM_MAX      0x100000000 
    
    然后就可以使用arc4random() 来获取0到100之间浮点数了(精度是rand()的两倍),代码如下:
    
    double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);
    
    实例(从数组中随机显示出一个背景图,再通过网络加载显示出来):
    
     self.bgView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
        self.bgView.image=[UIImage imageNamed:@"AppBg"];
        [self.view addSubview:self.bgView];
        [self.view sendSubviewToBack:self.bgView];
        
        NSDictionary *params=[[NSDictionary alloc] init];
        [[HomeMainNetAPIManager sharedManager] getBackgroundImage:params andBlock:^(id data, NSError *error) {
            if (!error&&data) {
                BackgroundImageBean *groundImagebean =(BackgroundImageBean *)data;
                int dataNum=groundImagebean.data.count;
                if (groundImagebean.data&&dataNum>0) {
                    int r=arc4random_uniform(dataNum);
                    GroundImageBean *curBean=groundImagebean.data[r];
                    [self.bgView sd_setImageWithURL:[NSURL URLWithString:curBean.ImgUrl] placeholderImage:[UIImage imageNamed:@"AppBg"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            self.bgView.image=image;
                        });
                    }];
                }
    
            }
        }];

    7:沙盒路径知识整理

    模拟器的路径从之前的~/Library/Application Support/iPhone Simulator移动到了~/Library/Developer/CoreSimulator/Devices/
    
    文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,他的目录其实是Library。
    
    因为应用是在沙箱(sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件:
    Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
    tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
    Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
    
    iTunes在与iPhone同步时,备份所有的Documents和Library文件。
    iPhone在重启时,会丢弃所有的tmp文件。
    
    查看方法:
    方法1、可以设置显示隐藏文件,然后在Finder下直接打开。设置查看隐藏文件的方法如下:打开终端,输入命名
    (1)显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
    (2)隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
    (3)输完单击Enter键,退出终端,重新启动Finder就可以了 重启Finder:鼠标单击窗口左上角的苹果标志-->强制退出-->Finder-->
    现在能看到资源库文件夹了。 
    打开资源库后找到/Application Support/iPhone Simulator/文件夹。这里面就是模拟器的各个程序的沙盒目录了。
    方法2、这种方法更方便,在Finder上点->前往->前往文件夹,输入/Users/username/Library/Application Support/iPhone Simulator/  前往。
    username这里写用户名。 
    
    自定义类返回各目录路径:
    
    #import <Foundation/Foundation.h>
    
    @interface ICSandboxHelper : NSObject
    
    + (NSString *)homePath;     // 程序主目录,可见子目录(3个):Documents、Library、tmp
    + (NSString *)appPath;        // 程序目录,不能存任何东西
    + (NSString *)docPath;        // 文档目录,需要ITUNES同步备份的数据存这里,可存放用户数据
    + (NSString *)libPrefPath;    // 配置目录,配置文件存这里
    + (NSString *)libCachePath;    // 缓存目录,系统永远不会删除这里的文件,ITUNES会删除
    + (NSString *)tmpPath;        // 临时缓存目录,APP退出后,系统可能会删除这里的内容
    + (BOOL)hasLive:(NSString *)path; //判断目录是否存在,不存在则创建
    
    实现代码:
    
    #import "ICSandboxHelper.h"
    
    @implementation ICSandboxHelper
    
    + (NSString *)homePath{
        return NSHomeDirectory();
    }
    
    + (NSString *)appPath
    {
        NSArray * paths = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES);
        return [paths objectAtIndex:0];
    }
    
    + (NSString *)docPath
    {
        NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        return [paths objectAtIndex:0];
    }
    
    + (NSString *)libPrefPath
    {
        NSArray * paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        return [[paths objectAtIndex:0] stringByAppendingFormat:@"/Preference"];
    }
    
    + (NSString *)libCachePath
    {
        NSArray * paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        return [[paths objectAtIndex:0] stringByAppendingFormat:@"/Caches"];
    }
    
    + (NSString *)tmpPath
    {return [NSHomeDirectory() stringByAppendingFormat:@"/tmp"];
    }
    
    + (BOOL)hasLive:(NSString *)path
    {
        if ( NO == [[NSFileManager defaultManager] fileExistsAtPath:path] )
        {
            return [[NSFileManager defaultManager] createDirectoryAtPath:path
                                             withIntermediateDirectories:YES
                                                              attributes:nil
                                                                   error:NULL];
        }
        
        return NO;
    }
  • 相关阅读:
    frida
    ES中filter 和map的使用
    阿里巴巴15 款开发者工具
    小程序的开发记录
    微信3.1小程序商城源码C# ASP.NET 多用户微商城 saas模式
    js中for,for in,forEach,for of的使用
    Vuejs学习笔记
    vue.js/element-ui/webpack 开发记录
    ESXi开启虚拟化
    shell把字符串中的字母去掉,只保留数字
  • 原文地址:https://www.cnblogs.com/wujy/p/4503381.html
Copyright © 2011-2022 走看看