本文共 2645 字,大约阅读时间需要 8 分钟。
在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 #import10 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)x14 {15 CGRect frame = self.frame;16 frame.origin.x = x;17 self.frame = frame;18 }19 20 - (CGFloat)x21 {22 return self.frame.origin.x;23 }24 25 - (void)setY:(CGFloat)y26 {27 CGRect frame = self.frame;28 frame.origin.y = y;29 self.frame = frame;30 }31 32 - (CGFloat)y33 {34 return self.frame.origin.y;35 }36 37 - (void)setOrigin:(CGPoint)origin38 {39 CGRect frame = self.frame;40 frame.origin = origin;41 self.frame = frame;42 }43 44 - (CGPoint)origin45 {46 return self.frame.origin;47 }48 49 - (void)setWidth:(CGFloat)width50 {51 CGRect frame = self.frame;52 frame.size.width = width;53 self.frame = frame;54 }55 56 - (CGFloat)width57 {58 return self.frame.size.width;59 }60 61 - (void)setHeight:(CGFloat)height62 {63 CGRect frame = self.frame;64 frame.size.height = height;65 self.frame = frame;66 }67 68 - (CGFloat)height69 {70 return self.frame.size.height;71 }72 73 - (void)setSize:(CGSize)size74 {75 CGRect frame = self.frame;76 frame.size = size;77 self.frame = frame;78 }79 80 - (CGSize)size81 {82 return self.frame.size;83 }84 85 86 @end
这种策略虽然简单,说破了就不值钱了,但是实用!希望这篇文章能帮大家打破思维定势,不要再被frame困扰!
本文转自编程小翁博客园博客,原文链接:http://www.cnblogs.com/wengzilin/p/4359865.html,如需转载请自行联系原作者