> On 29 Nov 2016, at 03:33, Doug Hill <cocoa...@breaqz.com> wrote: > > A couple of things to note: > […] > In any case it's a bad idea to select the exact font since you have to choose > SF Display or Text which you don't want to do. It should be dynamically > selected at runtime based on the font size. This behavior is supported by > using System Font. > > Anyways, I would check the font at runtime to make sure it’s SF.
thinFont = <UICTFont:> font-family: “.SFUIDisplay-Ultralight"; font-weight: normal; font-style: normal; font-size: 70.00pt > Otherwise, you need a font that supports the Vertically Centered Colon font > feature. You can check this feature by doing the following: > • Select your desired font on your Mac for the attributed string in the font > panel > • Click the Gear icon in the upper-left corner. > • Select Typography… > • Select 'Alternative Stylistic Sets' > • Select ‘Vertically Centered Colon' Well, this is kind of difficult: the Font Panel does not show fonts which have names which start with ‘.’. So: no SF fonts in my Font Panel. > Furthermore, I don’t see a way to set these 'Alternative Stylistic' > attributes from UIAttributedText. Can be done like this: NSDictionary *featureCenteredColon = @{ UIFontFeatureTypeIdentifierKey: @(kStylisticAlternativesType), UIFontFeatureSelectorIdentifierKey: @(kStylisticAltThreeOnSelector) }; NSArray *featureArray = @[ featureCenteredColon ]; NSDictionary *featureAtribute = @{ UIFontDescriptorFeatureSettingsAttribute: featureArray }; UIFontDescriptor *thinDescriptor = thinFont.fontDescriptor; UIFontDescriptor *newDescr = [ thinDescriptor fontDescriptorByAddingAttributes: featureAtribute ]; UIFont *betterThinFont = [ UIFont fontWithDescriptor: newDescr size: pointSize ]; > A little experimentation might find the right one. A “little” is kind of misleading. There are about 40 features, with up to 20 alternatives each. > OK, after doing some tests, UILabel indeed behaves like you mentioned with > the SF font. If there aren't numbers on either side of the colon, no vertical > centering. My guess would see if you can attempt to set the > kStylisticAlternativesType attribute, as noted below, but as previously > mentioned, will probably not work automatically due to the different fonts > for the numerals around the colon. > > At this point, I’d say your working solution is probably as good as you're > going to get. After you kindly mentioned kStylisticAlternativesType I started to try this. The documentation is quite helpful in mentioning that some flag “Turns the nth set of alternates on or off” for n = 1 … 20. And luckily kStylisticAltThreeOnSelector does indeed turn centred colons on. So now I have two working solutions: 1. getting the special glyph for the centered colon (as suggested by Alistair) and: 2. using kStylisticAltThreeOnSelector (as suggested by you). Thanks a lot. The hint of “kStylisticAlternativesType” was extremely helpful! Kind regards, Gerriet. > > >> On Nov 28, 2016, at 11:12 AM, Gerriet M. Denkmann <gerri...@icloud.com> >> wrote: >> >> >>> On 28 Nov 2016, at 23:42, Alastair Houghton <alast...@alastairs-place.net> >>> wrote: >>> >>> On 28 Nov 2016, at 16:18, Gerriet M. Denkmann <gerri...@icloud.com> wrote: >>>> >>>> >>>>> On 28 Nov 2016, at 22:13, Eric E. Dolecki <edole...@gmail.com> wrote: >>>>> >>>>> You could probably use an attributed string and add an attribute for the >>>>> last colon: NSBaselineOffsetAttributeName >>>> >>>> Yes; but this would be some rather desperate work-around. >>>> >>>> I was rather thinking of UIFontDescriptorFeatureSettingsAttribute with >>>> some Feature type from SFNTLayoutTypes.h (in CoreText). >>>> I tried a few types, but no success so far. >>> >>> The problem you’ve got is that unless the font has a feature that >>> specifically allows you to change *any* colon (as opposed to a colon >>> between two numerals), you aren’t going to be able to do it by turning on >>> an OpenType feature. Even if you can, there doesn’t appear to be a >>> standard feature code for this, so you’d be reliant on Apple not changing >>> it in the future. >> >> The WWDC 2015 talk seemed to suggest that there is a standard feature for >> this. >> But there are about 40 feature types in SFNTLayoutTypes.h - no idea what to >> use. >> >> >>> What you *could* do instead is get Core Text (or Cocoa Text) to lay out a >>> string e.g. “12:00”, then grab the glyph for the centred colon directly >>> from that string and use it explicitly, e.g. by attaching a >>> kCTGlyphInfoAttributeName attribute to your string with the value set to an >>> appropriately constructed CTGlyphInfoRef. >> >> done once: >> >> CGRect frame = { {0,0},{99,99}}; >> UITextView *dummyTextView = [ [UITextView alloc] initWithFrame: frame >> textContainer: nil ]; >> dummyTextView.text = @“23:21”; >> dummyTextView.font = thinFont; >> NSLayoutManager *layoutManager = dummyTextView.layoutManager; >> [ layoutManager ensureGlyphsForCharacterRange: range ]; >> [ layoutManager ensureLayoutForCharacterRange: range ]; >> NSUInteger glyphIndex = [ layoutManager glyphIndexForCharacterAtIndex: 2 ]; >> centeredColonGlyph = [ layoutManager CGGlyphAtIndex: glyphIndex ];; >> >> >> and then: >> >> CFMutableAttributedStringRef aStr = (__bridge >> CFMutableAttributedStringRef)attributedString; >> CTFontRef fontRiff = (__bridge CTFontRef)thinFont; >> CTGlyphInfoRef glyInfRef = CTGlyphInfoCreateWithGlyph( centeredColonGlyph, >> fontRiff, (CFStringRef)@":" ); >> CFRange range = { (CFIndex)colonIndex, 1 }; >> CFAttributedStringSetAttribute( aStr, range, kCTGlyphInfoAttributeName, >> glyInfRef ); >> CFRelease(glyInfRef); >> >> This seems to be working. Nut sure whether there is a more elegant way. >> >> Thanks a lot for your help! >> >> >> Kind regards, >> >> Gerriet. _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com