zoukankan      html  css  js  c++  java
  • 【原】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/机器视觉等领域展开交流!

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

  • 相关阅读:
    安装selenium
    android MediaPlayer API 详解
    如鹏网学习笔记(六)ADO.Net基础
    如鹏网学习笔记(五)MySql基础
    如鹏网学习笔记(七)HTML基础
    10.12作业
    10.10作业
    201671010111 201620172 《java程序设计》 学习态度的重要性
    201671010111 201620172《面向对象的程序设计》 编程总结
    201671010111 201620172《Java程序设计》再看java
  • 原文地址:https://www.cnblogs.com/wengzilin/p/4359865.html
Copyright © 2011-2022 走看看