目的是实现例如以下的效果:

UITextField的leftView是自己定义的UIView,当中:

1、包括一个居中显示的icon。而且上,左,下各有1px的间隙

2、左上和左下是圆角,右边没有圆角

居中展示icon

关键是leftView不是UIImageView。而是把UIImageView设置为subview

  1. CGFloat height = frame.size.height;
  2.  
  3. UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 1, height - 1, height - 2)];
  4.  
  5. UIImageView *icon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:iconName]];
  6. icon.frame = CGRectMake(height / 4, height / 4, height / 2, height / 2);
  7. [leftView addSubview:icon];

上面的代码,使icon在leftView居中显示

制造1px间隙

top和bottom的间隙非常easy做,仅仅要令leftView的height比UITextField的height少2。然后y设置为1

左側的间隙比較麻烦,首先将width设置为比UITextField的width少1。可是直接设置x为1无效。须要override下面方法:

  1. -(CGRect) leftViewRectForBounds:(CGRect)bounds {
  2. CGRect iconRect = [super leftViewRectForBounds:bounds];
  3. iconRect.origin.x += 1;
  4. return iconRect;
  5. }

制造部分圆角

制造全部的圆角比較简单,仅仅须要:

  1. self.layer.cornerRadius = 5;

可是要制造部分圆角,就比較麻烦:

  1. UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:leftView.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerBottomLeft cornerRadii:CGSizeMake(5, 5)];
  2. CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
  3. maskLayer.frame = leftView.bounds;
  4. maskLayer.path = maskPath.CGPath;
  5. leftView.layer.mask = maskLayer;

创建阴影

  1. self.layer.shadowColor = [UIColor colorWithRed:132/255.0f green:214/255.0f blue:219/255.0f alpha:1.0f].CGColor;
  2. self.layer.shadowOpacity = 0.5;
  3. self.layer.shadowOffset = CGSizeMake(3, 3);

完整的代码

  1. @implementation LosTextField
  2.  
  3. -(id)initWithFrame:(CGRect)frame Icon:(NSString*)iconName
  4. {
  5. self = [super initWithFrame:frame];
  6. if (self) {
  7.  
  8. CGFloat height = frame.size.height;
  9.  
  10. UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 1, height - 1, height - 2)];
  11. leftView.backgroundColor = [UIColor colorWithRed:132/255.0f green:214/255.0f blue:219/255.0f alpha:1.0f];
  12.  
  13. UIImageView *icon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:iconName]];
  14. icon.frame = CGRectMake(height / 4, height / 4, height / 2, height / 2);
  15. [leftView addSubview:icon];
  16.  
  17. UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:leftView.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerBottomLeft cornerRadii:CGSizeMake(5, 5)];
  18. CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
  19. maskLayer.frame = leftView.bounds;
  20. maskLayer.path = maskPath.CGPath;
  21. leftView.layer.mask = maskLayer;
  22.  
  23. self.leftView = leftView;
  24. self.leftViewMode = UITextFieldViewModeAlways;
  25. }
  26. return self;
  27. }
  28.  
  29. -(CGRect) leftViewRectForBounds:(CGRect)bounds {
  30. CGRect iconRect = [super leftViewRectForBounds:bounds];
  31. iconRect.origin.x += 1;
  32. return iconRect;
  33. }
  34.  
  35. @end
  1. self.username = [[LosTextField alloc] initWithFrame:CGRectMake(20, 150, 280, 40) Icon:@"login_username"];

自己定义UITextField的更多相关文章

  1. UITextField,常见属性的罗列和用法

    UITextField是UIControl的子类 ,属于控件类(因为它有能力响应一些高级事件),在故事版中可以直接拖拽过来使用. 首先定义 UITextField *name; name = [[UI ...

  2. 如何创建圆角 UITextField 与内阴影

    本文转自http://www.itstrike.cn/Question/9309fbd6-ef5d-4392-b361-a60fd0a3b18e.html 主要学习如何创建内阴影 我自定义 UITex ...

  3. UITextField设置leftView的Insets

    Insets就是css中的padding 我们给UITextField设置了leftView,目的是在文本输入框左側显示一个图标.可是在ios7里,这个图标会紧紧地挨着TextField的左边框,非常 ...

  4. 超文本传输协议-HTTP/1.1

    超文本传输协议-HTTP/1.1(修订版) ---译者:孙超进本协议不限流传发布.版权声明Copyright (C) The Internet Society (1999). All Rights R ...

  5. UIButton、UILabel、UITextField 初学者需要了解的基本定义和常用设置

     以下是三个IOS开发中最常用的控件,作为IOS基础学习教程知识 ,初学者需要了解其基本定义和常用设置,以便在开发在熟练运用. UIButton按钮 第一.UIButton的定义 UIButton * ...

  6. UI控件(UITextField)

    @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UITextField* textField1 = ...

  7. UITextField使用详解

    转iOS中UITextField使用详解 (1) //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFr ...

  8. 你真的了解UITextField吗?

    一:首先查看一下关于UITextField的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextField : UIControl <UITextIn ...

  9. UI第三节—— UITextField详解

    戏言:UITextField对于需要登陆注册的界面的作用还是相当明显,但是对于键盘过的遮挡问题,可是重点哦!这里就涉及到通知(NSNotificationCenter)的内容. //注册事件 [[NS ...

随机推荐

  1. oracle查询包含大小写的数据

    查询包含小写的所有数据: select oper_no from info_oper where regexp_like(oper_no,'[[:lower:]]'); select oper_no  ...

  2. python调用C/C++动态链接库和jython

    总结(非原创) Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可. 1. C语言文件:pycall.c #include <stdio.h> ...

  3. hdu 3264 圆的交+二分

    Open-air shopping malls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  4. vs nuget package control.

    关于nuget,貌似使用nuget获取的package会在项目解决方案根目录下面将所有download下来的依赖包存储下来,所以这里的package会是最后所有的引用所在,既然不自己维护dll库的位置 ...

  5. WebRTC入门学习之初识WebRTC (转)

    一.WebRTC基本架构 图一  WebRTC总体架构,摘自百度百科 先说说WebRTC大致的实现思路:我们创建的web app,然后在app中调用W3C提供的JS API,JS API 会调用浏览器 ...

  6. yii 数据库添加,修改,删除相关操作总结

    yii中关于数据信息的添加数据,修改数据,删除数据的相关操作,刚刚学习没几天,仅记录了一些,以后慢慢再充实,有需要的朋友可以看看. 添加数据的方法 (1)save 方法(对象形式操作) $user=n ...

  7. AC日记——爱情之路 codevs 2070

    2070 爱情之路  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description yh非常想念他的女朋友小y,于是他 ...

  8. Codeforces 620F Xors on Segments(暴力+DP)

    题目链接 Xors on Segments 预处理出$x[i]$ $=$ $1$ $xor$ $2$ $xor$ $3$ $xor$ $……$ $xor$ $i$ 话说这题$O(n^{2})$居然能过 ...

  9. The 2016 ACM-ICPC Asia China-Final Contest Promblem D

    显然答案具有单调性,可以二分.问题是 我们二分出一个 堆数,该怎么判定能否达到这个堆数呢? 我们可以很简单的用调整法证明,最底下的一层的冰淇淋肯定是最小的那些,往上叠加的话我们再贪心的让较少的放在较小 ...

  10. POJ2104Kth Number

    整体二分模板题, 有些细节需要注意 #include<cstdio> #include<cctype> #include<climits> #include< ...