(转)设置 UILabel 和 UITextField 的 Padding 或 Insets (理解UIEdgeInsets)

转自http://unmi.cc/uilable-uitextfield-padding-insets 主要是理解下UIEdgeInsets在IOS UI里的意义.
靠,这货其实就是间隔,起个名字这么让人费解!!!正值表示间隔值,负值表示超出参照物的距离。
--------------------------------------------------------分割线,下面是转载原文---------------------------------------------------

iOS 的控件,只看到 UIButton 可以设置 Padding/Insets,即按钮上文字或图片与按钮边界的间隙,对与 CSS 来说叫做 Padding,在 iOS 中叫做 Insets,UIButton 设置 Insets 相应的属性如下:

Configuring Edge Insets

contentEdgeInsets  property
      titleEdgeInsets  property
      imageEdgeInsets  property

它们接受的属性类型是:UIEdgeInsets,由函数 UIEdgeInsetsMake ( CGFloat top, CGFloat left, CGFloat bottom, CGFloat right );     构造出,分别表示其中的内容/标题/图片离各边的距离。

在 xib 中也有界面来对按钮的这三个 EdgeInsets 属性的设置,分别是按钮的 Edge 和 Inset 属性。

印像中,Swing 的许多组件都可设置 Insets 属性,可对于 iOS 的控件就没那么幸运了,比如我想设置 UILable 或 UITextField 中的文本离边界的间隙,无伦是在 xib 里还是直接代码的方式都无能为力,因为它们根据未开放相应的属性让你去控制。

办法当然还是有的,自定义相应自己的控件了,比如 InsetsLabel 或是  InsetsTextField,接着就是覆盖某些个方法来达成。

首先来看 UILabel 的子类 InsetsLabel 的实现代码:


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

//1.header file

#import <UIKit/UIKit.h>

@interface InsetsLabel : UILabel

@property(nonatomic) UIEdgeInsets insets;

-(id) initWithFrame:(CGRect)frame andInsets: (UIEdgeInsets) insets;

-(id) initWithInsets: (UIEdgeInsets) insets;

@end

//2. implementation file

#import "InsetsLabel.h"

@implementation InsetsLabel

@synthesize insets=_insets;

-(id) initWithFrame:(CGRect)frame andInsets:(UIEdgeInsets)insets {

    self = [super initWithFrame:frame];

    if(self){

        self.insets = insets;

    }

    return self;

}

-(id) initWithInsets:(UIEdgeInsets)insets {

    self = [super init];

    if(self){

        self.insets = insets;

    }

    return self;

}

-(void) drawTextInRect:(CGRect)rect {

    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.insets)];

}

关键就是覆盖了 -(void) drawTextInRect: (CGRect) rect; 方法,在画  Label 的文本时分别设置文本与  Label 四个边的间隙,即画在 Label 内的一个小矩形内,这个例子提供了便利的构造函数,提供自己的 UIEdgeInsets 属性。另外,函数 UIEdgeInsetsInsetRect(CGRect, UIEdgeInsets) 应该是好理解的。

再看如何设置 UITextField 中文本到四边的间距,这里也可以定义自己的 InsetsTextField:


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

//

//  Created by Unmi on 11/2/11.

//  Copyright (c) 2011 http://unmi.cc. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface InsetsTextField : UITextField

@end

@implementation InsetsTextField

//控制 placeHolder 的位置,左右缩 20

- (CGRect)textRectForBounds:(CGRect)bounds {

    return CGRectInset( bounds , 20 , 0 );

}

// 控制文本的位置,左右缩 20

- (CGRect)editingRectForBounds:(CGRect)bounds {

    return CGRectInset( bounds , 20 , 0 );

}

@end

//-----------------------------------------------------------------

//下面是使用 InsetsTextField 的代码,可放在 viewDidLoad 等代理方法中

InsetsTextField *insetTextField = [[InsetsTextField alloc]

                                  initWithFrame:CGRectMake(10, 10, 180, 25)];

//须手动设置它的 borderStyle, 不然看不到边框的

insetsTextField.borderStyle = UITextBorderStyleRoundedRect;

[self.view addSubview:insetsTextField];

[insetsTextField release];

效果如下:

上面更像是借鉴的 InsetsLabel 的实现,其实对于 UITextField 还有更好的实现办法,而且更简单,因为 UITextFiled 原来就支持的做法。比如它可以让你做出在文本框最前方固定一个 $ 符号,表示这个文本框是输入钱的,第一个$ 是不能被删除的。确实,你可以在 TextField 上贴个 Label,然后文本框的光标后移,稍显麻烦了。

而 UITextField 可以直接设置 leftView 或 rightView, 然后文本输入区域就在 leftView 和 rightView 之间了,看例子:


1

2

3

4

5

6

UILabel *paddingView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 25)];

paddingView.text = @"$";

paddingView.textColor = [UIColor darkGrayColor];

paddingView.backgroundColor = [UIColor clearColor];

textfield.leftView = paddingView;

textfield.leftViewMode = UITextFieldViewModeAlways;

rightView 也是一样的设置方式,其中的  Mode 有四种,看到名字应该不难理解:

UITextFieldViewModeNever,
    UITextFieldViewModeWhileEditing,
    UITextFieldViewModeUnlessEditing,
    UITextFieldViewModeAlways

它的效果呢就更酷了:

文本框的起始光标是从上图数字 1 位置开始的。

实际应用中,对于 UITextField 如果有类似的需求,我会毫不犹豫的使用 leftView/rightView 属性来设置。

参考:1. http://stackoverflow.com/questions/2694411/text-inset-for-uitextfield
            2. http://stackoverflow.com/questions/5674655/uitextfield-align-left-margin

时间: 2024-11-09 05:50:04

(转)设置 UILabel 和 UITextField 的 Padding 或 Insets (理解UIEdgeInsets)的相关文章

iOS 设置UILabel 的内边距

iOS 设置UILabel 的内边距 - (void)drawTextInRect:(CGRect)rect { UIEdgeInsets insets = {0, 5, 0, 5}; [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; } 参考:http://stackoverflow.com/questions/3476646/uilabel-text-margin http://unmi.cc/uilable-uitext

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

 以下是三个IOS开发中最常用的控件,作为IOS基础学习教程知识 ,初学者需要了解其基本定义和常用设置,以便在开发在熟练运用. UIButton按钮 第一.UIButton的定义 UIButton *button=[[UIButton buttonWithType:(UIButtonType); 能够定义的button类型有以下6种, typedef enum { UIButtonTypeCustom = 0,  自定义风格 UIButtonTypeRoundedRect,  圆角矩形 UIBu

UILabel Button UITextField

UILabelUILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(50.0, 20.0, 200.0, 50.0)]; //设置Label的位置和大小 //设置显示文字 label1.text = @"用户名"; //设置字体:粗体,正常的是 SystemFontOfSize label1.font = [UIFont boldSystemFontOfSize:20]; //设置文字颜色 label1.textColor

iOS 设置UILabel的行间距并自适应高度

NSString *contentStr = @"总以为,在最初的地方,有一个最原来的我,就也会有一个最原来的你"; UILabel *tempLabel = [[UILabel alloc] init]; //设置背景颜色 tempLabel.backgroundColor = [UIColor redColor]; //设置内容 tempLabel.text = contentStr; //设置字体颜色 tempLabel.textColor = [UIColor whiteCol

里面的div没有设置宽高,用padding设置的50px来撑开宽高,这个时候就需要用position:absolute或者relative来让文本去掉继承的外层的整宽度

1. <!DOCTYPE html><html><head><style>*{margin:0px;padding:0px;}#div1{position: relative;height: 200px;width: 200px;margin: 100px;padding:10px;border: 1px solid black;} #div2{padding:50px;position: absolute;border: 1px solid black;b

关于margin:-10000px;padding:10000px;的理解

原文链接:http://javakid.blog.163.com/blog/static/191061094201221414057146/ 内外补丁负值法是指通过内外补丁的设置来解决一些我们通常方法不能实现的效果.例如:可以通过改变盒模型的样式来使几列div由内容撑开高度但几列div与最高的一栏等高的问题.但是为什么会出现这样的情况呢?先来充分理解一下margin和padding:说的直白一些margin就是模块与模块之间的间隙,而padding是边框与内容之间的间隙.当设置padding-b

控件设置属性(UIButton,UITextField)

//延展@interface AppDelegate (){    UIView *_View;}//不是一开始定义类的时候定义的实例变量,而是后期根据需求而定义的实例变量,统一定义在.m文件中的延展中,外界不可见.@end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

iOS基础控件之UILabel、UITextField、UIButton(文本、输入框、按钮)

UILabel主要是为了显示文本,UITextField主要是为了输入文本,UIButton可以显示文本并且响应事件. 在详细讲诉这三个控件之前,我想先讲一下UIView,其实UIView很好理解,就是之前讲UIWindow时的添加在画板上的画布.而它也非常的重要,在iOS中几乎所有可视化控件都是UIView的子类,这三个控件当然也包括在内. 如何用代码创建UIView: //设置frame确定UIView对象的位置以及大小 UIView *view =[ [UIView alloc] init

##DAY2 UILabel、UITextField、UIButton、UIImageView、UISlider

#pragma mark ———————UILabel——————————— UILabel属性: text:文本内容 textColor:内容的颜色 textAlignment:对齐方式(水平方向) font:字体 numberOfLines:行数 lineBreakMode:断行模式 shadowColor:阴影颜色 shadowOffset:阴影大小(阴影向x正?向偏移a,向y正?向偏移b) #pragma mark ———————UITextField —————————— UIText