NSAttributedString 추가 텍스트 정렬


109

텍스트 정렬 속성을 NSAttributedString에 추가하여 텍스트를 중앙에 배치하려면 어떻게해야합니까?

편집 : 내가 뭘 잘못하고 있니? 정렬을 변경하지 않는 것 같습니다.

CTParagraphStyleSetting setting;
setting.spec = kCTParagraphStyleSpecifierAlignment;
setting.valueSize = kCTCenterTextAlignment;

CTParagraphStyleSetting settings[1] = {
    {kCTParagraphStyleSpecifierAlignment, sizeof(CGFloat), &setting},           
};

CTParagraphStyleRef paragraph = CTParagraphStyleCreate(settings, sizeof(setting));

NSMutableAttributedString *mutableAttributed = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedString];
[mutableAttributed addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)paragraph ,(NSString*) kCTParagraphStyleAttributeName, nil] range:_selectedRange];

답변:


39

으로 NSAttributedString주로 iOS의 핵심 텍스트와 함께 사용, 당신은 사용할 필요가 CTParagraphStyle대신 NSParagraphStyle. 변경 가능한 변형이 없습니다.

예를 들면 :

CTTextAlignment alignment = kCTCenterTextAlignment;

CTParagraphStyleSetting alignmentSetting;
alignmentSetting.spec = kCTParagraphStyleSpecifierAlignment;
alignmentSetting.valueSize = sizeof(CTTextAlignment);
alignmentSetting.value = &alignment;

CTParagraphStyleSetting settings[1] = {alignmentSetting};

size_t settingsCount = 1;
CTParagraphStyleRef paragraphRef = CTParagraphStyleCreate(settings, settingsCount);
NSDictionary *attributes = @{(__bridge id)kCTParagraphStyleAttributeName : (__bridge id)paragraphRef};
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:@"Hello World" attributes:attributes];

나는 EGOTextView라는 라이브러리를 사용하지 않고 속성 문자열을 얻습니다
aryaxt

1
단락 스타일을 만드는 방법에 문제가 있습니다. 내가 추가 한 예제를 확인하십시오. EGOTextView에서 작동했습니다. 적어도 라인이 가운데로 표시되었지만 버그가있는 것처럼 보이며 선택이 가운데 텍스트로 제대로 작동하지 않습니다.
omz

예, 버그로 가득 차 있습니다. 저는 지난 4 주 동안 버그를 수정하기 위해 keayboard에 머리를 두 드렸습니다. 그러나 그것은 좋은 시작이었습니다. 그것 없이는 리치 텍스트 편집기로 시작해야 할 곳을 알 수 없었습니다. 대답 해 주셔서 감사합니다.
aryaxt 2011-07-24

1
@omz 당신이 내 직업을 구했습니다. : D 감사합니다
Awais 타리크

1
@bobby 동의하지만 그 답변은 5 년 전에 작성했으며 NSParagraphStyle당시에는 iOS에서 사용할 수 없었습니다.
omz

266
 NSMutableParagraphStyle *paragraphStyle = NSMutableParagraphStyle.new;
 paragraphStyle.alignment                = NSTextAlignmentCenter;

 NSAttributedString *attributedString   = 
[NSAttributedString.alloc initWithString:@"someText" 
                              attributes:
         @{NSParagraphStyleAttributeName:paragraphStyle}];

스위프트 4.2

let paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = NSTextAlignment.center

    let attributedString = NSAttributedString(string: "someText", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])

1
이것은에서 작동하지 않습니다 NSTextAlignmentJustified. 이유를 알 수 있습니까? 정렬을 정당화하려면 어떻게해야합니까?
Sam

1
참고 : 내가 말할 수있는 한 100 % 정확 해 보였지만 수락 된 답변은 iOS7에서 작동하지 않았습니다. 이 답변은 올바르게 작동했으며 물론 훨씬 간단한 코드입니다. :)
Adam

나는 샘이보고 한 것과 같은 문제가있다. 를 제외한 모든 정렬에 대해 괜찮습니다 NSTextAlignmentJustified. iOS7 버그입니까?
Matheus Abreu 2014

6
해결되었습니다. NSBaselineOffsetAttributeName : @0속성 사전에 추가하십시오 .
Matheus Abreu

고마워요 저도 효과가 있었어요 NSAttributedString.alloc. 그건 그렇고 그 신텍스가 뭐야 ?
klefevre 2014

92

나는 같은 문제를 찾고 있었고 다음과 같이 NSAttributedString의 텍스트를 중앙 정렬 할 수있었습니다.

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init] ;
[paragraphStyle setAlignment:NSTextAlignmentCenter];

NSMutableAttributedString *attribString = [[NSMutableAttributedString alloc]initWithString:string];
[attribString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [string length])];

1
이것은 최선의 대답이지만, 나는이 질문을 할 때이 답변에 사용되는 API는 아직 iOS에서 사용할 수 없었습니다
aryaxt

이것을 특정 범위에만 적용하는 방법이 있습니까?
nburk

예, 범위 매개 변수를 편집하여. NSMakeRange(0, [string length])완전한 문자열을 나타냅니다.
제문

67

Swift 4.0 이상

let titleParagraphStyle = NSMutableParagraphStyle()
titleParagraphStyle.alignment = .center

let titleFont = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)
let title = NSMutableAttributedString(string: "You Are Registered", 
    attributes: [.font: titleFont,    
    .foregroundColor: UIColor.red, 
    .paragraphStyle: titleParagraphStyle])

Swift 3.0 이상

let titleParagraphStyle = NSMutableParagraphStyle()
titleParagraphStyle.alignment = .center

let titleFont = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)
let title = NSMutableAttributedString(string: "You Are Registered", 
    attributes: [NSFontAttributeName:titleFont,    
    NSForegroundColorAttributeName:UIColor.red, 
    NSParagraphStyleAttributeName: titleParagraphStyle])

(아래 원본 답변)

Swift 2.0 이상

let titleParagraphStyle = NSMutableParagraphStyle()
titleParagraphStyle.alignment = .Center

let titleFont = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
let title = NSMutableAttributedString(string: "You Are Registered",
    attributes:[NSFontAttributeName:titleFont,   
    NSForegroundColorAttributeName:UIColor.redColor(), 
    NSParagraphStyleAttributeName: titleParagraphStyle])

슬프게도 NSAttributedString의 draw () 함수와 함께 작동하지 않습니다
Ash

21

Swift 4 답변 :

// Define paragraph style - you got to pass it along to NSAttributedString constructor
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center

// Define attributed string attributes
let attributes = [NSAttributedStringKey.paragraphStyle: paragraphStyle]

let attributedString = NSAttributedString(string:"Test", attributes: attributes)

2

신속한 4 :

    let paraStyle = NSMutableParagraphStyle.init()
    paraStyle.alignment = .left

    let str = "Test Message"
    let attribute = [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 12)]

    let attrMessage = NSMutableAttributedString(string: str, attributes: attribute)


    attrMessage.addAttribute(kCTParagraphStyleAttributeName as NSAttributedStringKey, value: paraStyle, range: NSMakeRange(0, str.count))

off-by-one on range : NSMakeRange (0, str.count)
Martin-Gilles Lavoie

-5
[averagRatioArray addObject:[NSString stringWithFormat:@"When you respond Yes to %@ the average response to    %@ was %0.02f",QString1,QString2,M1]];
[averagRatioArray addObject:[NSString stringWithFormat:@"When you respond No  to %@ the average response to    %@ was %0.02f",QString1,QString2,M0]];

UIFont *font2 = [UIFont fontWithName:@"Helvetica-Bold" size:15];
UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:12];

NSMutableAttributedString *str=[[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"When you respond Yes to %@ the average response to %@ was",QString1,QString2]];
[str addAttribute:NSFontAttributeName value:font range:NSMakeRange(0,[@"When you respond Yes to " length])];
[str addAttribute:NSFontAttributeName value:font2 range:NSMakeRange([@"When you respond Yes to " length],[QString1 length])];
[str addAttribute:NSFontAttributeName value:font range:NSMakeRange([QString1 length],[@" the average response to " length])];
[str addAttribute:NSFontAttributeName value:font2 range:NSMakeRange([@" the average response to " length],[QString2 length])];
[str addAttribute:NSFontAttributeName value:font range:NSMakeRange([QString2 length] ,[@" was" length])];
// [str addAttribute:NSFontAttributeName value:font2 range:NSMakeRange(49+[QString1 length]+[QString2 length] ,8)];
[averagRatioArray addObject:[NSString stringWithFormat:@"%@",str]];

2
답을 수정하고 코드를 읽을 수 있도록 형식을 지정하십시오.
클레오 파트라
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.