NSTextView двойное зрение

Должно быть, я делаю что-то не так: textview с двойным зрением

Мое приложение Cocoa имеет прокрутку вокруг пользовательского представления, которое, в свою очередь, имеет текстовое представление. Я ожидаю увидеть только одну строку "Это ", но есть еще одна в углу. Я сократил код до чего-то очень минимального и до сих пор не понимаю, в чем моя ошибка, поэтому здесь я ищу подсказку.

Далее следует контроллер представления для пользовательского представления, но для простоты приведена ссылка на проект< /а>.

#import "TTTSimpleCtrlView.h"

@interface TTTSimpleCtrlView ()

@property (strong,nonatomic) NSTextView *tv1;
@property (strong,nonatomic) NSTextStorage *ts;

@end

@implementation TTTSimpleCtrlView

- (void) awakeFromNib {
    NSFont *font = [NSFont fontWithName:@"Courier New Bold" size:20.0f];
    NSMutableParagraphStyle *styleModel = [[NSParagraphStyle  defaultParagraphStyle] mutableCopy];
    [styleModel setLineHeightMultiple:1.0];
    //    [styleModel setLineSpacing:fontRect.size.height * 2];
    NSDictionary *textAttrs = [NSDictionary dictionaryWithObjectsAndKeys: font, NSFontAttributeName,
                                     [NSColor blackColor] ,NSForegroundColorAttributeName,
                                     [NSColor whiteColor], NSBackgroundColorAttributeName,
                                     styleModel, NSParagraphStyleAttributeName,
                                     nil];
    NSString *pilcrowStr = @"This is a test.";
    NSAttributedString *s = [[NSAttributedString alloc] initWithString:pilcrowStr attributes:textAttrs];
    NSRect rect = [s boundingRectWithSize:NSMakeSize(INFINITY,INFINITY)options:0];
    NSLayoutManager *lm = [[NSLayoutManager alloc] init];
    NSTextContainer *tc = [NSTextContainer new];

    [tc setContainerSize:s.size];
    [lm addTextContainer:tc];

    _ts = [[NSTextStorage alloc] init];
    [_ts setAttributedString:s];

    [_ts addLayoutManager:lm];
    [lm replaceTextStorage:_ts];

    rect.origin.x = 10;
    rect.origin.y = rect.size.height;
    NSTextView *v = [[NSTextView alloc] initWithFrame:rect textContainer:tc];
    [v setDrawsBackground:YES];
    [self addSubview:v];
}

- (BOOL) isFlipped {
    return YES;
}

- (void)drawRect:(NSRect)rect
{
    NSLog(@"drawRect & %lu subviews",self.subviews.count);
    for (NSTextView *v in self.subviews) {
        if(CGRectIntersectsRect(v.frame, rect) || CGRectContainsRect(rect, v.frame)) {
            [v drawRect:rect];
            NSLog(@"frame = %@",NSStringFromRect(v.frame));
        }
    }
    [super drawRect:rect];
}

person zer0gravitas    schedule 13.03.2013    source источник
comment
Итак, мне удалось обойти эту проблему с совершенно другим подходом. И в качестве дополнительного бонуса этот пост принес мне значок «перекати-поле». Серьезно, хотя я бы хотел, чтобы кто-нибудь пожалел....   -  person zer0gravitas    schedule 20.03.2013


Ответы (1)


Ты звонишь:

[super drawRect:rect];

и вы сами рисуете текст в своей функции рисования. По сути, вы рисуете текст, и какао также рисует текст за вас. Так что не называйте супер.

person user965972    schedule 13.02.2014