zoukankan      html  css  js  c++  java
  • 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

    谢谢!

  • 相关阅读:
    🍖名称空间与作用域
    🍖文件打开模式 "t"
    🍖函数参数
    【转】LINQ中的Aggregate语法
    【转】c#中string.trimstart() 和string.trimend() 的用法
    1094 和为k的连续区间(暴力)
    1095 Anigram单词
    1031 骨牌覆盖 (斐波拉契数列)
    最长公共子序列(模板 LCSL)
    1092 回文字符串(LCSL_DP)
  • 原文地址:https://www.cnblogs.com/iOS771722918/p/4854907.html
Copyright © 2011-2022 走看看