参考:http://www.cnblogs.com/wengzilin/p/4359865.html

在iOS中view的frame属性使用地太频繁了,尤其是调UI的时候。我们知道,正常情况下我们无法对frame的某个属性(x,y,width,height等)进行单独修改,比如:

1
someView.frame.x = 100;

这种方式是不允许的,但实际上我们更经常遇到的是frame的大部分元素值保持不变,只改变其中的一部分。相信这个烦恼困扰了不少人,于是我们不得不用以下两种方法去达到目的:

1
2
3
4
5
6
7
8
法1:
CGRect frame = someView.frame;
frame.x =100;
frame.width = 200;
someView.frame = frame;
 
法2:
someView.frame = CGRectMake(100, XXX, 200, XXX);

法2看起来也很精简,但实际上也很麻烦,因为实际应用场景中x, y, width, height四个值都是依赖别的变量,导致法2的语句非常长。简而言之,以上方法都不够“优雅”。那怎样才算优雅呢?我觉得如果我们能如下这样直接修改某个值就完美了:

1
2
someView.x = 100;
someView.width = 200;

我们跳过someView的frame属性,直接修改了我们想要的元素值。幸运的是,我们使用category可以相当方便地达到目的,这是一件一劳永逸的事情,引入一次category后整个工程都可以使用这种修改方法:

 1 //
2 // UIView+Frame.h
3 // WZLCodeLibrary
4 //
5 // Created by wzl on 15/3/23.
6 // Copyright (c) 2015年 Weng-Zilin. All rights reserved.
7 //
8
9 #import <UIKit/UIKit.h>
10
11 @interface UIView (Frame)
12
13 @property (nonatomic, assign) CGFloat x;
14 @property (nonatomic, assign) CGFloat y;
15 @property (nonatomic, assign) CGFloat width;
16 @property (nonatomic, assign) CGFloat height;
17 @property (nonatomic, assign) CGPoint origin;
18 @property (nonatomic, assign) CGSize size;
19
20 @end
 1 //
2 // UIView+Frame.m
3 // WZLCodeLibrary
4 //
5 // Created by wzl on 15/3/23.
6 // Copyright (c) 2015年 Weng-Zilin. All rights reserved.
7 //
8
9 #import "UIView+Frame.h"
10
11 @implementation UIView (Frame)
12
13 - (void)setX:(CGFloat)x
14 {
15 CGRect frame = self.frame;
16 frame.origin.x = x;
17 self.frame = frame;
18 }
19
20 - (CGFloat)x
21 {
22 return self.frame.origin.x;
23 }
24
25 - (void)setY:(CGFloat)y
26 {
27 CGRect frame = self.frame;
28 frame.origin.y = y;
29 self.frame = frame;
30 }
31
32 - (CGFloat)y
33 {
34 return self.frame.origin.y;
35 }
36
37 - (void)setOrigin:(CGPoint)origin
38 {
39 CGRect frame = self.frame;
40 frame.origin = origin;
41 self.frame = frame;
42 }
43
44 - (CGPoint)origin
45 {
46 return self.frame.origin;
47 }
48
49 - (void)setWidth:(CGFloat)width
50 {
51 CGRect frame = self.frame;
52 frame.size.width = width;
53 self.frame = frame;
54 }
55
56 - (CGFloat)width
57 {
58 return self.frame.size.width;
59 }
60
61 - (void)setHeight:(CGFloat)height
62 {
63 CGRect frame = self.frame;
64 frame.size.height = height;
65 self.frame = frame;
66 }
67
68 - (CGFloat)height
69 {
70 return self.frame.size.height;
71 }
72
73 - (void)setSize:(CGSize)size
74 {
75 CGRect frame = self.frame;
76 frame.size = size;
77 self.frame = frame;
78 }
79
80 - (CGSize)size
81 {
82 return self.frame.size;
83 }
84
85
86 @end

这种策略虽然简单,说破了就不值钱了,但是实用!希望这篇文章能帮大家打破思维定势,不要再被frame困扰!

ios 中直接修改frame里边某个属性的简便方法的更多相关文章

  1. 【原】iOS:一种直接修改frame的某个属性的方法

    在iOS中view的frame属性使用地太频繁了,尤其是调UI的时候.我们知道,正常情况下我们无法对frame的某个属性(x,y,width,height等)进行单独修改,比如: someView.f ...

  2. iOS UIView 快速修改 frame,

    在iOS开发布局修改 frame 时需要繁琐的代码实现,今天偶尔看到一播客说到快速修改的 frame 的方法,自己动手写了一遍实现代码. 快速实现主要通过 添加类目的方式,对UIView 控件添加了一 ...

  3. Eclipse中SVN修改的*星号没了,解决方法

    Eclipse中SVN修改的*星号没了,解决方法 打开Preference 第一步:去掉外加的 ">" 第二步:勾选Outgoing changes 这样做之后," ...

  4. iOS UIView 快速修改 frame

    我们修改frame中的某个值,需要进行繁琐的书写,例如: (1). 直接设置位置大小 view.frame = CGRectMake(0, 0, 320, 150); (2). 只修改某个值 view ...

  5. iOS中的成员变量,实例变量,属性变量

    在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是以前的用法) @interface MyV ...

  6. IOS中bounds和frame

    * 用bounds和frame来修改尺寸是有一些小区别的 三.isEqual:方法 1> 系统会根据对象isEqual方法的返回值来决定两个对象是否相同 * 比如判断对象a和b是否相同,就会查看 ...

  7. 一句话搞定IOS中View的Frame和Bound

    就一句话,Frame是父View上看到子View的窗户,Bound是子View上可以被父View看见的内容. 稍微解释下.Frame 指子View在父View中的位置以及大小.由两部分构成,第一部分是 ...

  8. iOS中navigationItem修改标题的颜色

    UIColor * color = [UIColor redColor];//这里我们设置的是颜色,NSDictionary * dict = [NSDictionary dictionaryWith ...

  9. VS中查看/修改Dialog控件TAB顺序的方法

    打开资源视图,打开Dialog的编辑界面 查看: 格式>Tab键顺序 修改: 格式>Tab键顺序 用鼠标左键按你想要的顺序点击各个控件的TAB标签,就设定了 那些你想要TAB键能选择到的控 ...

随机推荐

  1. javascript string 函数集

    JavaScript_String对象说明 string中文为"字符串"的意思,String继承自Object对象,此对象提供字符串的查找操作等函数 JavaScript字符串类型 ...

  2. notepad++和sublime 常用插件及主题

    sublime: 常用主题有: Pastels on Dark Monokai Zenburnsque 常用插件有 Anaconda Package Control Side Bar ConvertT ...

  3. 示波器trigger的使用方法

    背景: 下位机有俩个IO口设置为外部中断——边沿触发.低电平有效.因此我需要抓取下降沿波形,但低电平时间很短,手动暂停抓取不仅不科学还费力,那么该如何准确的抓取到呢?最好的办法是使用示波器的trige ...

  4. Spark之命令

    Spark之命令 1.spark运行模式有4种: a.local 多有用测试, b. standalone:spark 集群模式,使用spark自己的调度方式. c. Yarn: 对Mapreduce ...

  5. 进军swift

    swift中文文档网站 http://letsswift.com/category/swiftguide/language-guide/ Swift的优缺点 , 来自珍妮讲解~~ 优点1.简洁(不是说 ...

  6. 剑指Offer 跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法.   解题思路: f(n)=f(n-1)+f(n-2); f(1)=1,f(2)=2;   AC代码 ...

  7. php中发送email

    一.使用PHP内置的mail()函数 看了一下手册,就直接开始写代码了,如下 <?php $to = "test@163.com"; //收件人 $subject = &qu ...

  8. BZOJ 4516: [Sdoi2016]生成魔咒

    Description 给出一串数字,求每次插入一个数字后本质不同的子串. Sol SAM. 在 SAM 上添加节点的时候统计一下 \(val[np]-val[par[np]]\) 就可以了... 用 ...

  9. 9.5---括号是否有效(CC150)

    leetcode原题: char temp ; Stack<Character> stack = new Stack<Character>();//error:Stack< ...

  10. 3.7---猫狗收容所(CC150)

    解答的思路:建立一个queue放狗,一个queue放猫. 如下: import java.util.*; class Dog{ int time; int value; Dog(int a, int ...