| 

.NET C# Java Javascript Exception

1
Hallo,

ich möchte mit 3 Button's (wie bei einem Textverarbeitungsprogramm ) den Schrifttyp ändern können, wenn ich bei meine Code das mit demm Unterstrich weg lasse geht das aber wenn der Unterstich mit gecodet ist klapt das vorne und hinten nicht ... fürde mich über eine Code änderung freuen.. Hier mein Code

selitem ist ein NSTextField

- (void)fontType:(BOOL)bold UnderL:(BOOL)underL Italic:(BOOL)italic {

NSFontTraitMask traits;

if (bold == NO & underL == NO && italic == NO ) {
traits = NSUnboldFontMask | NSUnitalicFontMask;

NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:traits
weight:0
size:[schriftgross intValue]];

[selItem setFont:theFont];

NSMutableAttributedString * as = [[[selItem attributedStringValue] mutableCopy] autorelease];
NSString *tmp = [selItem stringValue];
NSRange sRange = [tmp rangeOfString:tmp];
[as beginEditing];
[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt:NSUnderlineStyleNone]
range:sRange];
[as endEditing];

[selItem setAttributedStringValue:as];

NSLog(@"%@",[selItem attributedStringValue]);


}

if (bold == YES & underL == YES && italic == YES ) {
traits = NSBoldFontMask | NSItalicFontMask;

NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:traits
weight:0
size:[schriftgross intValue]];

[selItem setFont:theFont];

NSMutableAttributedString * as = [[[selItem attributedStringValue] mutableCopy] autorelease];
NSString *tmp = [selItem stringValue];
NSRange sRange = [tmp rangeOfString:tmp];
[as beginEditing];
[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt:NSUnderlineStyleSingle]
range:sRange];
[as endEditing];
[selItem setAttributedStringValue:as];

NSLog(@"%@",[selItem attributedStringValue]);
}

if (bold == YES & underL == NO && italic == NO ) {
traits = NSBoldFontMask | NSUnitalicFontMask;

NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:traits
weight:0
size:[schriftgross intValue]];

[selItem setFont:theFont];

NSMutableAttributedString * as = [[[selItem attributedStringValue] mutableCopy] autorelease];
NSString *tmp = [selItem stringValue];
NSRange sRange = [tmp rangeOfString:tmp];
[as beginEditing];
[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt:NSUnderlineStyleNone]
range:sRange];
[as endEditing];

[selItem setAttributedStringValue:as];

NSLog(@"%@",[selItem attributedStringValue]);

}

if (bold == NO & underL == YES && italic == NO ) {

traits = NSUnboldFontMask | NSUnitalicFontMask;

NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:traits
weight:0
size:[schriftgross intValue]];

[selItem setFont:theFont];

NSMutableAttributedString * as = [[[selItem attributedStringValue] mutableCopy] autorelease];
NSString *tmp = [selItem stringValue];
NSRange sRange = [tmp rangeOfString:tmp];
[as beginEditing];
[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt:NSUnderlineStyleSingle]
range:sRange];
[as endEditing];
[selItem setAttributedStringValue:as];

NSLog(@"%@",[selItem attributedStringValue]);
}

if (bold == NO & underL == NO && italic == YES ) {
traits = NSUnboldFontMask | NSItalicFontMask;

NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:traits
weight:0
size:[schriftgross intValue]];

[selItem setFont:theFont];

NSMutableAttributedString * as = [[[selItem attributedStringValue] mutableCopy] autorelease];
NSString *tmp = [selItem stringValue];
NSRange sRange = [tmp rangeOfString:tmp];
[as beginEditing];
[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt:NSUnderlineStyleNone]
range:sRange];
[as endEditing];

[selItem setAttributedStringValue:as];

NSLog(@"%@",[selItem attributedStringValue]);

}

if (bold == YES & underL == YES && italic == NO ) {
traits = NSBoldFontMask | NSUnitalicFontMask;

NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:traits
weight:0
size:[schriftgross intValue]];

[selItem setFont:theFont];

NSMutableAttributedString * as = [[[selItem attributedStringValue] mutableCopy] autorelease];
NSString *tmp = [selItem stringValue];
NSRange sRange = [tmp rangeOfString:tmp];
[as beginEditing];
[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt:NSUnderlineStyleSingle]
range:sRange];
[as endEditing];
[selItem setAttributedStringValue:as];

NSLog(@"%@",[selItem attributedStringValue]);

}

if (bold == YES & underL == NO && italic == YES ) {
traits = NSBoldFontMask | NSItalicFontMask;

NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:traits
weight:0
size:[schriftgross intValue]];

[selItem setFont:theFont];

NSMutableAttributedString * as = [[[selItem attributedStringValue] mutableCopy] autorelease];
NSString *tmp = [selItem stringValue];
NSRange sRange = [tmp rangeOfString:tmp];
[as beginEditing];
[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt:NSUnderlineStyleNone]
range:sRange];
[as endEditing];

[selItem setAttributedStringValue:as];

NSLog(@"%@",[selItem attributedStringValue]);

}

if (bold == NO & underL == YES && italic == YES ) {
traits = NSUnboldFontMask | NSItalicFontMask;

NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:traits
weight:0
size:[schriftgross intValue]];

[selItem setFont:theFont];

NSMutableAttributedString * as = [[[selItem attributedStringValue] mutableCopy] autorelease];
NSString *tmp = [selItem stringValue];
NSRange sRange = [tmp rangeOfString:tmp];
[as beginEditing];
[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt:NSUnderlineStyleSingle]
range:sRange];
[as endEditing];
[selItem setAttributedStringValue:as];

NSLog(@"%@",[selItem attributedStringValue]);

}

}
30.08.2011
seven-ex 63 4
Da du überhaupt nicht auf die vorangegangene Antwort reagiert hast fehlt mir ein wenig die Motivation, das hier alles durchzuschauen...
puls200 31.08.2011
6 Antworten
3
Hallo seven-ex,

Du verwendest einen Attributed String - ergo musst Du dem Bereich in dem Du die Zeichenattribute verändern willst auch per [selItem setFont:theFont] den Font zuweisen. Das ist keine gute Idee und wird auch so nicht funktionieren!

Verwende statt dessen - genau so wie Du es auch bei der Zuweisung des Underline-Attributes getan hast - entsprechend ein:

[as addAttribute:NSFontAttributeName value:theFont range:sRange];

..und entferne das [selItem setFont:theFont]!

Ich füge Dir mal ein Codesnippet bei, das zeigt, wie das ganze funktioniert. Habe mir im Listing, unten auch erlaubt Deine Instanzmethode fontType etwas kürzer zu schreiben. ;)

Übrigens - unter http://tangerine-soft.de/developer_free/FontSelector.zip liegt ein Xcode Projekt, das das Ganze konkret umsetzt.

Happy Codin' - Peter -

- (void)fontType:(BOOL)bold UnderL:(BOOL)underL Italic:(BOOL)italic 
{
const int fontSize = [schriftgross intValue];
const NSFontTraitMask fontTraits = (bold ? NSBoldFontMask : NSUnboldFontMask) |
(italic ? NSItalicFontMask : NSUnitalicFontMask);

NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:fontTraits
weight:0
size:fontSize];
NSAssert(theFont, @"The selected font does not exists!");
if (theFont)
{
// [selItem setFont:theFont]; // !!! DON'T DO THAT -
// Use [as addAttribute:NSFontAttributeName value:theFont range:sRange] instead !!!

NSMutableAttributedString * as = [[[selItem attributedStringValue] mutableCopy] autorelease];
NSString *tmp = [selItem stringValue];
NSRange sRange = [tmp rangeOfString:tmp];
[as beginEditing];

[as addAttribute:NSFontAttributeName
value:theFont
range:sRange];

[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt: (underL ? NSUnderlineStyleSingle : NSUnderlineStyleNone)]
range:sRange];
[as endEditing];

[selItem setAttributedStringValue:as];

// NSLog(@"%@",[selItem attributedStringValue]);
}
}
25.09.2011
hdusel 195 4
1A klasse und auch kapiert ; )
seven-ex 25.09.2011
wenn ich das mache geht setAlignment: nicht mehr, wie muss ich es denn da dann machen ?
seven-ex 30.11.2011
Siehe meine Antwort, unten! ;)
hdusel 01.12.2011
2
Hi seven-ex,

Zu Deinem Kommentar
"wenn ich das mache geht setAlignment: nicht mehr"

Setze das Alignment vor [as endEditing] mit [as addAttribute:NSParagraphStyleAttributeName value:[NSMutableParagraphStyle ...]]

...
[as addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInt: (underL ? NSUnderlineStyleSingle : NSUnderlineStyleNone)]
range:sRange];
// ==========================================================
NSMutableParagraphStyle *ps = [[NSMutableParagraphStyle new] autorelease];
[ps setAlignment:NSLeftTextAlignment];

// Alternativ zu NSLeftTextAlignment: NSRightTextAlignment,
// NSCenterTextAlignment, NSJustifiedTextAlignment...
[as addAttribute:NSParagraphStyleAttributeName
value:ps
range:sRange];
// ==========================================================
[as endEditing];
...

Das o.g. Projekt mit dieser Erweiterung liegt unter http://tangerine-soft.de/developer_free/FontSelector_align.zip

Happy coding! - Peter -
01.12.2011
hdusel 195 4
0
Nach kurzer Recherche fand ich mehrere Postings in denen steht, dass unterstrichener Text in Controls gar nicht ohne weiteres möglich ist. Als Workaround wird entweder eine abgeleitete Klasse mit custom drawing (-drawRect(..) überschrieben) vorgeschlagen oder die Verwendung einer UIWebView mit entsprechenden <span> Attributen.
Gruß
Daniel
02.09.2011
puls200 3,8k 7
0
Danke für deine Antwort, mit ging es aber nicht um ios sondern um Mac (NSTextField).
Wenn ich denn Teil mit denn Unterstrichen rausnehme geht es auch und wenn ich denn Teil mit fett und Kursive rausnehme geht das auch?!

Ich habe das Gefühl das es nicht am drawRect liegt.
07.09.2011
seven-ex 63 4
Dann sorry, deine Frage hatte das ios Attribut und war unter "Mobile" einsortiert. Was den Mac angeht kann ich dir leider nicht weiterhelfen
puls200 07.09.2011
Die Tags ios und Mobile habe ich entfernt, dafür ein Mac reingesetzt.
codekicker 11.09.2011
0
Kann mir keiner sagen was ich falsch mache ?
15.09.2011
seven-ex 63 4
0
Hi Peter, das ist mal Klasse aber wenn ich die Attribute ausgebe bekomme ich nicht die richtige Schriftart raus (TimesNewRoman ist richtig aber OriginalFOnt ist falsch)

NSColor = "NSCalibratedRGBColorSpace 0 0 0 1";
NSFont = "\"TimesNewRomanPS-BoldItalicMT 12.00 pt. P [] (0x1002a9a20) fobj=0x10746f670, spc=3.00\"";
NSOriginalFont = "\"LucidaGrande 12.00 pt. P [] (0x1002282b0) fobj=0x100228130, spc=3.80\"";
NSParagraphStyle = "Alignment 0, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n 28L,\n 56L,\n 84L,\n 112L,\n 140L,\n 168L,\n 196L,\n 224L,\n 252L,\n 280L,\n 308L,\n 336L\n), DefaultTabInterval 0, Blocks (null), Lists (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0.05, HeaderLevel 0";
NSUnderline = 0;


wenn ich folgendes ändere geht es wiederum ist das so ok?

.......
NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFont *theFont = [fontManager fontWithFamily:[[schriftart selectedItem] title]
traits:fontTraits
weight:0
size:fontSize];
[selItem setFont:theFont];

NSAssert(theFont, @"The selected font does not exists!");
if (theFont)
{
......


ich glaub wenn ich das so mache stimmen dan die Ausrichtung nicht mehr, oder anderes.
.... ich versuche die Attribute in eine XML zu Speichern. wenn ich denn Text mit familyFont auslese bekomme ich LucidaGrande und nicht TimesNewRomen raus.
02.12.2011
seven-ex 63 4

Stelle deine Xcode-Frage jetzt!