Вопрос по ios, xcode, uiview, cocoa – Как установить ссылку на источник UIView?

20

Я создаю UIImageView и добавляю его в цикле к своему виду, я устанавливаю начальный кадр на 0,0,1,47, и при каждом прохождении цикла я меняю центр изображения, чтобы разметить их.

Я всегда использую 0 в качестве origin.y

Проблема в том, что исходная ссылка находится в центре изображения, если предположить, что мы работали в конструкторе интерфейсов, это эквивалентно изображению ниже.

Как я могу изменить контрольную точку в коде?

enter image description here

Да но дело былоHow can I change the reference point in code ? Daniel
Вы не можете просто переместить эту красную вещь в IB? Christian Schnorr

Ваш Ответ

3   ответа
44

я не совсем уверен, в чем ваша точка зрения.

СUIView Вы можете установить положение двумя способами:

center – It definitely says it is the center. frame.origin – Top left corner, can't be set directly.

Если вы хотите, чтобы нижний левый угол был при x = 300, y = 300, вы можете просто сделать это:

UIView *view = ...
CGRect frame = view.frame;
frame.origin.x = 300 - frame.size.width;
frame.origin.y = 300 - frame.size.height;
view.frame = frame;

Но если вы идете на один уровень глубже в волшебный мирCALayers (не забывайте импортировать QuartzCore), вы сильнее.

CALayer имеет эти:

position – You see, it don't explicitely says 'center', so it may not be center! anchorPointCGPoint with values in range 0..1 (including) that specifies point inside the view. Default is x=0.5, y=0.5 which means 'center' (and -[UIView center] assumes this value). You may set it to any other value and the position property will be applied to that point.

Пример времени:

You have a view with size 100x100 view.layer.anchorPoint = CGPointMake(1, 1); view.layer.position = CGPointMake(300, 300); Top left corner of the view is at x=200, y=200 and its bottom right corner is at x=300, y=300.

Note: Когда вы вращаете слой / вид, он будет вращаться вокругanchorPointэто центр по умолчанию.

Бу, так как вы просто спроситеHOW делать конкретную вещь, а неWHAT ты хочешь достичь, я больше не могу тебе помочь.

anchorPoint - чистая магия, большое спасибо за это! У меня была немного другая проблема, я масштабировал представления, которые закреплены внизу. Свойство anchorPoint сделало это полностью без проблем - удалили около 20 строк кода ...
Я помню, что весь смысл заключался в том, чтобы проще и быстрее выровнять подпредставление вправо, установив начало координат по центру вправо, а затем присвоив значению ширину его родителя. Это означает, что нужно обойтись без математики, вычисляющей ширину минус дочерняя ширина и т. Д. И т. Д. Daniel
Вы можете легко создать cetagory наUIView с такими свойствами, какframeBorderLeft или жеframeOrigin и реализовать эти средства доступа вручную. Тогда тебе легче.
Я был очень смущен, когда я спросил это. Короче говоря, с помощью функции Xcode IB вы можете установить метрики UIView с помощью полезной панели, задать значения пикселей, но вы также можете изменить точку отсчета от центра к верхнему среднему, верхнему правому, нижнему левому и т.д. ... и это заставило меня подумать, что я мог бы сделать это как-то в коде, но это было просто полезным интерфейсом, если не запутанным дополнением к Xcode Apple ... Daniel
2

вам нужно установить кадр изображения, которое вы хотите переместить. Это можно сделать в простом случае, как это:

_theImageView.frame = CGRectMake(x, y, width, height);

Очевидно, вам нужно установить x, y, width и height самостоятельно. Также следует иметь в виду, что фрейм представления относится к его родительскому представлению. Итак, если у вас есть вид, который находится в верхнем левом углу (x = 0, y = 0), имеет ширину 320 точек и высоту 400 точек, и вы устанавливаете рамку вида изображения как (10, 50, 100, 50), а затем добавьте его в качестве подпредставления предыдущего представления, оно будет находиться в точке x = 10, y = 50 координатного пространства родительского представления, даже если границы представления изображения равны x = 0, y = 0. Границы относятся к самому представлению, рамка - к родительскому.

Итак, в вашем сценарии ваш код может выглядеть примерно так:

CGRect currentFrame = _theImageView.frame;
currentFrame.origin.x = 0;
currentFrame.origin.y = 0;
_theImageView.frame = currentFrame;

[_parentView addSubview:_theImageView];

В качестве альтернативы вы можете сказать:

CGRect currentFrame = _theImageView.frame;
_theImageView.frame = CGRectMake(0, 0, currentFrame.size.width, currentFrame.size.height);

[_parentView addSubview:_theImageView];

Любой подход установит представление изображения в верхнем левом углу родительского элемента, к которому вы добавляете его.

Спасибо jmstone. Это помогло в моем случае.
Привет, проблема в том, что исходная точка установлена в абсолютном центре этого представления, мне нужно изменить его на верхний левый. Daniel
Как я объяснил выше, вам просто нужно установить x и y вида изображения на 0, 0. Это поместит его на 0, 0 его родительского вида.
Что мне действительно нужно, так это установить происхождение моего вида в известную точку, не беспокоясь о размере вида. Daniel
8

е изменить это следующим образом:

CGRect frame = self.imageView.frame;
frame.origin.y = 0.0f;
self.imageView.frame = frame;
@ Даниил, вы отметили это как решенное? Я не думаю, что это отвечает на ваш вопрос. Вы уже нашли решение?
Привет, вопрос не столько в том, как изменить рамку, сколько в том, как изменить исходную точку. В настоящее время установка y = 0 означает, что центр обзора установлен на y = 0, а не на верх Daniel
У вас такая же проблема? Это потому, что построитель интерфейса Xcode проще визуально компоновать вещи. На самом деле происхождение является центром ... Daniel
Происхождение, вероятно, не лучшее слово для описания того, что я имею в виду, вы видите, что в IB вы можете изменить исходную точку отсчета сверху слева, сказать центр или нижнюю середину или центр справа ... см. Изображение, которое я прикрепил. Ну, я добавил представление в коде, и я хотел установить начало координат (координаты) в верхней части родительского представления, так что у меня будет y = 0. Однако кажется, что исходная точка моего обзора установлена не в верхнем левом углу, как кажется по умолчанию, а в центре (см. Изображение). Поэтому, когда я устанавливаю y = 0, вид только показывает его нижнюю половину, поскольку центр этого вида установлен на y = 0. Daniel
Когда вы говорите происхождение, о каком происхождении вы говорите? Смещение origin.y фрейма - это положение его вершины в суперпредставлении. Существует "центр" Свойство для вида, но я дон & APOS; т знать о любой подвижной опорной точке в пределах вида.

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