自定义UILabel未显示文本

时间:2016-09-26 13:44:19

标签: ios objective-c iphone uilabel

我创建了UILabel子类,它是IB_DESIGNABLE并且具有很少的IBInspectable属性。

我可以在所有iPhone模拟器和界面构建器中看到属性文本。

我可以看到运行iOS 9.3的iPhone 5c中的文字。

但也没有为同样运行iOS 9.3的iPhone 6系列设备显示文字。

要调试我将背景颜色设置为自定义标签,我可以看到标签框用给定的颜色填充但不显示文字。

我甚至尝试评论 applyStlyeOnText:方法,但即便如此,iPhone 6上也没有显示任何文字。

我使用自定义字体,正确添加字体文件。

更新:刚刚更新到Xcode 8.0,在iOS 10模拟器上,MyLabel什么也没显示。

以下是实施:

标题文件:

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface MyLabel : UILabel

@property (nonatomic) IBInspectable CGFloat letterSpacing;
@property (nonatomic) IBInspectable CGFloat lineSpacing;

@end

实施档案:

#import "MyLabel.h"

@implementation MyLabel

-(void)setLetterSpacing:(CGFloat)letterSpacing
{
    if (_letterSpacing != letterSpacing) {

        _letterSpacing = letterSpacing;

        [self applyStlyeOnText:self.text];
    }
}

-(void)setLineSpacing:(CGFloat)lineSpacing
{
    if (_lineSpacing != lineSpacing) {
        _lineSpacing = lineSpacing;
        [self applyStlyeOnText:self.text];
    }
}

-(void)applyStlyeOnText:(NSString *)text
{
    if (text.length){

        NSMutableDictionary * attributes = [NSMutableDictionary new];
        if (self.lineSpacing > 0)
        {
            NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
            paragraphStyle.paragraphSpacing = self.lineSpacing;
            paragraphStyle.lineBreakMode = self.lineBreakMode;
            paragraphStyle.alignment = self.textAlignment;
            [attributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName];
        }

        if (self.letterSpacing > 0) {

            [attributes setObject:[NSNumber numberWithFloat:self.letterSpacing] forKey:NSKernAttributeName];
        }

        [attributes setObject:self.font forKey:NSFontAttributeName];
        [attributes setObject:self.textColor forKey:NSForegroundColorAttributeName];
        [attributes setObject:[UIColor greenColor] forKey:NSBackgroundColorAttributeName];

        self.attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes];

        NSLog(@"MyLabel - Stlye applied on text : %@", text);
        NSLog(@"Thread : %@", [NSThread currentThread]);
        [self setBackgroundColor:[UIColor yellowColor]];
    }
    else
    {
        //no text recived to apply style on.
        self.attributedText = nil;
        NSLog(@"MyLabel - Stlye applied on text : empty string received");
    }
}

-(void)setText:(NSString *)text
{
    [super setText:text];

    NSLog(@"MyLabel - set text called with text : %@", text);
    NSLog(@"Thread : %@", [NSThread currentThread]);


    if (self.lineSpacing > 0 || self.letterSpacing > 0)
    {
        [self applyStlyeOnText:text];
    }
}
}

1 个答案:

答案 0 :(得分:1)

要进行调试,我创建了一个新的单一视图应用程序,并将MyLabel.h和MyLabel.m文件添加到项目中。

我使用的是Xcode 8和iPhone 5S模拟器。

但结果是相同的,MyLabel没有显示任何文字。

感到沮丧,删除了 MyLabel.h MyLabel.m 中的所有代码,但 MyLabel.h 中的属性除外,整体课程看起来像下面:

标题文件:

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface MyLabel : UILabel

@property (nonatomic) IBInspectable CGFloat letterSpacing;
@property (nonatomic) IBInspectable CGFloat lineSpacing;

@end

实施档案:

#import "MyLabel.h"

@implementation MyLabel

@end

即使使用上述代码,MyLabel也未显示任何文字。

现在我决定重命名以下属性:

@property (nonatomic) IBInspectable CGFloat ltrSpacing;
@property (nonatomic) IBInspectable CGFloat lnSpacing;

令人惊讶MyLabel开始显示文字,很奇怪。

然后我重新介绍了我的逻辑,一切正常。

我认为我选择的属性名称与UILabel的某些私有属性存在冲突,但我不确定其确切原因。