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 или я что-то упускаю?

  • Изменения цвета клавиатуры iOS - keyboardAppearance темный цвет не прилипает
  • UIButton в Swift 2.2. Как добавить другую цель?
  • Как правильно использовать селектор в swift 4
  • Анимация UIView, пытающаяся изменить размер кадра, не работает в iOS 8, но в iOS 7
  • Маска слоя UIView анимирует рамку настройки
  • Как сделать просмотр изображений быстрее?
  • Переходы анимации блока UIView с анимированным контентом при показе / скрытии клавиатуры
  • Анимация высоты UIView снизу вверх
  • 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 

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

    Interesting Posts

    Добавление визуального эффекта в SKSpriteNode при нажатии

    публикация на моей стене facebook с использованием нового sdk

    использование startMonitoringVisits для мониторинга региона

    Создайте несколько MKOverlays из полилинии из местоположений, поступающих через веб-сервис

    SpriteKit: как плавно анимировать SKCameraNode при отслеживании узла, но только после того, как узел перемещает Y пикселей?

    В чем смысл сообщения «no index path for table cell is reused» в iOS 6/7?

    устаревшие предупреждения в xcode и способы устранения устаревания

    Изображение запуска iOS не будет отображаться на iPhone или симуляторе, работает на iPad

    Как использовать AVCapturePhotoOutput

    черный экран / никаких событий в iOS OpenGL ES 2

    CTCallCenter callEventHandler никогда не называется

    Нормально ли, что lazy var свойство инициализируется дважды?

    Индивидуальный жест iOS + боковая панель

    Xcode 4.6 строит, запускает и заканчивает сразу (симулятор iOS 6.1)

    stringstream sgetn возвращает NULL на iOS 5.1

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