ios - 如何在 iOS 中水平居中 UITextView 内容,但不使用对齐中心?

标签 ios objective-c xcode ipad uitextview

我想实现一些非常具体的东西。很难用语言来描述,所以这里有一些模型。

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

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

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

有什么办法可以做到这一点?

我已经尝试过以下方法:

  • textview.sizeToFit() 似乎调整高度而不是宽度
  • textview.contentOffset 似乎不起作用
  • 删除自动布局中的约束并使用 Editor > Fix all in scope 似乎适用于 UIButtons 但不适用于 UITextView ..

  • 我想这样做的原因是虽然它在 iPhone 上并不明显,但在 iPad 上,如果文本很短,它们会一直显示在左侧,这与我的应用程序中的其他可交互按钮相距甚远。

    最佳答案

    看起来你可能正在使用 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"约束到它的 super View "self"或者它的 super View 是什么:
    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.m
    @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
    

    关于ios - 如何在 iOS 中水平居中 UITextView 内容,但不使用对齐中心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31900310/

    相关文章:

    ios - 快速 TextView 和标签在 UITableviewcell 中返回空文本

    ios - 问题 : live updating labels/progress bars using Swift

    ios - 如何限制删除iOS应用程序? (MDM)

    ios - 更改首先打开的 View (Xcode)

    ios - 在 ext 设备上构建时,Xcode 签名证书无效

    objective-c - 这是什么意思?

    iphone - 缩进 UITextField 中的文本

    objective-c - UINavigationBar 中的后退按钮隐藏问题

    ios - 文本上的操作标签

    ios - 如何使用 Xcode 6 在真实的 iPhone 上测试 App?