web-dev-qa-db-ja.com

UITextViewのテキストを垂直方向および水平方向の中央に配置します

1つのセルを含むグループ化されたテーブルビューがあります。このセルでは、UITextViewcellForRowAtIndexPath:に入れており、すぐにこの最初のレスポンダを作成します。

私の問題は次のとおりです。入力を開始すると、テキストが左揃えになり、必要に応じて水平方向と垂直方向の中央に配置されません。これはiOS 7です。

テキストを中央揃えするにはどうすればよいですか?

16
user3083408

UITextViewのcontentsizeを監視することでこの問題を解決し、contentSizeに変更がある場合はcontentOffsetを更新します。

次のようにオブザーバーを追加します。

[textview addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];

次のようにオブザーバーアクションを処理します。

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
     UITextView *txtview = object;
     CGFloat topoffset = ([txtview bounds].size.height - [txtview contentSize].height * [txtview zoomScale])/2.0;
     topoffset = ( topoffset < 0.0 ? 0.0 : topoffset );
     txtview.contentOffset = (CGPoint){.x = 0, .y = -topoffset};
}

Textviewテキストを水平方向に中央に配置するには、.xibクラスからtextviewを選択し、ライブラリに移動して、その配置で中央揃えを設定します。

楽しい。 :)

28
Vinay Jain

非常に良い解決策です!これはSwift + Interface Builderソリューション。IBで有効にできます。

LSwiftライブラリの一部として配置します。

extension UITextView {
    @IBInspectable var align_middle_vertical: Bool {
        get {
            return false    //  TODO
        }
        set (f) {
            self.addObserver(self, forKeyPath:"contentSize", options:.New, context:nil)
        }
    }
    override public func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject:AnyObject], context: UnsafeMutablePointer<Void>) {
        if let textView = object as? UITextView {
            var y: CGFloat = (textView.bounds.size.height - textView.contentSize.height * textView.zoomScale)/2.0;
            if y < 0 {
                y = 0
            }
            textView.content_y = -y
        }
    }
}

public extension UIScrollView {
    public var content_x: CGFloat {
        set(f) {
            contentOffset.x = f
        }
        get {
            return contentOffset.x
        }
    }
    public var content_y: CGFloat {
        set(f) {
            contentOffset.y = f
        }
        get {
            return contentOffset.y
        }
    }
}
1
superarts.org