Как сформировать массив CGPoint в Objective C

Я хотел бы рекомендовать использовать плагин scrollTo

http://demos.flesler.com/jquery/scrollTo/

Вы можете set scrollto с помощью jquery css selector.

$('html,body').scrollTo( $(target), 800 );

Мне повезло с точностью этого плагина и его методов, где другие методы достижения такого же эффекта, как использование .offset() или .position(), для меня в прошлом не было перекрестного браузера. Не говоря, что вы не можете использовать такие методы, я уверен, что есть способ сделать это кросс-браузер, я только что нашел scrollTo, чтобы быть более надежным.

29
задан Luke 11 June 2012 в 09:07
поделиться

5 ответов

C-массивы на самом деле не являются массивами во время выполнения, где они просто являются указателями на непрерывный блок объектов одного типа. Когда вы видите items[n], это просто синтаксический сахар для *(items+n).

В вашем примере addLines[1] будет *(lines+1), а addLines[0] будет *(lines+0), то есть *lines. Итак, addLines просто lines без разыменования указателя. *lines - это первый элемент в массиве, а lines - весь массив.

Массивы имеют некоторые отличия от указателей во время компиляции. Например, sizeof(addLines) даст вам размер всего массива.

Массив теряется, как только вы передаете массив где-нибудь, где его размер может быть переменным, но вы все равно можете использовать оператор индекса. Например:

#include <Foundation/Foundation.h>

#define showsize( expr ) ( printf(#expr " = %zd\n", ( expr ) ) )

CGPoint *
pass_back(CGPoint points[4])
{
    showsize(sizeof(points));
    return points;
}

int
main(void)
{
    CGPoint square[] = {CGPointMake(-1.0,  1.0),
                        CGPointMake( 1.0,  1.0),
                        CGPointMake( 1.0, -1.0),
                        CGPointMake(-1.0, -1.0)};
    CGPoint* returned;
    int i;

    showsize(sizeof(CGPoint));
    showsize(sizeof(CGPoint*));
    showsize(sizeof(square));
    returned = pass_back(square);
    showsize(sizeof(returned));

    for (i = 0; i < 4; ++i) {
        printf("returned[%d] = {%0.1f, %0.1f}\n", i, (float) returned[i].x,
                                                 (float) returned[i].y);
    }

    return 0;
}

Это выводит следующее на моем Mac:

sizeof(CGPoint) = 8
sizeof(CGPoint*) = 4
sizeof(square) = 32
sizeof(points) = 4
sizeof(returned) = 4
returned[0] = {-1.0, 1.0}
returned[1] = {1.0, 1.0}
returned[2] = {1.0, -1.0}
returned[3] = {-1.0, -1.0}

Здесь, square - размер четырех CGPoint с, но один раз отправляется на pass_back, это всего лишь размер указателя, потому что это так. Когда указатель возвращается (и называется returned), он все еще может использоваться как массив.

Обратите внимание на магическое число 4 в цикле. Указатель не знает длину массива, на который он указывает.

Массивы нельзя переназначить с помощью оператора =. Если вы действительно должны заполнить addLines точками из lines, вы можете сделать это с помощью чего-то вроде следующего:

memcpy(addLines, lines, sizeof(CGPoint) * numberOfPoints);

Вы должны будете получить numberOfPoints откуда-то и addLines ] должно быть достаточно большим, чтобы справиться с этими вопросами. Это нормально, если число точек является константой, но было бы плохо , если количество точек может изменяться во время выполнения, особенно если точки приходят из внешнего мира (подумайте о выполнении произвольного кода).

Я бы изменил averageResponseTimePoints так, чтобы он возвращал NSArray, а не массив в стиле C. Вам нужно будет инкапсулировать CGPoint в объекты - либо свой собственный объект, либо NSValue.

Вот пример того, как вы могли бы написать averageResponseTimePoints:

- (NSArray*) averageResponseTimePoints
{
    NSMutableArray* result = [[[NSMutableArray alloc] init] autorelease];

    for (int i = 0; i < numberOfPoints; ++i) {
        NSValue* point = [NSValue value:points+i
                           withObjCType:@encode(CGPoint)];
        [result addObject:point];
    }

    return result;
}

Если ваш код работает с CocoaTouch, вы можете использовать его для создания значения точки вместо:

NSValue* point = [NSValue valueWithCGPoint:points[i]];

Чтобы вывести CGPoint из массива, вы можете написать что-то вроде этого:

for (NSValue* value in result) {
    NSPoint pt;
    [value getValue:&pt];
    NSLog(@"%f %f", pt.x, pt.y);
}

Или с CocoaTouch:

CGPoint pt = [value CGPointValue];
50
ответ дан Community 11 June 2012 в 09:07
поделиться

Для iOS:

Создать массив:

NSArray *myCGPointArray = @[[NSValue valueWithCGPoint:CGPointMake(30.0, 150.0)],[NSValue valueWithCGPoint:CGPointMake(41.67, 145.19)]];

Получить 1-й объект CGPoint:

CGPoint myPoint = [myCGPointArray[0] CGPointValue];
51
ответ дан Tibidabo 11 June 2012 в 09:07
поделиться

Попробуйте это

CGPoint A[10];
A[0] = CGPointMake(10.0, 10.0);
A[1] = CGPointMake(10.0, 12.0);
float x = A[1].y;
NSLog(@"%.0f", x);

Это работает. Удачи.

4
ответ дан Baruch Kly 11 June 2012 в 09:07
поделиться

Я попробовал ответ Тибидабо, и он не сработал для меня. Было сказано, что [myCGPointArray objectAtIndex: 0] имеет тип id, поэтому я не могу вызвать CGPointValue для него. гм.

это сработало, однако:

NSArray *points = [NSArray arrayWithObjects:
                   [NSValue valueWithCGPoint:CGPointMake(5.5, 6.6)],
                   [NSValue valueWithCGPoint:CGPointMake(7.7, 8.8)],
                   nil];

NSValue *val = [points objectAtIndex:0];
CGPoint point = [val CGPointValue];
float X = point.x;
NSLog(@"cgpoint value is: %f", X);

или

NSArray *points = [NSArray arrayWithObjects:
                        [NSValue valueWithCGPoint:CGPointMake(20, 6.6)],
                        [NSValue valueWithCGPoint:CGPointMake(7.7, 8.8)],
                        nil];
float xCoordinate = [[points objectAtIndex:0] CGPointValue].x;

Я нашел это здесь: Как можно легко добавить объекты CGPoint в NSArray? , опубликованный Джаррет Харди.

3
ответ дан Community 11 June 2012 в 09:07
поделиться

Я решаю свою проблему следующим образом:


NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray addObject:[NSValue valueWithCGPoint:myPoint]];

Благодаря michael-jensen за решение !

2
ответ дан Community 11 June 2012 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: