2015-02-04 3 views
-1

У меня есть следующий код и объявлен IBDesignable.Swift UIButton Подкласс не отображается на устройстве или симуляторе

DrawRect отлично показан в Interface Builder, но совсем не в Simulator или на устройстве.

Есть ли у кого-нибудь идеи, почему?

import UIKit 
import QuartzCore 

@IBDesignable class VideoButton: UIButton { 
    // Only override drawRect: if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func drawRect(rect: CGRect) 
    { 

     let color2 = UIColor(red: 0.500, green: 0.500, blue: 0.500, alpha: 0.000) 

     //// Oval Drawing 
     var ovalPath = UIBezierPath(ovalInRect: CGRectMake(frame.minX + floor(frame.width * 0.03571) + 0.5, frame.minY + floor(frame.height * 0.03571) + 0.5, floor(frame.width * 0.96429) - floor(frame.width * 0.03571), floor(frame.height * 0.96429) - floor(frame.height * 0.03571))) 
     color2.setFill() 
     ovalPath.fill() 
     UIColor.whiteColor().setStroke() 
     ovalPath.lineWidth = 3 
     ovalPath.stroke() 


     //// Rectangle Drawing 
     let rectanglePath = UIBezierPath(roundedRect: CGRectMake(frame.minX + floor(frame.width * 0.25714 + 0.5), frame.minY + floor(frame.height * 0.34286 + 0.5), floor(frame.width * 0.60000 + 0.5) - floor(frame.width * 0.25714 + 0.5), floor(frame.height * 0.64286 + 0.5) - floor(frame.height * 0.34286 + 0.5)), cornerRadius: 2) 
     color2.setFill() 
     rectanglePath.fill() 
     UIColor.whiteColor().setStroke() 
     rectanglePath.lineWidth = 3 
     rectanglePath.stroke() 


     //// Bezier Drawing 
     var bezierPath = UIBezierPath() 
     bezierPath.moveToPoint(CGPointMake(frame.minX + 0.61429 * frame.width, frame.minY + 0.50536 * frame.height)) 
     bezierPath.addLineToPoint(CGPointMake(frame.minX + 0.75714 * frame.width, frame.minY + 0.34286 * frame.height)) 
     bezierPath.addLineToPoint(CGPointMake(frame.minX + 0.75714 * frame.width, frame.minY + 0.64286 * frame.height)) 
     bezierPath.addLineToPoint(CGPointMake(frame.minX + 0.61429 * frame.width, frame.minY + 0.50536 * frame.height)) 
     bezierPath.closePath() 
     bezierPath.lineJoinStyle = kCGLineJoinRound; 

     color2.setFill() 
     bezierPath.fill() 
     UIColor.whiteColor().setStroke() 
     bezierPath.lineWidth = 3 
     bezierPath.stroke() 
     // } 

    } 

} 

ответ

0

Вы не должны быть переопределение drawRect: для подкласса UIButton. Нет нужды; вы можете настроить внешний вид UIButton, используя его различные свойства и методы. Далеко не понятно, почему вы это делаете. (Тот факт, что вы являются делать это, и не вызывая super, вероятно, объясняет проблему,., Но решение не вызовите super, а не делать это в первую очередь)

+1

Почему бы не переопределить рисовать прямоугольник, конечно, это лучше, добавив другое представление к самой кнопке? –

+0

Зачем вам нужно добавить другое представление к самой кнопке? Что вы на самом деле пытаетесь сделать? – matt

+0

@matt Мне интересно то же самое, почему бы вам не захотеть переопределить 'drawRect'.Для моего использования я делаю радиальные кнопки. Целый круг при выборе, а затем просто контур круга, если он не выбран. Я бы подумал, что это идеально подходит для переопределения 'drawRect'. – random

2

Изменение ссылки на 'frame' на 'rect', и он должен рисовать в устройстве и симуляторе.

0

Недавно я пытался сделать подобную вещь - создайте подкласс UIButton, переопределив drawRect(), чтобы нарисовать простой пользовательский значок (я делаю кнопку воспроизведения/остановки, которая чередуется между «Воспроизвести» и «Стоп», на каждом кране):

Play Button

Stop Button

Может быть, я не знаю достаточно о развитии IOS еще, но в ответ на другие ответы и older posts в Интернете, которые препятствуют расширению UIButton класса, я не» t под почему это будет плохой идеей. Конечно, вы можете настроить кнопку, установив пользовательские фоновые изображения, но, на мой взгляд, это не так гибко, как переопределение drawRect (не говоря уже о том, что может быть больно редактировать вашу кнопку в любое время, когда вы хотите что-то изменить, потому что вам нужно редактировать фактическое изображение вместо нескольких строк кода).

Я уверен, что есть другие способы достижения такого же результата (например, реализовать кнопку с помощью настраиваемого UIView при прослушивании событий касания), но я думаю, что самый чистый и простой способ - это просто расширить класс UIButton , В конце концов, это subclass itself of UIView.

Что касается вашего кода - это, кажется, правильно работать в моем окружении, хотя мне пришлось немного изменить цвета, чтобы получить его, чтобы показать на белом фоне (т.е. UIColor.blackColor().setStroke() вместо UIColor.whiteColor().setStroke()). Кроме того, как уже упоминалось @Astrodan, это может быть хорошей идеей использовать rect вместо frame, так как она передается вам (хотя код работал с frame для меня):

Live-оказанные раскадровки в XCode:

Storyboard in XCode

На iPhone 6 Simulator:

enter image description here

Смежные вопросы