A lighter way of discovering text writing direction

后端 未结 3 1157
南方客
南方客 2020-12-09 22:59

I want to determine the writing direction of a string so that I can render Right-to-Left languages such as Arabic correctly in a CALayer.

so I have this method

相关标签:
3条回答
  • 2020-12-09 23:17

    The code in the question although functional is brutally expensive. Run it through a profiler and you will find that it spends close to 80% of the time in UITextView.setText when used in the drawInContext method for a layer.

    Most of the answer is here in Detect Language of NSString

    a better form is thus...

    +(UITextAlignment)alignmentForString:(NSString *)astring
    {
    
        if (astring.length) {
    
            NSArray *rightLeftLanguages = @[@"ar",@"he"];
    
            NSString *lang = CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage((CFStringRef)astring,CFRangeMake(0,[astring length])));
    
            if ([rightLeftLanguages containsObject:lang]) {
    
                return UITextAlignmentRight;
    
            }
        }
    
        return UITextAlignmentLeft;
    
    }
    

    As Arabic and Hebrew are the only Right-to-Left languages detectable by CFStringTokenizerCopyBestStringLanguage and should also cover Persian, Urdu and Yiddish though I havent tested that.

    see also http://en.wikipedia.org/wiki/Right-to-left

    0 讨论(0)
  • 2020-12-09 23:19

    Swift

    For me the .natural textAlignment of UITextView did not work unless I edited the text and line from start.

    Based on the great answer to this question and the comment below it.

    let text = "..."
    let lang = CFStringTokenizerCopyBestStringLanguage(text as CFString, CFRange(location: 0, length: text.characters.count))
    
    if let lang = lang {
        let direction = NSLocale.characterDirection(forLanguage: lang as String)
    
        if direction == .rightToLeft {
            textView.textAlignment = .right
        }
        else {
            textView.textAlignment = .left
        }
    }
    
    0 讨论(0)
  • 2020-12-09 23:21

    Since UITextAlignment is deprecated, here's an NSString category with NSWritingDirection:

    - (NSWritingDirection)alignment{
        if (self.length) {
            NSArray *rightLeftLanguages = @[@"ar",@"he"];
            NSString *lang = CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage((CFStringRef)self,CFRangeMake(0,self.length)));
            if ([rightLeftLanguages containsObject:lang]) {
                return NSWritingDirectionRightToLeft;
            }
        }
        return NSWritingDirectionLeftToRight;
    

    }

    0 讨论(0)
提交回复
热议问题