在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/機器視覺等領域展開交流!
=======================================================