2015-11-02 6 views
4

У меня есть мои представления, показывающие в построителе интерфейса с моим набором свойств IB_DESIGNABLE, однако, когда я использую функцию предварительного просмотра, чтобы увидеть, как мои взгляды выглядят на разных устройствах, я просто получаю супер-представление, например. UIView.IB_DESIGNABLE, с просмотром просмотров в предварительном просмотре?

Не IB_DESIGNABLE просмотров в превью?

EDIT Как запрошенный код + скриншот:

H 
= 
#import <UIKit/UIKit.h> 
IB_DESIGNABLE 
@interface TitleBannerView : UILabel 
@property (nonatomic) IBInspectable CGFloat borderWidth; 
@property (nonatomic) IBInspectable CGFloat cornerRadius; 
@property (nonatomic) IBInspectable CGFloat shadowHeight; 
@end 

M 
= 
@implementation TitleBannerView 
@synthesize borderWidth; 
@synthesize cornerRadius; 
@synthesize shadowHeight; 

- (void)drawRect:(CGRect)rect { 

    if (self.borderWidth == 0) self.borderWidth = 8.5; 
    if (self.cornerRadius == 0) self.cornerRadius = 33; 
    if (self.shadowHeight == 0) self.shadowHeight = 15.1; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    //// Color Declarations 
    UIColor* bG = [UIColor colorWithRed: 0.18 green: 0.8 blue: 0.443 
     alpha: 1]; 
    UIColor* borderColor = [UIColor colorWithRed: 0.557 green: 0.267 blue: 0.678 
     alpha: 1]; 
    UIColor* shadowColor2 = [UIColor colorWithRed: 0.976 green: 0.859 blue: 0.718 
     alpha: 1]; 

    //// Shadow Declarations 
    UIColor* shadow = shadowColor2; 
    CGSize shadowOffset = CGSizeMake(-4.1, self.shadowHeight); 
    CGFloat shadowBlurRadius = 1.5; 

//

//// Frames 
    CGRect frame = self.bounds; 

    //// Subframes 
    CGRect group = CGRectMake(CGRectGetMinX(frame) + 15, 
     CGRectGetMinY(frame) + 15, CGRectGetWidth(frame) - 28, 
     CGRectGetHeight(frame) - 40); 


    //// Abstracted Attributes 
    CGFloat roundedRectangleStrokeWidth = self.borderWidth ; 
    CGFloat roundedRectangleCornerRadius = self.cornerRadius; 

    //// Group 
    { 
     //// Rounded Rectangle Drawing 
     UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect: 
      CGRectMake(CGRectGetMinX(group) + floor(CGRectGetWidth(group) * 0.00060) + 0.5, 
      CGRectGetMinY(group) + floor(CGRectGetHeight(group) * 0.00568) + 0.5, 
      floor(CGRectGetWidth(group) * 0.99940) - floor(CGRectGetWidth(group) * 0.00060), 
     floor(CGRectGetHeight(group) * 0.99432) - floor(CGRectGetHeight(group) * 0.00568)) 
     cornerRadius: roundedRectangleCornerRadius]; 
     CGContextSaveGState(context); 
     CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, 
      shadow.CGColor); 
     [bG setFill]; 
     [roundedRectanglePath fill]; 
     CGContextRestoreGState(context); 

     [borderColor setStroke]; 
     roundedRectanglePath.lineWidth = roundedRectangleStrokeWidth; 
     [roundedRectanglePath stroke]; 

    } 
} 
@end 

TitleBannerView это вид в зеленом цвете с пурпурной каймой. enter image description here

+0

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

+0

Нет. Я не вижу чертежи, которые я создаю в чертеже на предварительном просмотре. – Jules

+0

Работает ли он на симуляторе? – wj2061

ответ

0

Есть ли у вас некоторые данные для отображения в интерфейсе?

При использовании @IBDesignable Ваш Инициализаторы, макет и методы рисования будут использоваться, чтобы сделать ваше пользовательское представление прямо на холсте

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

  • prepareForInterfaceBuilder(): Этот метод компилирует с остальной частью коды, но выполняется только тогда, когда ваше мнение подготавливаются для отображения в Interface Builder.
  • TARGET_INTERFACE_BUILDER: #if TARGET_INTERFACE_BUILDER макрос препроцессора будет работать в любом Objective-C или Swift условно компилировать правильный код для ситуации

Вы можете посмотреть на этом tutorial и пример

+0

В моем методе drawrect я проверяю нулевые значения и назначаю некоторые значения по умолчанию – Jules

+0

@Istvsn, что должно быть хорошо, не так ли? – Jules

+0

Какие значения? Вы также настроили несколько цветов? Что вы хотите увидеть на холсте? Поместите некоторый код PLS – Istvan

3

Первый , IBDesignable может быть виден в предварительном просмотре.

Вы объявляете свой класс IBDesignable в рамках? IBInspectable ONLY поддерживает предварительный просмотр, когда он объявлен в рамках.

Кроме того, имейте в виду (не в вашем случае):

  1. Ваш код Жеребьевка должна быть достаточно быстро, у вас есть только 100мс рисовать время для пункта.

  2. Метод подготовкиForInterfaceBuilder() часто необходим.

+0

В настоящее время у меня нет классов рисования в каркасе Я попробую это и отправлю обратно – Jules

+0

Если вы действительно нет, это должна быть самая вероятная причина. Удачи. – MatthewLuiHK

+0

Просто протестировал его, и он действительно делает. Как я пропустил это? Как вы это узнали? :) –

0

IBDesignable работает только в Interface Builder, но не в предварительном просмотре :-( Я надеюсь, что Apple, это исправить в новом Xcode ...

+0

У вас есть источник? – Jules

+0

Hum, все мои пользовательские элементы управления отображаются правильно в Interface Builder, но не в Preview –

+0

Возможно, ответ от @MatthewLuiHK работает, я еще не проверял –

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