为什么我的属性字符串显示奇怪?

时间:2013-07-30 04:36:10

标签: iphone ios objective-c uibutton nsattributedstring

我一直在关注CS193P Stanford iOS开发讲座,在第二项任务“Set”中,我无法弄清楚我的程序在按钮上显示属性字符串有什么问题。出于某种原因,当我的字符串试图显示3个字符时,它最终显示为1个大字符和3个随机的其他字符。当我只想要红色,绿色和蓝色字符时,许多字符显示为黑色。如果有人能够建立这个项目并帮助我弄清楚发生了什么,我将不胜感激。我花了大约4个小时试图调试这个。来源是 https://github.com/zhumatthew/MatchSet

问题出在标签栏中第二个标签的设置视图控制器下。

感谢。

http://postimg.org/image/gs7qley3r/

#import "SetViewController.h"
#import "SetCardDeck.h"
#import "SetCard.h"

@interface SetViewController ()

@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;

@end

@implementation SetViewController

@synthesize deck = _deck;

- (Deck *)deck {
    if (!_deck) _deck = [[SetCardDeck alloc] init];
    return _deck;
}

- (void)updateUI {
    [super updateUI];
    for (UIButton *cardButton in self.cardButtons) {
        UIColor *foregroundColor;
        UIColor *strokeColor;

        SetCard *card = (SetCard *)[self.game cardAtIndex:[self.cardButtons indexOfObject:cardButton]];
        NSString *string = [[NSString alloc] init];
        for (int i = 0; i < card.number; i++) {
            string = [NSString stringWithFormat:@"%@%@", string, card.symbol];
        }
        if ([card.color isEqualToString:@"R"]) {
            foregroundColor = [UIColor redColor];
        } else if ([card.color isEqualToString:@"G"]) {
            foregroundColor = [UIColor greenColor];
        } else if ([card.color isEqualToString:@"B"]) {
            foregroundColor = [UIColor blueColor];
        }

        strokeColor = [foregroundColor copy];

        if ([card.shading isEqualToString:@"S"]) {
            foregroundColor = [foregroundColor colorWithAlphaComponent:1];
        } else if ([card.shading isEqualToString:@"H"]) {
            foregroundColor = [foregroundColor colorWithAlphaComponent:0.3];
        } else if ([card.shading isEqualToString:@"O"]) {
            foregroundColor = [foregroundColor colorWithAlphaComponent:0];
        }
        NSAttributedString *mat = [[NSAttributedString alloc] initWithString:string attributes:@{NSForegroundColorAttributeName:foregroundColor,NSStrokeWidthAttributeName:@-5,NSStrokeColorAttributeName:strokeColor}];
        [cardButton setAttributedTitle:mat forState:UIControlStateNormal];
        CGFloat red;
        CGFloat green;
        CGFloat blue;
        CGFloat alpha;
        [foregroundColor getRed:&red green:&green blue:&blue alpha:&alpha];
        NSLog(@"red:%f green:%f blue:%f alpha:%f index:%d",red,green,blue,alpha,[self.cardButtons indexOfObject:cardButton]);
        [strokeColor getRed:&red green:&green blue:&blue alpha:&alpha];
        NSLog(@"red:%f green:%f blue:%f alpha:%f ",red,green,blue,alpha);
        NSLog(@"%@",[mat string]);
        cardButton.selected = card.isFaceUp;
        cardButton.enabled = !card.isUnplayable;

        if (card.isFaceUp) {
            [cardButton setBackgroundColor:[UIColor lightGrayColor]];
        } else {
            [cardButton setBackgroundColor:[UIColor whiteColor]];
        }
    }
}

@end

1 个答案:

答案 0 :(得分:1)

据我所见,有两个不同的问题:

  • 按钮标签是截断,因此您所看到的“3个随机其他字符”是省略号(...)。您必须放大按钮或使用较小的字体大小。也许还将按钮的“换行”模式设置为“Clip”而不是“Truncate ...”。
  • 在iOS 6上,某些字符(例如“◼”符号)显示为“Apple Color Emoji”。 这是一个(有争议的讨论)“特征”,参见例如https://devforums.apple.com/message/487463#487463(需要Apple Developer登录)。 因此,颜色等属性将被忽略。

    可以通过附加来抑制表情符号替换(来自UILabel, UIFont and UTF-8 Triangle) Unicode“变体选择器”U + FE0E:

    + (NSArray *)validSymbols {
        return @[@"◼\uFE0E",@"●",@"▲"];
    }
    

    通过此更改,您的所有符号都会按预期正确显示。