如何在iOS中水平居中UITextView内容,但不使用Align Center?

时间:2015-08-09 02:19:28

标签: ios objective-c xcode ipad uitextview

我想要达到非常具体的目标。用文字描述很难,所以这里有一些模型。

当前阶段:我有一个UITextView,其自动布局约束设置为与父容器一样宽。 Left aligned text

我想要实现的目标:我想将内容水平居中在UITextView中,以便它们出现在中心但仍保持左对齐 Content centered but left aligned text

大多数解决方案都依赖于TextAlignCenter选项来水平居中文本,但这不是我想要的东西,因为它会显示为: Centered aligned text

有任何方法可以达到这个目的吗?

我试过以下内容:

  1. textview.sizeToFit()似乎调整高度而不是宽度
  2. textview.contentOffset似乎无法正常工作
  3. 删除autolayout中的约束并使用编辑器>修复所有范围似乎适用于UIButtons但不适用于UITextView ..
  4. 我想这样做的原因虽然在iPhone上并不明显,但如果文字很短,它们会一直显示在左侧,这与我应用中的其他可互动按钮相差甚远。

2 个答案:

答案 0 :(得分:0)

看起来你可能正在使用Swift,但这很好,这是Objective-C的代码,只需转换它。

fstDT <- fread("dat.csv")

Read 1999993 rows and 33 (of 33) columns from 0.324 GB file in 00:00:49

然后,将此textview添加到UIView

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

以下是UIView的代码:

[sss addSubview:_descriptionText];

向UIView添加约束以使UITextView居中,并将左边和右边的某个宽度约束为界限:

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

或者使用CenterX约束选择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]];

最后,添加一个CenterY约束:

[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]];

最后,将UIView“sss”限制在它的超级视图“self”或者它的超级视图是什么:

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

然后,获利!

带有子类UIView的格式化代码 ExampleView.m

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]];

ExampleView.h

@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

答案 1 :(得分:0)

我认为你可以继承UITextView或设置contentInset。因为它是子类scrollView,所以我猜设置contentInset可以实现目标。