This question was originally asked for the objective-c programming language. At the time of writing, swift didn't even exist yet.

Question

是否可以只更改CGRectone属性?

例如:

self.frame.size.width = 50;

而不是

self.frame = CGRectMake(self.frame.origin.x, 
                        self.frame.origin.y, 
                        self.frame.size.width, 
                        50);

当然我知道self.frame.size.width等于read only,所以我想知道怎么做?

CSS ANALOGY proceed at your own risk

对于那些熟悉CSS的人来说,这个 idea 非常类似于使用:

margin-left: 2px;

而不是 having to change the whole value:

margin: 5px 5px 5px 2px;

推荐答案

回答你最初的问题:是的,可以只改变CGRect struct 中的一个成员.此代码不会抛出错误:

myRect.size.width = 50;

然而,有可能的是改变一个CGRect的单个成员,它本身就是另一个对象的属性.在这种非常常见的情况下,必须使用临时局部变量:

CGRect frameRect = self.frame;
frameRect.size.width = 50;
self.frame = frameRect;

这样做的原因是,使用属性访问器self.frame = ...相当于[self setFrame:...],并且该访问器总是期望整个CGRect.在这种情况下,将C-style struct访问与Objective-C属性点表示法混合使用效果不佳.

Objective-c相关问答推荐

如果DISPATCH_SOURCE_SET_EVENT_HANDLER中的SELF需要为弱

Clang:将 id 之类的类型转换警告提升为 class

CLLocationManager startUpdatingLocation 未调用 locationManager:didUpdateLocations: 或 locationManager:didFailWithError:

Objective C 中的 RSA 实现

当我们只能使用 NSObject 时,为什么还要使用 id?

Objective-C 静态、外部、公共变量

在我的 UIImageView 的子类中没有调用 drawRect

是否可以将 NSInteger 转换为 NSNumber?

iOS 编译错误:CDVCommandDelegateImpl没有可见的@interface 声明 Select 器执行:

xcode 未知类型名称

如何隐藏/显示导航栏中的右键

类在两者中都实现.将使用两者之一

将块存储在数组中

在 NSArray 中查找最大数值

显示启动画面的时间超过默认秒数

如何从设置屏幕打开位置服务屏幕?

判断是否已实现可选协议方法

使用 respondsToSelector 时 suppress '...' is deprecated

如何判断数组是空还是空?

UIView: opaque vs. alpha vs. opacity