Понимание IEquatable

Вместо того, чтобы просто раздавать ответ, позвольте мне объяснить, что делает ваш текущий код и как его модифицировать, чтобы захватить весь экран.

UIGraphicsBeginImageContext(view.frame.size)

Эта строка кода создает новый контекст изображения с тем же размером, что и view. Главное, чтобы убрать здесь, это то, что новый контекст изображения имеет тот же размер, что и view . Если вы не хотите захватить версию приложения с низким разрешением (без сетчатки), скорее всего, вы должны использовать UIGraphicsBeginImageContextWithOptions. Затем вы можете передать 0.0, чтобы получить тот же масштабный коэффициент, что и основной экран устройства.

view.layer.renderInContext(UIGraphicsGetCurrentContext())

Эта строка кода отобразит слой представления в текущий графический контекст (который является только что созданным вами контекстом). Главное, чтобы отвлечься здесь, состоит в том, что в контекст изображения втягиваются только view (и его подвид).

let image = UIGraphicsGetImageFromCurrentImageContext()

Эта строка кода создает объект UIImage из того, что было втянуто в графический контекст.

UIGraphicsEndImageContext()

Эта строка кода завершает контекст изображения. Он очищается (вы создали контекст и также должны удалить его.


В результате получается изображение с таким же размером, как view, с view и его вложенными в него подзонами .

Если вы хотите нарисовать все в изображении, тогда вы должны создать изображение, которое является размером экрана, и нарисовать на нем все, что на экране. На практике вы, вероятно, просто говорите о все в «ключевом окне» вашего приложения. Поскольку UIWindow является подклассом UIView, его можно также вставить в контекст изображения.

52
задан Palec 16 September 2018 в 03:06
поделиться

2 ответа

  1. статья From MS Docs о IEquatable<T> :

    , Если Вы реализуете IEquatable<T>, необходимо также переопределить реализации базового класса Equals(Object) и GetHashCode() так, чтобы их поведение согласовывалось со что Equals(T) метод. Если Вы действительно переопределяете Equals(Object), Вашу переопределенную реализацию также называют в вызовах к помехам Equals(Object, Object) метод на Вашем классе. Кроме того, необходимо перегрузиться op_Equality и op_Inequality операторы. Это гарантирует, чтобы все тесты для равенства возвратили последовательные результаты.

  2. нет, операторы не используют, Равняется методу . Они должны быть перегружены отдельно , чтобы сделать так.

52
ответ дан Palec 7 November 2019 в 09:22
поделиться

1) Как Ray сказал, переопределите Equals(object) для обеспечения непротиворечивости, когда метод называют от классов, которые не знают (статически), что Вы реализуете IEquatable<T>. Например, классы неуниверсальных наборов будут использовать Equals(object) для сравнений. Необходимо также переопределить GetHashCode().

2) Реализация IEquatable<T> не перегружается == и! = операторы автоматически, но нет ничего, чтобы мешать Вам делать так, точно так же, как System.String делает. Необходимо зарегистрировать это очень ясно, если Вы делаете, однако - и быть осторожными при создании сравнений между другими типами ссылки (например, MyType и Объект), который будет все еще использовать сравнение идентификационных данных. Я подозреваю, что это не прекрасная идея сделать это, если это не будет очень в большой степени используемым типом в Вашем коде, где все станут очень знакомыми с ним и , где синтаксический сахар перегрузки == действительно окажет положительное влияние на удобочитаемость.

43
ответ дан Jon Skeet 7 November 2019 в 09:22
поделиться
Другие вопросы по тегам:

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