Jacksonkr Jacksonkr - 29 days ago 5
iOS Question

iOS frame change one property (eg width)

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

Question



Is it possible to change only one property of a
CGRect
?

For example:

self.frame.size.width = 50;


instead of

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


of course I understand that
self.frame.size.width
is read only so I'm wondering how to do this?

CSS ANALOGY proceed at your own risk

for those of you who are familiar with
CSS
, the idea is very similar to using:

margin-left: 2px;


instead of having to change the whole value:

margin: 5px 5px 5px 2px;

Answer

To answer your original question: yes, it's possible to change just one member of a CGRect structure. This code throws no errors:

myRect.size.width = 50;

What is not possible, however, is to change a single member of a CGRect that is itself a property of another object. In that very common case, you would have to use a temporary local variable:

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

The reason for this is that using the property accessor self.frame = ... is equivalent to [self setFrame:...] and this accessor always expects an entire CGRect. Mixing C-style struct access with Objective-C property dot notation does not work well in this case.