Возможный скопировать CALayer с UIView?

Хотя мне очень нравятся ваши методы и я люблю увеличение скорости, к сожалению, они теряют свои способности, когда e1 e2 имеют более сложную структуру, чем вектор.

> dim(a) <- c(1e2, 1e4)
> dim(b) <- c(1e2, 1e4)
> 
> identical(!a, my.not(a))            
[1] FALSE
> identical(a & b, my.and(a, b))       
[1] FALSE
> identical(a | b, my.or(a, b))        
[1] FALSE
> identical(xor(a, b), my.xor(a, b))   
[1] FALSE

СТРУКТУРА / РАЗМЕРНОСТЬ

Логические функции сохраняют структуру и атрибуты, что является дорогостоящим, но имеет ценность.

T <- TRUE; F <- FALSE
A <- matrix(c(T, F, T, F), ncol=2)
B <- matrix(c(T, F, F, T), ncol=2)

> A & B
      [,1]  [,2]
[1,]  TRUE FALSE
[2,] FALSE FALSE

> my.and(A, B)
[1]  TRUE FALSE FALSE FALSE

Обработка NA

Также, как указано в комментариях, NA также необходимо учитывать - то есть, больше накладных расходов.

a <- c(T, F, NA, T)
b <- c(F, NA, T, T)
>     identical(!a, my.not(a))    
[1] TRUE
>     identical(a & b, my.and(a, b))       
[1] FALSE
>     identical(a | b, my.or(a, b))        
[1] FALSE
>     identical(xor(a, b), my.xor(a, b))   
[1] TRUE

АТРИБУТЫ

a <- c(T, F, NA, T)
b <- c(F, NA, T, T)

names(a) <- names(b) <- LETTERS[23:26]

> a & b
    W     X     Y     Z 
FALSE FALSE    NA  TRUE 

> my.and(a, b)
[1] FALSE    NA    NA  TRUE
<час>

Не скорость

Конечно, с учетом всего вышесказанного, ваши функции предлагают невероятное увеличение! Если вы знаете, что вам не нужно беспокоиться о NA и подобных вещах, и вы не заботитесь о структуре, то почему бы просто не использовать их!

5
задан Haentz 7 June 2009 в 14:31
поделиться

3 ответа

Я не могу понять, почему вы не можете скопировать слой. Действительно, слой является «неотъемлемой частью» UIView. Но в конце концов, это просто еще один объект с несколькими свойствами.

На самом деле существует метод для CALayer, который называется:

- (id)initWithLayer:(id)layer

Но он не предназначен для создания копии слоя. (Вы можете прочитать документацию Apple, чтобы объяснить, почему)

CALayer не соответствует NSCopying, поэтому у вас есть два варианта:

  1. Подклассифицировать его и реализовать "copyWithZone:" (и соответствовать NSCopying)
  2. Напишите метод / функцию, которая будет вернуть «копию» CALayer

Независимо от того, какой способ вы выберете, вам нужно задать следующий вопрос: какие свойства CALlayer вы хотите скопировать?

Допустим, вы хотите скопировать только содержимое и frame:

CALayer copyLayer = [CALayer layer];

copyLayer.contents = theLayerToBeCopied.contents;
copyLayer.frame = theLayerToBeCopied.frame;

return copyLayer;

Вы можете просмотреть и скопировать все свойства слоя или просто скопировать те, которые вам нужны. Может быть хорошим способом поместить в категорию CALayer.

4
ответ дан 14 December 2019 в 19:23
поделиться

Это невозможно: уровень является свойством UIView. Следовательно, когда вы отпускаете UIView, его слой исчезает. Ваше представление о слое как о холсте не ошибочно. Но этот слой является неотъемлемой частью его UIView.

1
ответ дан 14 December 2019 в 19:23
поделиться

UILabel на самом деле не очень сложный элемент управления. Я предлагаю вам отказаться от этой линии атаки и научиться рисовать то, что вы хотите, используя Quartz, в новом CGImage. Затем вы можете назначить это свойству содержимого CALayer, не беспокоясь обо всем этом.

0
ответ дан 14 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

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