Я хотел бы рекомендовать использовать плагин scrollTo
http://demos.flesler.com/jquery/scrollTo/
Вы можете set scrollto с помощью jquery css selector.
$('html,body').scrollTo( $(target), 800 );
Мне повезло с точностью этого плагина и его методов, где другие методы достижения такого же эффекта, как использование .offset()
или .position()
, для меня в прошлом не было перекрестного браузера. Не говоря, что вы не можете использовать такие методы, я уверен, что есть способ сделать это кросс-браузер, я только что нашел scrollTo, чтобы быть более надежным.
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];
Для iOS:
Создать массив:
NSArray *myCGPointArray = @[[NSValue valueWithCGPoint:CGPointMake(30.0, 150.0)],[NSValue valueWithCGPoint:CGPointMake(41.67, 145.19)]];
Получить 1-й объект CGPoint:
CGPoint myPoint = [myCGPointArray[0] CGPointValue];
Попробуйте это
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);
Это работает. Удачи.
Я попробовал ответ Тибидабо, и он не сработал для меня. Было сказано, что [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? , опубликованный Джаррет Харди.
Я решаю свою проблему следующим образом:
NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray addObject:[NSValue valueWithCGPoint:myPoint]];
Благодаря michael-jensen за решение !