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

时间:2021-03-03 02:45:26

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];// 导航栏上的元素颜色(对字体颜色无效)

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

导航栏半透明的效果(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的样子

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

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

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

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

 在.m文件中重写方法

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

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

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

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

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

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

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

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

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

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

把edit写成中文样式

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

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

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,创建单例类方法,通过这个类方法创建出来的都是单例的类对象

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

使用了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就是过滤后的字符串

取出字符串中的空格

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

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];