Преобразуйте CGPoint от системы координат UIView до системы координат CALayer

Измените scaleType из ImageView в элементах на center_crop, это сделает изображение определенного размера (dp с) и обрежет оставшуюся часть, сделав все изображения одного размера. [ 115]

Как это:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/imagethumb"
        android:layout_width="180dp"
        android:layout_height="200dp"
        android:scaleType="center_crop"/>

    <TextView
        android:id="@+id/nothing"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>
11
задан Community 23 May 2017 в 12:16
поделиться

6 ответов

Можно установить transform свойство CALayers к соответствующему преобразованию, если Вы хотите зеркально отразить их систему координат, но отметить, что это, вероятно, зеркально отразит их рисунок contents также (я не протестировал это, но это имеет смысл, что это было бы верно). Мое утверждение, что CALayer, связанный с UIView, совместно использует ту же систему координат, могло на самом деле быть совершенно ошибочным. Могло также случиться так, что CALayers используют ту же систему координат в качестве UIViews (т.е. они никогда не зеркально отражаются вертикально), но я думал, что они были, так как CoreGraphics использует зеркально отраженную систему координат относительно UIKit.

Простой способ протестировать состоял бы в том, чтобы добавить CALayer размера экрана как подуровня слоя представления, затем добавить другой маленький CALayer как подуровня этого. Вы могли установить его, чтобы обнаружиться в (0, 0, 320, 100) и видеть, обнаруживается ли это на вершине или нижней части экрана iPhone. Это скажет Вам, в котором направлении ось Y идет для CoreAnimation.

- (void)viewDidLoad {
  [super viewDidLoad];
  CALayer *rootLayer = [CALayer layer];
  rootLayer.frame = self.view.layer.bounds;
  CALayer *smallLayer = [CALayer layer];
  smallLayer.frame = CGRectMake(0, 0, rootLayer.bounds.size.width, 50);
  smallLayer.backgroundColor = [UIColor blueColor].CGColor;
  [rootLayer addSublayer:smallLayer];
  [self.view.layer addSublayer:rootLayer];
}

Я просто выполнил этот тест сам, и кажется, что CALayers на самом деле используют ту же систему координат в качестве UIViews, таким образом, мое утверждение, что зеркальное отражение CALAYER ось Y является определенно неправильным. Однако, если Вы делаете рисунок с CoreGraphics непосредственно, знать, что CoreGraphics действительно использует зеркально отраженную ось Y (хотя при рисовании в подклассе UIView или, я принимаю, делегат CALayer, контекст CoreGraphics был уже зеркально отражен для соответствия UIView's (или CALayer's) система координат).

Так короткий ответ, если Вы сделали его настолько далеко, система координат для CALayer, должен соответствовать системе координат для ее соответствующего UIView.

4
ответ дан 3 December 2019 в 05:36
поделиться

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

В случае, если Вы все еще хотите зеркально отразить систему координат так, чтобы это был источник, находится в левом верхнем углу, необходимо использовать это преобразование, которое зеркально отражает ось y. (x, y, 1) = (x', y', 1) * [1 0 0], [0 - 1 0], [0 высот 1]

который переведенный в код: [your_layer setAffineTransform:CGAffineTransformMake (1,0,0,-1,0, высота)];

1
ответ дан 3 December 2019 в 05:36
поделиться

В документации для hitTest говорится:

/* Returns the farthest descendant of the layer containing point 'p'.
 * Siblings are searched in top-to-bottom order. 'p' is in the
 * coordinate system of the receiver's superlayer. */

Таким образом, необходимо сделать (что-то вроде этого):

CGPoint thePoint = [touch locationInView:self];
thePoint = [self.layer convertPoint:thePoint toLayer:self.layer.superlayer];
CALayer *theLayer = [self.layer hitTest:thePoint];
13
ответ дан 3 December 2019 в 05:36
поделиться

Я полагаю, что эти два имеют ту же систему координат.

-2
ответ дан 3 December 2019 в 05:36
поделиться

Я верю системе координат UIView, и его связанный слой должен быть тем же. Однако при создании слоев сами система координат зеркально отражается вертикально.

0
ответ дан 3 December 2019 в 05:36
поделиться

Что касается документации Apple, я нашел «Примечание для iPhone OS» в разделе «Система координат слоев» Базового руководства по программированию анимации (2008-11-13).

Корневой слой по умолчанию для экземпляра UIView использует перевернутую систему координат, которая соответствует системе координат по умолчанию для экземпляра UIView - начало координат находится в верхнем левом углу, а значения увеличиваются вниз и вправо. Слои, созданные путем создания экземпляра CALayer, напрямую используют стандартную систему координат Core Animation.

5
ответ дан 3 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

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