iOS开发中的那些小技巧

一,前言

看到这个图,你会想起谁?是不是想起了,曾经的用户名输入框,密码输入框...

那么,问题来了:作为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

 

 

谢谢!

posted @ 2015-10-04 19:59  花园晓雨  阅读(368)  评论(0编辑  收藏  举报