Вместо того, чтобы просто раздавать ответ, позвольте мне объяснить, что делает ваш текущий код и как его модифицировать, чтобы захватить весь экран.
UIGraphicsBeginImageContext(view.frame.size)
Эта строка кода создает новый контекст изображения с тем же размером, что и view
. Главное, чтобы убрать здесь, это то, что новый контекст изображения имеет тот же размер, что и view
. Если вы не хотите захватить версию приложения с низким разрешением (без сетчатки), скорее всего, вы должны использовать UIGraphicsBeginImageContextWithOptions
. Затем вы можете передать 0.0
, чтобы получить тот же масштабный коэффициент, что и основной экран устройства.
view.layer.renderInContext(UIGraphicsGetCurrentContext())
Эта строка кода отобразит слой представления в текущий графический контекст (который является только что созданным вами контекстом). Главное, чтобы отвлечься здесь, состоит в том, что в контекст изображения втягиваются только view
(и его подвид).
let image = UIGraphicsGetImageFromCurrentImageContext()
Эта строка кода создает объект UIImage из того, что было втянуто в графический контекст.
UIGraphicsEndImageContext()
Эта строка кода завершает контекст изображения. Он очищается (вы создали контекст и также должны удалить его.
В результате получается изображение с таким же размером, как view
, с view
и его вложенными в него подзонами .
Если вы хотите нарисовать все в изображении, тогда вы должны создать изображение, которое является размером экрана, и нарисовать на нем все, что на экране. На практике вы, вероятно, просто говорите о все в «ключевом окне» вашего приложения. Поскольку UIWindow
является подклассом UIView
, его можно также вставить в контекст изображения.
статья From MS Docs о IEquatable<T>
:
, Если Вы реализуете
IEquatable<T>
, необходимо также переопределить реализации базового классаEquals(Object)
иGetHashCode()
так, чтобы их поведение согласовывалось со чтоEquals(T)
метод. Если Вы действительно переопределяетеEquals(Object)
, Вашу переопределенную реализацию также называют в вызовах к помехамEquals(Object, Object)
метод на Вашем классе. Кроме того, необходимо перегрузитьсяop_Equality
иop_Inequality
операторы. Это гарантирует, чтобы все тесты для равенства возвратили последовательные результаты.
нет, операторы не используют, Равняется методу . Они должны быть перегружены отдельно , чтобы сделать так.
1) Как Ray сказал, переопределите Equals(object)
для обеспечения непротиворечивости, когда метод называют от классов, которые не знают (статически), что Вы реализуете IEquatable<T>
. Например, классы неуниверсальных наборов будут использовать Equals(object)
для сравнений. Необходимо также переопределить GetHashCode()
.
2) Реализация IEquatable<T>
не перегружается == и! = операторы автоматически, но нет ничего, чтобы мешать Вам делать так, точно так же, как System.String
делает. Необходимо зарегистрировать это очень ясно, если Вы делаете, однако - и быть осторожными при создании сравнений между другими типами ссылки (например, MyType и Объект), который будет все еще использовать сравнение идентификационных данных. Я подозреваю, что это не прекрасная идея сделать это, если это не будет очень в большой степени используемым типом в Вашем коде, где все станут очень знакомыми с ним и , где синтаксический сахар перегрузки == действительно окажет положительное влияние на удобочитаемость.