2010-11-21 8 views
5

Mam trzy pytania otaczający co myślę jest tematem kodowanym w obj-custawienie i korzystania obj-c CGPoint, CGRect i inni

1) Dlaczego jest to, że często (lub zawsze) nie mogą brać członek var, który jest CGPoint lub CGRect i ustawić wartości jeden po drugim? Uważam, że trzeba zrobić:

CGPoint point; 
point.x = someValue; 
point.y = someOtherValue; 
obj.myPoint = point; 

zamiast po prostu obj.myPoint.x = someValue itp

2) Czy jest to zachowanie, które jest zgodne we wszystkich strukturach w obj-c?

3) Czy istnieje łatwy sposób dodania dwóch punktów CG? Wygląda na to, że powinno już być, ale nie mogłem go znaleźć. Pomyślałem, że byłoby to uciążliwe, gdybym musiał użyć tymczasowego CGPoint do gromadzenia wartości pomiędzy dwoma punktami CG, przed ustawieniem dest var na temp var (ponieważ nie można po prostu zrobić pointA.x + = pointB.x (sama dla y).

Odpowiedz

0

jest to całkowicie normalne zjawisko. „obj” jest właścicielem tego var i ma pobierające i ustawiające, nie można modyfikować elementów tej zmiennej.

najlepiej zrobić to skopiować struct i modyfikować co trzeba.

również pamiętać, można użyć CGPointMake (x, y) funkcji (i taki sam dla wszystkich strukturach CG), co jest o wiele łatwiejsze.

Aby zaktualizować ten jest najprostszy:

CGPoint point = obj.myPoint; 
point.x += 10.0f; 
obj.myPoint = point; 

Obj-C 2,0 ukrywa pobierające i ustawiające, które wygląda następująco:

CGPoint point = [obj myPoint]; 
point.x += 10.0f; 
[obj setMyPoint:point]; 
11

1) od @sb w odpowiedzi na Cocoa Objective-c Property C structure assign fails

To nic nie da, ponieważ [t member] zwraca struct, który jest "wartością-r", tj. wartość, która jest ważna tylko do użycia po prawej stronie zlecenia. Ma wartość, ale nie ma sensu próbować zmieniać tej wartości.

Zasadniczo musisz po prostu żyć z tym, że nie możesz ustawić pól struct bezpośrednio po zwróceniu z funkcji.

2) Tak

3) Niestety, nie sądzę, nie ma wbudowanej metody wygoda dla dodanie dwóch CGPoint. Jeśli okaże się Twój własny robi to często można tworzyć własne:

CGPoint CGPointAdd(CGPoint p1, CGPoint p2) 
{ 
    return CGPointMake(p1.x + p2.x, p1.y + p2.y); 
} 

a następnie używać go jak:

obj.pointA = CGPointAdd(obj.pointA, pointB);

nie tak eleganckie, jak obj.pointA.X += ... ale czasami życie nie jest fair.

Powiązane problemy