Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS中水平居中查看UITextView内容,但不使用对齐中心?_Ios_Objective C_Xcode_Ipad_Uitextview - Fatal编程技术网

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

如何在iOS中水平居中查看UITextView内容,但不使用对齐中心?,ios,objective-c,xcode,ipad,uitextview,Ios,Objective C,Xcode,Ipad,Uitextview,我想实现一些非常具体的目标。很难用语言来描述,所以这里有一些模型 当前阶段:我有一个UITextView,它的自动布局约束设置为与父容器一样宽。 我想要实现的是:我希望将UITextView中的内容水平居中,以便它们显示在中间,但仍保持左对齐 大多数解决方案依靠TextAlignCenter选项将文本水平居中,但这不是我想要的,因为它将显示为: 有什么办法可以做到这一点 我尝试了以下方法: textview.sizeToFit()似乎可以调整高度,但不能调整宽度 textview.cont

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

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

我想要实现的是:我希望将UITextView中的内容水平居中,以便它们显示在中间,但仍保持左对齐

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

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

我尝试了以下方法:

  • textview.sizeToFit()似乎可以调整高度,但不能调整宽度
  • textview.contentOffset似乎不起作用
  • 删除autolayout和use 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]];
    
    [sss addConstraint:[NSLayoutConstraint constraintWithItem:descriptionText attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:sss attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0]];
    
    最后,添加中心约束:

    [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]];
    
    最后,将UIView“sss”约束到它的超级视图“self”或它的超级视图是什么:

    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
    
    示例视图.h

    #import <UIKit/UIKit.h>
    @interface NSHMessagesView : UIView
    
    @end
    
    #导入
    @界面消息视图:UIView
    @结束
    
    我认为您可以将UITextView子类化或设置contentInset。因为它是scrollView的子类,所以我想set-contentInset可以实现这个目标。

    谢谢,但是UITextView似乎需要在运行前知道它的宽度?对于我使用的示例,我在运行前不知道最长行的宽度,因为它取决于用户输入。是的,您应该将其设置为某个值,这是肯定的,但是你可以在我写这类东西的约束中设置它:一些左边距,数字,你只需改变你看到的一切,然后选择前三个约束或那些约束下面的三个,wincontentInset使它可以水平滚动,这是我想要避免的。