2015-08-09 66 views
1

我想達到一些非常具體的東西。這很難用文字描述,所以這裏有一些模型。如何在iOS中將UITextView內容水平居中,但不使用居中對齊?

當前階段:我有一個UITextView,其自動佈局約束設置爲與父容器一樣寬。 Left aligned text

我想達到的目標:我想水平居中的內容在UITextView中,使他們出現在中心,但仍然左對齊 Content centered but left aligned text

大多數解決方案依靠TextAlignCenter選項居中文本水平,但這不是我想要的東西,因爲它會出現這樣,而不是: Centered aligned text

任何方式來實現這一目標?

我已經試過以下:

  1. textview.sizeToFit()似乎調整高度而不是寬度
  2. textview.contentOffset似乎並沒有工作
  3. 去除自動版式的約束並使用編輯器>修復所有範圍似乎在UIButtons工作,但不是UITextView的..

我想這樣做的原因是,雖然它不是在iPhone noticable,在iPad上,如果文本AR簡而言之,它們會一直顯示在左邊,這與我的其他應用程序中的其他可交互按鈕非常相似。

回答

0

它看起來像你可能使用Swift,但沒關係,這是Objective-C的代碼,只是將其轉換。

UITextView * _descriptionText = [UITextView new]; 
[_descriptionText setDelegate:self]; 
[_descriptionText setBackgroundColor:[UIColor whiteColor]; 
[_descriptionText setTranslatesAutoresizingMaskIntoConstraints:false]; 
[_descriptionText setTextColor:[UIColor lightGrayColor]]; 
[_descriptionText setTextAlignment:NSTextAlignmentLeft]; 

那麼,這個TextView的添加到一個UIView

[sss addSubview:_descriptionText]; 

下面是UIView的代碼:

UIView * sss = [UIView new]; 
[sss setTranslatesAutoresizingMaskIntoConstraints:FALSE]; 
[self addSubview:sss]; 

添加約束UIView的居中的UITextView並限制它的邊界在左右兩側有一定的寬度:

[sss addConstraint:[NSLayoutConstraint constraintWithItem:descriptionText attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeHeight multiplier:1.0f constant:SOME_HEIGHT_NUMBER_YOU_CHOOSE]]; 

[sss addConstraint:[NSLayoutConstraint constraintWithItem:descriptionText attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeHeight multiplier:1.0f constant:SOME_RIGHT_MARGIN_NUMBER_YOU_CHOOSE]]; 

[sss addConstraint:[NSLayoutConstraint constraintWithItem:descriptionText attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeLeft multiplier:1.0f constant:SOME_LEFT_MARGIN_NUMBER_YOU_CHOOSE]]; 

或選擇的UITextView的這樣一個的centerX約束寬度:

[sss addConstraint:[NSLayoutConstraint constraintWithItem:descriptionText attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:SOME_WIDTH_NUMBER_YOU_CHOOSE]]; 

[sss addConstraint:[NSLayoutConstraint constraintWithItem:descriptionText attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0]]; 

最後,添加CenterY約束:

[sss addConstraint:[NSLayoutConstraint constraintWithItem:descriptionText attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0]]; 

最後,約束UIView的 「SSS」,以它的超級查看「自我」或任何它的超級看法是:

NSDictionary * views = NSDictionaryOfVariableBindings(sss); 
NSDictionary * metrics = @{@"bh" : @30, @"bsh" : @40, ... etc, etc,}; 

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[sss]|" options:0 metrics:metrics views:views]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-bh-[sss]" options:0 metrics:metrics views:views]]; 

然後,利潤!

具有子類UIView的格式化代碼 ExampleView。米

@implementation ExampleView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     UIView * sss = [UIView new]; 
     [sss setTranslatesAutoresizingMaskIntoConstraints:false]; 
     [self addSubview:sss]; 

     UITextView * _descriptionText = [UITextView new]; 
     [_descriptionText setBackgroundColor:[UIColor whiteColor]]; 
     [_descriptionText setTranslatesAutoresizingMaskIntoConstraints:false]; 
     [_descriptionText setTextColor:[UIColor lightGrayColor]]; 
     [_descriptionText setTextAlignment:NSTextAlignmentLeft]; 
     [sss addSubview:_descriptionText]; 

     //do these three constraints 
     [sss addConstraint:[NSLayoutConstraint constraintWithItem:_descriptionText attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeHeight multiplier:1.0f constant:SOME_HEIGHT_NUMBER_YOU_CHOOSE]]; 

     [sss addConstraint:[NSLayoutConstraint constraintWithItem:_descriptionText attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeRight multiplier:1.0f constant:SOME_RIGHT_MARGIN_NUMBER_YOU_CHOOSE]]; 

     [sss addConstraint:[NSLayoutConstraint constraintWithItem:_descriptionText attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeLeft multiplier:1.0f constant:SOME_LEFT_MARGIN_NUMBER_YOU_CHOOSE]]; 

     //or do these three constraints, but don't do all 6 constraints between these three and the three above 

     [sss addConstraint:[NSLayoutConstraint constraintWithItem:_descriptionText attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:SOME_WIDTH_NUMBER_YOU_CHOOSE]]; 

     [sss addConstraint:[NSLayoutConstraint constraintWithItem:_descriptionText attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0]]; 

     [sss addConstraint:[NSLayoutConstraint constraintWithItem:_descriptionText attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0]]; 

     NSDictionary * views = NSDictionaryOfVariableBindings(sss); 
     NSDictionary * metrics = @{@"bh" : @30, @"bsh" : @40}; 

     [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[sss]|" options:0 metrics:metrics views:views]]; 
     [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-bh-[sss]" options:0 metrics:metrics views:views]]; 
// this: V:|-bh-[sss] SHOULD WORK, BUT IT MIGHT REQUIRE YOU TO DO THIS: V:|-bh-[sss(HEIGHT_OF_THE_TEXT_VIEW_THAT_YOU_CHOOSE)] 
    } 
    return self; 
} 
@end 

ExampleView.h

#import <UIKit/UIKit.h> 
@interface NSHMessagesView : UIView 

@end 
+0

感謝,但似乎UITextView需要知道它的寬度之前運行?對於我使用的示例,我不知道在運行時最長行的寬度是多少,因爲它取決於用戶輸入。 – Bruce

+0

你應該把它設置成某種東西,這是肯定的,但是你可以在我編寫這種東西的約束中設置它:SOME_LEFT_MARGIN_NUMBER_YOU_CHOOSE只是改變你看到的所有東西,然後選擇前三個約束或下面三個約束這些限制和你贏得了 – Loxx

0

我想你也可以繼承的UITextView或設置contentInset。因爲它是子類scrollView,所以我猜設置contentInset可以achevie的目標。

+0

contentInset使它可以水平滾動,我想要避免。 – Bruce