• UI开发学习中遇到的问题汇总


    1.给UIView设置圆角,边框,阴影绘制,需要使用layer

    1)设置圆角
    cornerView.layer.cornerRadius = 20;  //设置试图圆角的大小

    cornerView.layer.masksToBounds = YES  //防止子元素溢出父试图
    将一个正方形设置成圆形,代码为:
    cornerView.layer.cornerRadius = cornerView.frame.size.height/2;
    cornerView.layer.masksToBounds = YES;
    注意,需要 #import <QuartzCore/QuartzCore.h> 导入,否则,不能识别cornerRadius和masksToBounds。(在我使用的Xcode7.0版本没有遇到这个问题)

    2)绘制边框
    borderView.layer.borderWidth = 1.0;  //绘制边框的大小
    borderView.layer.borderColor = [UIColor blackColor].CGColor;  //边框的颜色
    3)绘制阴影
    shadowView.layer.shadowColor = [UIColor redColor].CGColor;
    shadowView.layer.shadowOffset = CGSizeMake(5.0, 5.0);  //设置偏移量,可以为负数,控制上下左右偏移
    shadowView.layer.shadowOpacity = YES;

    2.隐藏键盘的方式,常用的方法

    1)重写touchesBegan方法, 点击屏幕的时候隐藏键盘
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        UITouch *touch=[[event allTouches] anyObject];
        if (touch.tapCount >=1) {
            [meter resignFirstResponder];
            [feet resignFirstResponder];
        }
    }

    相当于屏幕任何位置的点击事件(除了各组件的点击处)可以在这个方法里执行要隐藏或remove的view.

    2)重写textField的delegate中的-(BOOL)textFieldShouldReturn:(UITextField *)textField方法,在点击return的时候调用方法,让textField放弃

    第一响应者.

    3)在最底层铺上一个透明的button活着controller,时间相应为回收键盘.

    3.UINavigationBar的控件设置

    UINavigationBar (导航栏)上的设置主要分两部分, 为导航栏上的各种导航部件(UINavigationItem), 为导航栏的相关设置.navigationBar—导航条,iOS7之后默认是半透明的,iOS7之前默认是不透明的。 navigationBar 竖屏下默认高度44,横屏下默认高度32。 iOS7之后,navigationBar的背景会延伸到statusBar上。导航栏高度仍保持44,但显示效果为64。 每个视图控制器都有一个UINavigationItem属性。UINavigationItem中设置的左按钮、右按钮、标题等,会随着控制器的显 ,也显示到NavigationBar上。 

    self.navigationItem.title = @"老炮儿"; //修改自己试图的标题

    self.navigationItem.titleView = ........   //可以设置标题视图

    self.navigationController.navigationBarHidden = NO;  // 导航栏的显隐属性  

    self.navigationController.navigationBar.barStyle =UIBarStyleDefault;  // 导航栏样式

    self.navigationController.navigationBar.backgroundColor =[UIColor redColor];  // 背景颜色

    self.navigationController.navigationBar.barTintColor =[UIColor yellowColor];  // 导航栏颜色

    self.navigationController.navigationBar.tintColor =[UIColor blackColor];// 导航栏上的元素颜色(对字体颜色无效)

     

    导航栏半透明的效果(iOS7以后 默认为 YES),当半透明效果开启时 屏幕左上角为坐标原点,当关闭时,导航栏左下角为坐标原点 self.navigationController.navigationBar.translucent = NO; 

    给navigationController设置背景照片

    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"XXX.png"] forBarMetrics:UIBarMetricsDefault];

     IOS5.0以上,api有了上面setBackgroundImage的方法,可以直接设置,如果项目需要适配5.0以下版本的设备,最好加一个判读,是否有此函数,有则设置,没有就通过drawRect方法设置。

    另外:设置背景图片无法匹配backButton或rightButtonItem,所以返回按钮或右边自定义的Bar button Item需要自行处理。

    给navigationController修改字体

    [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:12.] forKey:NSFontAttributeName]];  //修改字体大小

     [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObject:[UIColor redColor] forKey:NSForegroundColorAttributeName]];  //修改字体颜色

    滑动的时候隐藏navigationBar

    self.navigationController.hidesBarsOnSwipe = YES;

    navigationbar导航条,返回键带的title太讨厌了,怎么让它消失?

     [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)forBarMetrics:UIBarMetricsDefault];

    4.在有navigationBar和tabBar时,视图的设置

    1)edgesForExtendedLayout

    这个属性是UIExtendedEdge类型,用来制定视图的哪条边需要扩展。比如UIRectEdgeTop,它把视图区域顶部扩展到statusBar(以前是navigationBar下面);UIRectEdgeBottom是把区域底部扩展到屏幕下方边缘。默认值是UIRectEdgeAll。

    2)extendedLayoutIncludesOpaqueBars

    如果你使用了不透明的导航栏,设置edgesForExtendedLayout的时候也请将extendedLayoutIncludesOpaqueBars的值设置为No(默认值是YES)。

    3)automaticallyAdjustsScrollViewInsets

    为YES时,它会找view里的scrollView,并设置scrollView的contentInset为{64, 0, 0, 0}。在为YES的时候,UIViewController下如果只有一个UIScollView或者其子类,那么会自动留出空白,让scollview滚动经过各种bar下面时能隐约看到内容。但是每个UIViewController只能有唯一一个UIScollView或者其子类,如果超过一个,需要将此属性设置为NO,自己去控制留白以及坐标问题。

    5.给UIView设置背景图片

    [view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"pabb_leftnaviview_bg.png"]]];

     大小设置:

    [view setFrame:CGRectMake(9, 60, 120, 250)]; 

    6. 怎么在不新建一个Cell的情况下调整separaLine的位置

    _myTableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);  

    7.要让TableView不显示没内容的Cell怎么办?

    类似于图1,我不想让下面的那些空显示。很简单,添加“self.tableView.tableFooterView = [[UIView alloc] init];”

    试过都说好,加完这句之后就变成了图2的样子

    .

    8.KVC在存数数据,model类中的应用

    在model类中的.h文件中声明属性,以获取后台返回数据,名称,类型相同

     在.m文件中重写方法

    在存储数据时(一般在VC中)

    9.创建cell时对cell进行判断,区别创建

    根据后台返回的数据的数据类型,设置显示用的cell样式

    根据要cell在的位置,设置要显示的cell的样式

    10.navigationBar上的edit按钮改成中文

    navigationBar上的edit按钮有两种状态"edit"和"done",配合tableView使用,可以让tableView进入编辑状态.现在自定义编辑按钮

    把edit写成中文样式

    11,UI中各个控件的继承图谱

     12.Button的字体显示位置,颜色的设置

    设置文字的内容

    [btn setTitle: @"search" forState: UIControlStateNormal];

    设置字体的大小

    btn.titleLabel.font = [UIFont systemFontOfSize: 14.0];

    初始化button后的字体颜色是白色的,如果背景颜色也是白色是看不到字的,需要修改button的字体颜色

    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

    有些时候我们想让UIButton的title居左对齐,我们设置

    btn.textLabel.textAlignment = UITextAlignmentLeft;   ××××××是没有作用的,我们需要设置

    btn.contentHorizontalAlignment = UIControlContentHorizonAlignmentLeft;   //左对齐

    但是问题又出来,此时文字会紧贴到做边框,我们可以设置

    btn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0);    //使文字距离做边框保持10个像素的距离。

     13.当铺设UI控件时,可能会遇到层级遮挡的关系View1,View2的父试图都是View,如果View2 挡住了View1,但是View1有touch事件.

    我们可以用以下代码写到View2的类中

    -(id)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        UIView *hitView = [super hitTest:point withEvent:event];
        if (hitView == self)
        {
            return nil;
        }
        else
        {
            return hitView;
        }}

    14.汉字转换为英文字符串的方法

    //获取拼音首字母(传入汉字字符串, 返回大写拼音首字母)
    -(NSString *)firstCharactor
    {
        //转成了可变字符串
        NSMutableString *str = [NSMutableString stringWithString:self.name];
        //先转换为带声调的拼音
        CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
        //再转换为不带声调的拼音
        CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
        //转化为大写拼音
        NSString *pinYin = [str capitalizedString];
        //获取并返回首字母
        return [pinYin substringToIndex:1];
    }
    15,写一个常用的获取当前日期,时间的代码。并且能以规定的格式显示出来

    NSDate *currentDate = [NSDate date];//获取当前时间,日期

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateFormat:@"YYYY/MM/dd hh:mm:ss SS"];

    NSString *dateString = [dateFormatter stringFromDate:currentDate];

    NSLog(@"dateString:%@",dateString);

    这样就能按照规定的格式显示日期,时间了。

    dateString:2015/01/03 08:01:20 24

    说明下格式对应的意义

    YYYY(年)/MM(月)/dd(日) hh(时):mm(分):ss(秒) SS(毫秒)需要用哪个的话就把哪个格式加上去。值得注意的是,如果想显示两位数的年份的话,可以用”YY/MM/dd hh:mm:ss SS”,两个Y代表两位数的年份。而且大写的M和小写的m代表的意思也不一样。“M”代表月份,“m”代码分钟“HH”代表24小时制,“hh”代表12小时制

    16,CoreData数据迁移步骤

    //数据迁移步骤


    //保证原有的数据库不要做任何改动
    //1,选中model.xcdatamodeld -> 工具栏Editor -> add Model Version
    //2,为新版本取个名字 -> Next
    //3,右面菜单栏说明文件下 Model Version -> 选择新创建的版本
    //4,为新的表添加新的字段
    //5,删除原来的model类4个文件
    //6,Command + N -> NSManagerObjectSubClass -> 选中新的表 -> creat
    //7,Command + N -> mapping model ->选中原来的模型 ->选中新模型 ->创建
    //8, 给创建的小秘书提示版本迁移   [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqllitePath] options:@{NSMigratePersistentStoresAutomaticallyOption:@YES,NSInferMappingModelAutomaticallyOption:@YES} error:nil];

    17,UITextField的placeholder的字体,颜色,居中显示

       UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(12,10, SCREEN_WIDTH - 24, 50)];
        textField.borderStyle = UITextBorderStyleRoundedRect;
        textField.placeholder = @"请输入标题";
        [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
        [textField setValue:[UIFont boldSystemFontOfSize:18] forKeyPath:@"_placeholderLabel.font"];
        textField.textAlignment = NSTextAlignmentCenter;

    18,计时器

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(onTime) userInfo:nil repeats:YES];

    在SEL中执行去执行需要延迟操作的方法,比如动画,比如自动消失效果,比如循环播放

    19,全球流NSNotificationCenter的用法

    第一步:注册通知中心

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushVC:) name:@"fuck" object:nil];

    第二步:写SEL的方法,传递的参数是字典类型的

    -(void)pushVC:(NSNotification *)user{
        NSDictionary *dic = user.userInfo;  //属性,提取出字典
        CustomFileTableViewController *customVC = [[CustomFileTableViewController alloc]init];
        customVC.folderTime = [dic valueForKey:@"folderTime"];
        customVC.folderName = [dic valueForKey:@"folderName"];
        [self.navigationController pushViewController:customVC animated:YES];
    }

    第三步:在需要相应方法的地方对暗号

    -(void)goHome:(UIButton *)button{
        NSArray *array = button.subviews;
        UITextField *textField = (UITextField *)[array objectAtIndex:0];
        NSString *folderName = textField.text;
        UILabel *label = (UILabel *)[array objectAtIndex:1];
        NSString *folderTime = label.text;
        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:0];
        [dic setObject:folderName forKey:@"folderName"];
        [dic setObject:folderTime forKey:@"folderTime"];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"fuck" object:button userInfo:dic]; //对上暗号并将需要传递的信息,写入字典传递过去
    }
    20,

    int ABS(int i);                   // 处理int类型的取绝对值

    double fabs(double i); //处理double类型的取绝对值

    float fabsf(float i);           /处理float类型的取绝对值

     21,创建单例类方法,通过这个类方法创建出来的都是单例的类对象

    使用了Category(类目),即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。由于继承NSObject,所有的类都可以使用

    在.h中

    //使用可变字典存储每个类的单一实例,键为类名,值为该类的对象;
    //声明为静态变量,可以保存上次的值;
    static NSMutableDictionary *instanceDict;
    id instance;
    + (instancetype)sharedInstance {
      @synchronized(self)
      {
        //初始化字典;
        if (instanceDict == nil) {

          instanceDict = [[NSMutableDictionary alloc] init];
        }
        //获取类名;
        NSString *className = NSStringFromClass([self class]);
        if (className) {
          //查找字典中该类的对象,使用类名去进行查找,可以确保一个类只被存储一次;
          instance = instanceDict[className];
          if (instance == nil) {
            //该类的对象还没实例化,就进行初始化,并根据键值对的形式存储;
            instance = [[self.class alloc] init];
            [instanceDict setValue:instance forKey:className];
          }else{
            //该类对象已经存储在字典中,直接返回instance即可;
          }
        }else{
          //没有获取类名,所以确保sharedInstance是一个类方法,用类进行调用;
        }
        return instance;
      }
    }
    @end

    通过类方法:sharedInstance,创建出来的对象,都是单例.

     22,iOS 8 系统自带BlurEffect 毛玻璃特效

    毛玻璃 的UI 设计在手机开发中已经 非常热门,在之前的 开发中 一般用到 github上FXBlurView 封装好的一个view类 ,可以直接应用加载到控件中,iOS 8 后更新的  

    UIBlurEffect类和 UIVisualEffectView类使这种特效应用更加便捷,高效。

    使用也非常简便,UIBlurEffect 类是设定毛玻璃特效的类型,UIVisualEffectView类在创建时加入上一个类对象,剩下的跟普通的view 控件等用法就一样了 ,附代码事例:

       //  创建需要的毛玻璃特效类型

        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

     

        //  毛玻璃view 视图

       UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

     

        //添加到要有毛玻璃特效的控件中

        effectView.frame = self.imageV.bounds;

        [self.imageV addSubview:effectView];

     

        //设置模糊透明度

        effectView.alpha = .8f;

     

    23,可以使用stringByTrimmingCharactersInSet函数过滤字符串中的特殊符号

     

    首先自己定义一个NSCharacterSet, 包含需要去除的特殊符号
    NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」"、[]{}#%-*+=_\|~<>$€^•'@#$%^&*()_+'""];
    由于NSString中有全角符号和半角符号, 因此有些符号要包括全角和半角的
    然后调用stringByTrimmingCharactersInSet
    NSString *trimmedString = [string stringByTrimmingCharactersInSet:set];
    trimmedString就是过滤后的字符串

    取出字符串中的空格

    http://my.oschina.net/u/2361492/blog/487703?fromerr=pgTCOpmI

    关于NSCharacterSet的一些深层次的简介

     

     

    24,让tableView回到顶部

    使用 selectRowAtIndexPath,不会有反应
    换一个 scrollToRowAtIndexPath 之后果然可以了。
    [TableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

     

    25.如何让UITableView响应touchesBegan:withEvent:之类的UIResponder的方法

    UITableView是不会响应touchesBegan:withEvent:之类的UIResponder的方法的。因此,加在其上的所有视 图的响应者链就断了。如果在UITableView其上加任何的自身不具备类似UIButton一样有目标动作机制的UIView及其子类控件的时候,这 个控件也不会响应touchesBegan:withEvent:方法。即便是设置该控件的userInteractionEnabled为YES也没用。如此一来,如果想要这些控件具有交互性能怎么办?有一种很直观的方法,给这个控件加上手势识别器

    26,/**
     *  利用 KVC 把系统的 tabBar 类型改为自定义类型。
     */
    - (void)setUpTabBar {
        [self setValue:[[CYLTabBar alloc] init] forKey:@"tabBar"];
    }

    27.改变textfiled的placeholder的字体颜色大小

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    NSString *holderText = @"标哥的技术博客";
    NSMutableAttributedString *placeholder = [[NSMutableAttributedString alloc] initWithString:holderText];
    [placeholder addAttribute:NSForegroundColorAttributeName
                      value:[UIColor redColor]
                      range:NSMakeRange(0, holderText.length)];
    [placeholder addAttribute:NSFontAttributeName
                      value:[UIFont boldSystemFontOfSize:16]
                      range:NSMakeRange(0, holderText.length)];
    textField.attributedPlaceholder = placeholder;
    [cell.contentView addSubview:textField];
  • 相关阅读:
    【多线程】工具类汇总
    【JVM】GC日志样例解读
    【Docker】
    XXS level5
    XXS level4
    XXS level3
    XXS level2
    SQLI DUMB SERIES-6
    SQLI DUMB SERIES-5
    XXS level1
  • 原文地址:https://www.cnblogs.com/LE-Quan/p/5131641.html
Copyright © 2020-2023  润新知