【原】iOS:一種直接修改frame的某個屬性的方法


在iOS中view的frame屬性使用地太頻繁了,尤其是調UI的時候。我們知道,正常情況下我們無法對frame的某個屬性(x,y,width,height等)進行單獨修改,比如:

someView.frame.x = 100;

這種方式是不允許的,但實際上我們更經常遇到的是frame的大部分元素值保持不變,只改變其中的一部分。相信這個煩惱困擾了不少人,於是我們不得不用以下兩種方法去達到目的:

法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的語句非常長。簡而言之,以上方法都不夠“優雅”。那怎樣才算優雅呢?我覺得如果我們能如下這樣直接修改某個值就完美了:

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困擾!

=======================================================

原創文章,轉載請注明 編程小翁@博客園,郵件zilin_weng@163.com,微信Jilon,歡迎各位與我在C/C++/Objective-C/機器視覺等領域展開交流!

 =======================================================


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM