• iOS UIView 快速修改 frame


    我们修改frame中的某个值,需要进行繁琐的书写,例如:

    (1). 直接设置位置大小
    view.frame = CGRectMake(0, 0, 320, 150);
    (2). 只修改某个值
    view.frame = CGRectMake(view.frame.origin.x, 100, view.frame.size.width, view.frame.size.height);

    这种写法在界面元素较多的排版中,会让程序员非常痛苦,而且可读性也会减弱

    如果能够人性化一点,可以单独地修改某个值,或者再人性化一点,可以输出view中每一个点的坐标,将更有利于布局。我们可以通过建立view的类别 category 来实现这个人性化的布局操作

    一、建立类别

    建立一个名为Layout的UIView类别,类别的代码如下:

    1. UIView+Layout.h

    .h 文件定义了 x, y, width, height 等方便读写的属性,代码如下:

    #import <UIKit/UIKit.h>
    
    @interface UIView (Layout)
    
    @property (assign, nonatomic) CGFloat    top;
    @property (assign, nonatomic) CGFloat    bottom;
    @property (assign, nonatomic) CGFloat    left;
    @property (assign, nonatomic) CGFloat    right;
    
    @property (assign, nonatomic) CGFloat    x;
    @property (assign, nonatomic) CGFloat    y;
    @property (assign, nonatomic) CGPoint    origin;
    
    @property (assign, nonatomic) CGFloat    centerX;
    @property (assign, nonatomic) CGFloat    centerY;
    
    @property (assign, nonatomic) CGFloat    width;
    @property (assign, nonatomic) CGFloat    height;
    @property (assign, nonatomic) CGSize    size;
    
    
    @end

    2. UIView+Layout.m

    .m 文件实现各个属性的setter和getter方法,代码如下:

    #import "UIView+Layout.h"
    
    @implementation UIView (Layout)
    
    @dynamic top;
    @dynamic bottom;
    @dynamic left;
    @dynamic right;
    
    @dynamic width;
    @dynamic height;
    
    @dynamic size;
    
    @dynamic x;
    @dynamic y;
    
    - (CGFloat)top
    {
        return self.frame.origin.y;
    }
    
    - (void)setTop:(CGFloat)top
    {
        CGRect frame = self.frame;
        frame.origin.y = top;
        self.frame = frame;
    }
    
    - (CGFloat)left
    {
        return self.frame.origin.x;
    }
    
    - (void)setLeft:(CGFloat)left
    {
        CGRect frame = self.frame;
        frame.origin.x = left;
        self.frame = frame;
    }
    
    - (CGFloat)bottom
    {
        return self.frame.size.height + self.frame.origin.y;
    }
    
    - (void)setBottom:(CGFloat)bottom
    {
        CGRect frame = self.frame;
        frame.origin.y = bottom - frame.size.height;
        self.frame = frame;
    }
    
    - (CGFloat)right
    {
        return self.frame.size.width + self.frame.origin.x;
    }
    
    - (void)setRight:(CGFloat)right
    {
        CGRect frame = self.frame;
        frame.origin.x = right - frame.size.width;
        self.frame = frame;
    }
    
    - (CGFloat)x
    {
        return self.frame.origin.x;
    }
    
    - (void)setX:(CGFloat)value
    {
        CGRect frame = self.frame;
        frame.origin.x = value;
        self.frame = frame;
    }
    
    - (CGFloat)y
    {
        return self.frame.origin.y;
    }
    
    - (void)setY:(CGFloat)value
    {
        CGRect frame = self.frame;
        frame.origin.y = value;
        self.frame = frame;
    }
    
    - (CGPoint)origin
    {
        return self.frame.origin;
    }
    
    - (void)setOrigin:(CGPoint)origin
    {
        CGRect frame = self.frame;
        frame.origin = origin;
        self.frame = frame;
    }
    
    - (CGFloat)centerX
    {
        return self.center.x;
    }
    
    - (void)setCenterX:(CGFloat)centerX
    {
        CGPoint center = self.center;
        center.x = centerX;
        self.center = center;
    }
    
    - (CGFloat)centerY
    {
        return self.center.y;
    }
    
    - (void)setCenterY:(CGFloat)centerY
    {
        CGPoint center = self.center;
        center.y = centerY;
        self.center = center;
    }
    
    - (CGFloat)width
    {
        return self.frame.size.width;
    }
    
    - (void)setWidth:(CGFloat)width
    {
        CGRect frame = self.frame;
        frame.size.width = width;
        self.frame = frame;
    }
    
    - (CGFloat)height
    {
        return self.frame.size.height;
    }
    
    - (void)setHeight:(CGFloat)height
    {
        CGRect frame = self.frame;
        frame.size.height = height;
        self.frame = frame;
    }
    
    - (CGSize)size
    {
        return self.frame.size;
    }
    
    - (void)setSize:(CGSize)size
    {
        CGRect frame = self.frame;
        frame.size = size;
        self.frame = frame;
    }
    
    @end

    二、使用

    类别创建完成以后,view的布局就显得轻松很多了 例如原来你要修改y坐标时要这样写:

    view.frame = CGRectMake(view.frame.origin.x, 100, view.frame.size.width, view.frame.size.height);

    而现在只需要这样写:

    view.y = 100;

    既简洁又方便

  • 相关阅读:
    iOS 数据持久化--CoreData
    iOS 数据持久化-- FMDB
    iOS数据持久化--数据库
    iOS数据持久化--归档
    iOS数据持久化--用户属性
    python爬坑记录
    Flutter 爬坑记录
    Web开发爬坑记录
    博客 新址: http://zhoushaoting.com/
    微信小程序开发技巧及填坑记录
  • 原文地址:https://www.cnblogs.com/zhongxuan/p/4858539.html
Copyright © 2020-2023  润新知