UIView overriding drawRect заставляет просмотр не подчиняться маскамToBounds

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

  sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0]; [self addSubview:sub]; [sub setUserInteractionEnabled:YES]; [self setUserInteractionEnabled:YES]; CALayer *layer = sub.layer; layer.masksToBounds = YES; layer.borderWidth = 5.0; layer.borderColor = [UIColor whiteColor].CGColor; layer.cornerRadius = 30.0; 

Это отлично работает и помещает хорошую границу с радиусом границы вокруг моего вида (не обращайте внимания на диагональные / прямые белые линии сзади, они не имеют никакого отношения к этому виду):

исправить

Однако, когда я пытаюсь переопределить метод drawRect: на мой взгляд, я вижу черный фон, не маскирующий границы. Я ничего не делаю (в настоящее время), вот мой код:

 -(void)drawRect:(CGRect)rect{ [super drawRect:rect]; } 

И вот результат:

неправильный

Я ничего не изменил, кроме метода рисования. Как я могу переопределить метод draw, сохраняя при этом, что мой взгляд подчиняется маске углового радиуса? Это ошибка в iOS или я что-то упускаю?

4 Solutions collect form web for “UIView overriding drawRect заставляет просмотр не подчиняться маскамToBounds”

Я не знаю полного ответа, но я знаю, что реализация drawLayer:inContext: работает по-разному в зависимости от того, была ли реализована программа drawRect: или нет. Возможно, маскировка / отсечение до границ – одна из тех вещей, которые она делает по-другому.

Вы можете решить свою проблему несколькими способами:

  • сделайте свой фон прозрачным:

      layer.backgroundColor = [UIColor clearColor].CGColor; 
  • закрепите себя внутри своего пользовательского drawRect: ::

     - (void)drawRect:(CGRect)rect { [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:30.0] addClip]; [image drawInRect:rect]; // or whatever } 
  • вырезать углы явно:

     CGContextBeginPath(c); CGContextAddArc(c, r, r, r, M_PI, 3*M_PI_2, 0); CGContextAddLineToPoint(c, 0, 0); CGContextClosePath(c); CGContextClip(c); [[UIColor grayColor] setFill]; UIRectFill(rect); 

Я украл эти последние 2 предложения из этой замечательной презентации от WWDC 2010: усовершенствованная оптимизация производительности на iPhone OS (видео, указанное на этой индексной странице – досадно, без прямой ссылки).

Это старый вопрос, но я недавно читал полезное сообщение в блоге под заголовком « Злоупотребление UIView» . В нем автор советует не переопределять drawRect чтобы делать такие вещи, как добавление границы, когда есть другие способы сделать это. Он говорит,

Переопределение drawRect: вызывает удар производительности. Я не профилировал его, поэтому я не знаю, является ли это значимой производительностью при обычных обстоятельствах (это, вероятно, нет), но в большинстве случаев люди, которые переопределяют drawRect: могут выполнить то, что они хотят намного проще, установив свойства в представлении слой. Если вам нужно нарисовать схему вокруг представления, вот как вы это сделаете:

 #import <QuartzCore/QuartzCore.h> - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.layer.borderWidth = 2.f; self.layer.borderColor = [UIColor redColor].CGColor; } return self; 

Я понимаю, что это, вероятно, не решает проблему чернового фона. Это просто что-то другое.

Вероятно, вы не должны звонить

 [super drawRect:rect] 

внутри вашего drawRect. Apple говорит, что:

Если вы подклассифицируете UIView напрямую, ваша реализация этого метода не требует вызова super. Однако, если вы подклассифицируете другой класс представления, вы должны назвать super в какой-то момент своей реализации.

Кажется, что вызов супер-метода вызывает странное поведение.

настройка

 opaque = false // NO for ObjC 

на взгляд решает проблему.

  • Создание всплывающего меню iPhone Подобно меню «Почтовое приложение»
  • Уведомление о раме UIView
  • Как мне (успешно) установить maskView в UIView?
  • Простой UIView drawRect не называется
  • Мониторинг событий перерисовки MKMapView
  • UIImageView тень и аспект-наполнение вместе
  • Можно ли создать UIView в фоновом потоке?
  • создайте много AVCaptureVideoPreviewLayer (IOS Camera) из той же AVCaptureSession и добавьте их на один и тот же уровень
  • Как настроить статический UITableView как подпункт UIView?
  • Как переопределить распознаватель жестов на UIButton, чтобы позволить событиям крана пузыриться для наблюдения?
  • создание пользовательской камеры с квадратным представлением на iOS
  • Interesting Posts

    «Приложение попыталось представить контроллеры Split View modally»

    Приложение отлично работает в iOS 8, но не в iOS 7

    Как получить тело push-уведомления, отправленного с консоли Firebase в iOS 10 и Swift 3?

    NSNumber numberWithFloat vs Init и alloc

    Отсутствует цель зависимости "CordovaLib (от CordovaLib.xcodeproj)"

    Внедрить подборщик документов в быстром (iOS)

    Предварительная загрузка следующей (в настоящее время невидимой) ячейки UICollectionView

    мутирующий метод, отправленный на неизменяемый объект – ошибка

    Невозможно вызвать значение нефункционного типа 'String'

    Поиск рекомендаций по геокодированию / картографии для разработки iPad

    Преобразование в Swift 3 ошибка: «Преобразовать в текущий синтаксис Swift не удалось Не удалось найти тестовый узел для …»

    Facebook Single Sign-on (SSO) прекратил авторизацию существующего приложения для iPhone

    Возможно ли повторить стандартную строку состояния iOS на внешнем дисплее?

    Следует ли прекратить загрузку UIView из xibs?

    RLMException после изменения ключа – уже открыт с другим ключом шифрования в корме

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.