一,前言
看到这个图,你会想起谁?是不是想起了,曾经的用户名输入框,密码输入框...
那么,问题来了:作为iOS开发的你,这个输入框你是怎么实现的,成为关键.
二,方案
方案1:弄一个UIView,在这个视图上分别放三个控件:UIImageView,UILabel与UITextField.(这个方案很直接,如果你只是简单的直接将三个控件放到视图上,那么你的月薪暴露了,最多3K.如果你是对这个视图重写了,将那三个控件封装起来了,放在.h文件,那你的月薪应该是3.5K,如果是将那三个控件放到.m文件,那你的月薪应该是4K).
方案2:直接使用UITextField,然后设置leftView.对于这个方案,又要细分为三个方案(主要是leftView怎么实现).
2.1:弄一个UIView作为leftView,然后在这个leftView上放两个控件:UIImageView,UILabel.(那么,你的月薪应该是在4K到4.5K之间)
2.2:直接弄一个UILabel作为leftView,这里又要细分为两个方案(主要是星号怎么实现).
2.2.1:设置UILabel属性字符串,并非text.然后将"*"号变成红色,字体加大.你会发现,"*"号是会往上偏移的,那么你一定会想到在属性里面有一个设置偏移的属性.你设置的时候,你又会发现,你把"*"往下的时候"鸿歌之星"会自动的往下偏移.所以这个方案,想让"*"与"鸿歌之星"同时上下居中,貌似是不太可能的.还有一点的是,如果这个UILabel的字体,高度一旦改变,貌似偏移就变了.有不上下居中了.所以稳定性,不好!!!!(你能想到这个方案,你已经是很不错的了!你的月薪应该是在5K到8.5K左右)
2.2.2:同样是设置UILabel属性字符串.这次"*"号是用图片实现的.是通过NSTextAttachment来设置的.这个方案也很棒!但是上下居中的稳定性,还是不强.(你能想到这个方案,我也会给你点赞!你的月薪应该是在5.5K到9K左右).
方案3:在iOS开发中有一个小技巧,有图片又有文字的情况,最好使用UIButton.那么这个方案就是直接弄一个UIButton作为leftView,这里又要细分为三个方案(主要是星号怎么实现).
3.1:由于UIButton的标题也能设置属性,实现的方案与2.2相似.(你的月薪应该是在5.5K到9K左右).
3.2:直接设置UIButton的title与image,然后通过titleEdgeInsets与imageEdgeInsets调整之间的位置.但是这个方案,如果图片改了,稳定性又有问题了.(你真的太棒了:你的月薪应该是在10K到13K左右)
3.3:你应该能想到怎么实现了:重写UIButton,然后重写这三个系统方法:initWithFrame:,titleRectForContentRect:与imageRectForContentRect:.这个方案,真的很不错.如果你改了字体的大小,改了图片,都不会受到任何影响.到现在为止,我感觉这个方案,是相当不错的.我用的就是这个方案.
想说点废话:也许你会告诉面试官"C语言是面向过程的语言,OC是面向对象的语言".但是你是否想过,在你面向对象的开发中,你用了多少面向过程的思想与逻辑!!!如同方案一,完整的面向过程的思想与逻辑.屌丝!
三,我实现方案的code如下:
// 创建tf输入框
UITextField* tf = [[UITextField alloc] init];
tf.borderStyle = UITextBorderStyleRoundedRect;
tf.placeholder = @"请输入鸿歌之星";
// 创建leftView
HGButton* leftView = [HGButton leftView];
leftView.frame = CGRectMake(0, 0, 120, 44);
[leftView setImage:starImage forState:UIControlStateNormal];
[leftView setTitle:starSTR forState:UIControlStateNormal];
[leftView setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
// 设置leftView
tf.leftViewMode = UITextFieldViewModeAlways;
tf.leftView = leftView;
// 添加到self.view
[self.view addSubview:tf];
self.tf = tf;
// 布局self.tf
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// frame
self.tf.frame = CGRectMake(10, 0, self.view.frame.size.width - 10, 44);
// 相对于self.view居中
self.tf.center = self.view.center;
}
四,重写的HGButton
.h文件
#import <UIKit/UIKit.h>
@interface HGButton : UIButton
/** 类方法返回实例 */
+ (instancetype)leftView;
@end
.m文件
#import "HGButton.h"
#define HGStarW 30
@implementation HGButton
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
// 图片显示模式
self.imageView.contentMode = UIViewContentModeRight;
// 关闭交互功能
self.userInteractionEnabled = NO;
return self;
}
/** 类方法返回实例 */
+ (instancetype)leftView {
return [self buttonWithType:UIButtonTypeCustom];
}
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
return CGRectMake(HGStarW, 0, contentRect.size.width - HGStarW, contentRect.size.height);
}
- (CGRect)imageRectForContentRect:(CGRect)contentRect {
return CGRectMake(0, 0, HGStarW, contentRect.size.height);
}
@end
谢谢!