Làm cách nào để mất lề / phần đệm trong UITextView?


487

Tôi có một UITextViewỨng dụng iOS, hiển thị một lượng lớn văn bản.

Sau đó tôi phân trang văn bản này bằng cách sử dụng tham số lề bù của UITextView.

Vấn đề của tôi là phần đệm của phần UITextViewnày gây nhầm lẫn cho các tính toán của tôi vì nó có vẻ khác nhau tùy thuộc vào kích thước phông chữ và kiểu chữ mà tôi sử dụng.

Do đó, tôi đặt ra câu hỏi: Có thể loại bỏ phần đệm xung quanh nội dung của UITextView?

Mong muốn được nghe câu trả lời của bạn!


9
Lưu ý rằng QA này đã gần mười năm tuổi! Với hơn 100.000 lượt xem, vì đây là một trong những vấn đề ngu ngốc nhất trong iOS . Chỉ cần FTR tôi đưa vào giải pháp hiện tại, năm 2017, hợp lý đơn giản / thông thường / được chấp nhận dưới đây là một câu trả lời.
Fattie

1
Tôi vẫn nhận được các bản cập nhật về điều này, đã viết một cách giải quyết được mã hóa cứng vào năm 2009 khi iOS 3.0 vừa được phát hành. Tôi chỉ chỉnh sửa câu trả lời để nói rõ rằng đã hết năm và bỏ qua trạng thái được chấp nhận.
Michael

Câu trả lời:


383

Cập nhật cho năm 2019

Đây là một trong những lỗi nhỏ nhất trong iOS.

Các lớp được đưa ra ở đây, UITextViewFixedthường là một giải pháp hợp lý nhất.

Đây là lớp học:

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
    }
}

Đừng quên tắt cuộn Đã bật trong Thanh tra!

  1. Giải pháp hoạt động đúng trong bảng phân cảnh

  2. Giải pháp hoạt động đúng khi chạy

Thế là xong, bạn đã hoàn thành.

Nói chung, đó nên là tất cả những gì bạn cần trong hầu hết các trường hợp .

Ngay cả khi bạn đang thay đổi chiều cao của chế độ xem văn bản một cách nhanh chóng , UITextViewFixedthường thì tất cả những gì bạn cần.

(Một ví dụ phổ biến về việc thay đổi chiều cao một cách nhanh chóng, là thay đổi nó theo kiểu người dùng.)

Đây là UITextView bị hỏng từ Apple ...

ảnh chụp màn hình của IB với UITextView

Đây là UITextViewFixed:

ảnh chụp màn hình của IB với UITextViewFixed

Lưu ý rằng tất nhiên bạn phải

tắt cuộn Được bật trong Thanh tra!

Đừng quên tắt cuộn. :)


Một số vấn đề khác

(1) Trong một số trường hợp bất thường - ví dụ: một số trường hợp bảng có chiều cao di động linh hoạt, thay đổi linh hoạt - Apple thực hiện một điều kỳ quái: Họ thêm không gian ở phía dưới . Không, thực sự! Đây sẽ phải là một trong những điều gây phẫn nộ nhất trong iOS.

Dưới đây là một "sửa chữa nhanh" để thêm vào những điều trên thường giúp ích cho sự điên rồ đó.

...
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0

        // this is not ideal, but you can sometimes use this
        // to fix the "extra space at the bottom" insanity
        var b = bounds
        let h = sizeThatFits(CGSize(
           width: bounds.size.width,
           height: CGFloat.greatestFiniteMagnitude)
       ).height
       b.size.height = h
       bounds = b
 ...

(2) Đôi khi, để khắc phục một lỗi lộn xộn khác của Apple, bạn phải thêm điều này:

override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
    super.setContentOffset(contentOffset, animated: false)
}

(3) Có thể cho rằng, chúng ta nên thêm:

contentInset = UIEdgeInsets.zero

chỉ sau .lineFragmentPadding = 0trong UITextViewFixed.

Tuy nhiên ... tin hay không ... nó chỉ không hoạt động trong iOS hiện tại! (Đã kiểm tra vào năm 2019.) Có thể cần phải thêm dòng đó trong tương lai.

Thực tế UITextViewbị hỏng trong iOS là một trong những điều kỳ lạ nhất trong tất cả các máy tính di động. Kỷ niệm mười năm của câu hỏi này và nó vẫn chưa được sửa!

Cuối cùng, đây là một mẹo tương tự cho Trường văn bản : https://stackoverflow.com/a/43099816/294884

Mẹo hoàn toàn ngẫu nhiên: cách thêm "..." vào cuối

Thường thì bạn đang sử dụng UITextView "giống như một UILabel". Vì vậy, bạn muốn nó cắt bớt văn bản bằng dấu chấm lửng "..."

Nếu vậy, hãy thêm một dòng mã thứ ba trong "thiết lập":

 textContainer.lineBreakMode = .byTruncatingTail

Mẹo tiện dụng nếu bạn muốn có chiều cao bằng không, khi nào, không có văn bản nào cả

Thường thì bạn sử dụng chế độ xem văn bản để chỉ hiển thị văn bản. Vì vậy, người dùng thực sự không thể chỉnh sửa bất cứ điều gì. Bạn sử dụng các dòng "0" để có nghĩa là chế độ xem văn bản sẽ tự động thay đổi chiều cao tùy thuộc vào số lượng dòng văn bản.

Điều đó thật tuyệt, nhưng nếu không có văn bản nào cả thì thật không may, bạn có cùng chiều cao như thể có một dòng văn bản !! Chế độ xem văn bản không bao giờ "biến mất".

nhập mô tả hình ảnh ở đây

Nếu bạn muốn nó "biến mất", chỉ cần thêm nó

override var intrinsicContentSize: CGSize {
    var i = super.intrinsicContentSize
    print("for \(text) size will be \(i)")
    if text == "" { i.height = 1.0 }
    print("   but we changed it to \(i)")
    return i
}

nhập mô tả hình ảnh ở đây

(Tôi đã làm cho nó '1' vì vậy rõ ràng những gì đang diễn ra, '0' vẫn ổn.)

Thế còn UILabel?

Khi chỉ hiển thị văn bản, UILabel có nhiều lợi thế hơn UITextView. UILabel không gặp phải các vấn đề được mô tả trên trang QA này. Thật vậy, lý do tất cả chúng ta thường "từ bỏ" và chỉ sử dụng UITextView là UILabel rất khó để làm việc. Đặc biệt, thật khó khăn khi chỉ thêm phần đệm , chính xác, vào UILabel. Trên thực tế, đây là một cuộc thảo luận đầy đủ về cách "cuối cùng" thêm chính xác phần đệm vào UILabel: https://stackoverflow.com/a/58876988/294884 Trong một số trường hợp nếu bạn đang thực hiện một bố cục khó khăn với các ô có chiều cao động, đôi khi tốt hơn để làm điều đó một cách khó khăn với UILabel.


1
tôi đã làm self.textView.isScrollEnabled = falsebên trong viewDidLayoutSubviews()và điều đó cũng làm việc Apple chỉ thích làm cho chúng tôi nhảy qua vòng :)
AnBisw

1
Giải pháp tốt nhất để khắc phục tất cả các lỗi tự động xóa UITextView vô lý của tôi trên các ô, tiêu đề và chân trang UITableView của tôi với chiều cao động (UITableViewAutomaticDimension). Tuyệt quá!
Peter Kreinz

1
Tôi đã đăng một câu trả lời cập nhật cho câu trả lời của @ Fattie giúp tôi thực sự thoát khỏi tất cả các nội dung bằng cách sử dụng thủ thuật đặc biệt là bật / tắt translatesAutoresizingMaskIntoConstraints. Chỉ với câu trả lời này, tôi đã không thể loại bỏ tất cả các lề (một số lề dưới kỳ lạ chống lại sự biến mất) trong hệ thống phân cấp chế độ xem bằng cách sử dụng bố cục tự động. Nó cũng liên quan đến việc tính toán kích thước chế độ xem bằng cách sử dụng systemLayoutSizeFitting, trước đây đã trả về kích thước không hợp lệ do lỗiUITextView
Fab1n

1
1up cho IBDesignable. Tôi cũng sẽ ủng hộ văn bản giữ chỗ được chọn rất tốt, nếu tôi có thể
Toastor 18/10/18

1
Tôi đã có các bài viết trong bảng, những bài có một dòng văn bản không tính được chiều cao của nó một cách chính xác (tự động thanh toán). Để khắc phục, tôi phải ghi đè didMoveToSuperview và gọi thiết lập ở đó.
El Hor khiếp

791

Đối với iOS 7.0, tôi đã thấy rằng thủ thuật contentInset không còn hoạt động. Đây là mã tôi đã sử dụng để thoát khỏi lề / phần đệm trong iOS 7.

Điều này đưa cạnh trái của văn bản đến cạnh trái của container:

textView.textContainer.lineFragmentPadding = 0

Điều này làm cho phần trên cùng của văn bản thẳng hàng với phần trên của vùng chứa

textView.textContainerInset = .zero

Cả hai dòng là cần thiết để loại bỏ hoàn toàn lề / đệm.


2
Điều này làm việc cho tôi hai dòng, nhưng đến khi tôi đạt được 5 dòng, văn bản sẽ bị cắt bỏ.
livings124

7
Lưu ý rằng dòng thứ hai cũng có thể được viết là: self.descriptionTextView.textContainerInset = UIEdgeInsetsZero;
jessepinho

19
Đặt lineFragmentPaddingthành 0 là phép thuật mà tôi đang tìm kiếm. Tôi không biết tại sao Apple lại khó khăn trong việc sắp xếp nội dung UITextView với các điều khiển khác.
phatmann

3
Đây là câu trả lời chính xác. Cuộn theo chiều ngang không xảy ra với giải pháp này.
Michael

2
lineFragmentPaddingkhông có ý định sửa đổi lề. Từ các tài liệu đệm phân đoạn dòng không được thiết kế để thể hiện lề văn bản. Thay vào đó, bạn nên sử dụng các phần tử trên chế độ xem văn bản của mình, điều chỉnh các thuộc tính lề đoạn văn hoặc thay đổi vị trí của chế độ xem văn bản trong phạm vi giám sát của nó.
Martin Berger

256

Cách giải quyết này được viết vào năm 2009 khi iOS 3.0 được phát hành. Nó không còn áp dụng.

Tôi gặp vấn đề chính xác như vậy, cuối cùng tôi đã phải sử dụng

nameField.contentInset = UIEdgeInsetsMake(-4,-8,0,0);

trong đó nameField là a UITextView. Phông chữ tôi tình cờ sử dụng là Helvetica 16 điểm. Đây chỉ là một giải pháp tùy chỉnh cho kích thước trường cụ thể mà tôi đang vẽ. Điều này làm cho phần bù bên trái tuôn ra với bên trái và phần bù trên cùng mà tôi muốn nó cho hộp được vẽ.

Ngoài ra, điều này dường như chỉ áp dụng cho UITextViewsnơi bạn đang sử dụng thuật toán mặc định, tức là.

nameField.textAlignment = NSTextAlignmentLeft;

Căn lề bên phải chẳng hạn và UIEdgeInsetsMakedường như không có tác động gì đến cạnh phải cả.

Ít nhất, sử dụng thuộc tính .contentInset cho phép bạn đặt các trường của mình với các vị trí "chính xác" và điều chỉnh độ lệch mà không bù đắp cho bạn UITextViews.


1
Có, nó hoạt động trong iOS 7. Đảm bảo rằng UIEdgeInset được đặt thành đúng giá trị. Nó có thể khác với UIEdgeInsetsMake (-4, -8,0,0).
app_

15
Trong iOS 7 tôi thấy UIEdgeInsetsMake (0, -4,0, -4) hoạt động tốt nhất.
Racura

2
Vâng, đó là những số ví dụ. Tôi đã nói "Đây chỉ là một giải pháp tùy chỉnh cho kích thước trường cụ thể mà tôi đang vẽ". Chủ yếu tôi đã cố gắng minh họa rằng bạn phải chơi với những con số cho tình huống bố cục độc đáo của bạn.
Michael

3
UITextAlocateLeft không được dùng trong iOS 7. Sử dụng NSTextAlocateLeft.
Jordi Kroon

7
Tôi không hiểu tại sao mọi người đưa ra một câu trả lời sử dụng các giá trị được mã hóa cứng. Nó rất có khả năng phá vỡ trong các phiên bản iOS trong tương lai và chỉ là một ý tưởng tồi.
ldoogy

77

Xây dựng một số câu trả lời hay đã được đưa ra, đây là một giải pháp hoàn toàn dựa trên Storyboard / Interface Builder hoạt động trong iOS 7.0+

Đặt thuộc tính thời gian chạy do người dùng xác định của UITextView cho các khóa sau:

textContainer.lineFragmentPadding
textContainerInset

Trình tạo giao diện


4
Đây rõ ràng là câu trả lời tốt nhất, đặc biệt nếu bạn cần một giải pháp chỉ dành cho XIB
yano

16
Sao chép / dán: textContainer.lineFragmentPadding | textContainerInset
Luca De Angelis

3
Đây là những gì tạo nên một câu trả lời hay - dễ dàng và hoạt động tốt, thậm chí sau 3 năm :)
Shai Mishali

46

Trên iOS 5 UIEdgeInsetsMake(-8,-8,-8,-8);dường như hoạt động rất tốt.


41

Tôi chắc chắn sẽ tránh mọi câu trả lời liên quan đến các giá trị được mã hóa cứng, vì lề thực tế có thể thay đổi với cài đặt kích thước phông chữ của người dùng, v.v.

Đây là câu trả lời của @ user1687195, được viết mà không sửa đổi textContainer.lineFragmentPadding(vì tài liệu nói rằng đây không phải là mục đích sử dụng).

Điều này hoạt động tuyệt vời cho iOS 7 trở lên.

self.textView.textContainerInset = UIEdgeInsetsMake(
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding, 
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding);

Đây thực sự là kết quả tương tự, chỉ cần sạch hơn một chút là nó không sử dụng sai thuộc tính lineFragmentPadding.


Tôi đã thử một giải pháp khác dựa trên câu trả lời này và nó hoạt động rất tốt. Các giải pháp là:self.textView.textContainer.lineFragmentPadding = 0;
Bakyt Abdrasulov

1
@BakytAbdrasulov vui lòng đọc câu trả lời của tôi. Trong khi giải pháp của bạn hoạt động, nó không phù hợp với các tài liệu (xem liên kết trong câu trả lời của tôi). lineFragmentPaddingkhông có nghĩa là để kiểm soát lợi nhuận. Đó là lý do tại sao bạn nên sử dụng textContainerInset.
ldoogy

21

Giải pháp Storyboard hoặc Interface Builder bằng các thuộc tính Runtime do người dùng xác định :

Ảnh chụp màn hình là iOS 7.1 & iOS 6.1 với contentInset = {{-10, -5}, {0, 0}}.

Thuộc tính thời gian chạy do người dùng xác định

đầu ra


1
Làm việc cho tôi trong iOS 7.
kubilay

Chỉ dành cho các thuộc tính thời gian chạy do người dùng xác định - tuyệt vời!
hris.to 15/12/14

16

Tất cả những câu trả lời này đều giải quyết câu hỏi tiêu đề, nhưng tôi muốn đề xuất một số giải pháp cho các vấn đề được trình bày trong phần thân câu hỏi của OP.

Kích thước của nội dung văn bản

Một cách nhanh chóng để tính kích thước của văn bản bên trong UITextViewlà sử dụng NSLayoutManager:

UITextView *textView;
CGSize textSize = [textView usedRectForTextContainer:textView.textContainer].size;

Điều này mang lại tổng số nội dung có thể cuộn, có thể lớn hơn UITextViewkhung của. Tôi thấy điều này chính xác hơn nhiều so với textView.contentSizeviệc nó thực sự tính toán dung lượng văn bản chiếm bao nhiêu. Ví dụ, được cung cấp một sản phẩm nào UITextView:

textView.frame.size = (width=246, height=50)
textSize = (width=10, height=16.701999999999998)
textView.contentSize = (width=246, height=33)
textView.textContainerInset = (top=8, left=0, bottom=8, right=0)

Chiều cao giữa các dòng

UIFontcó một thuộc tính nhanh chóng cho phép bạn có được chiều cao dòng cho phông chữ đã cho. Vì vậy, bạn có thể nhanh chóng tìm thấy chiều cao của văn bản trong UITextView:

UITextView *textView;
CGFloat lineHeight = textView.font.lineHeight;

Tính kích thước văn bản có thể nhìn thấy

Xác định số lượng văn bản thực sự có thể nhìn thấy là rất quan trọng để xử lý hiệu ứng "phân trang". UITextViewcó một thuộc tính được gọi là textContainerInsetthực sự là một lề giữa thực tế UITextView.framevà chính văn bản. Để tính chiều cao thực của khung hiển thị, bạn có thể thực hiện các phép tính sau:

UITextView *textView;
CGFloat textViewHeight = textView.frame.size.height;
UIEdgeInsets textInsets = textView.textContainerInset;
CGFloat textHeight = textViewHeight - textInsets.top - textInsets.bottom;

Xác định kích thước phân trang

Cuối cùng, bây giờ bạn có kích thước văn bản hiển thị và nội dung, bạn có thể nhanh chóng xác định phần bù của mình bằng cách trừ đi textHeighttừ textSize:

// where n is the page number you want
CGFloat pageOffsetY = textSize - textHeight * (n - 1);
textView.contentOffset = CGPointMake(textView.contentOffset.x, pageOffsetY);

// examples
CGFloat page1Offset = 0;
CGFloat page2Offset = textSize - textHeight
CGFloat page3Offset = textSize - textHeight * 2

Sử dụng tất cả các phương pháp này, tôi đã không chạm vào phần trong của mình và tôi đã có thể đi đến dấu mũ hoặc bất cứ nơi nào trong văn bản mà tôi muốn.


12

bạn có thể sử dụng textContainerInsettài sản củaUITextView :

textView.textContainerInset = UIEdgeInsetsMake (10, 10, 10, 10);

(Bên trên, bên trái, bên dưới, bên phải)


1
Tôi tự hỏi tại sao điều này không được chỉ định là câu trả lời tốt nhất ở đây. TextContainerInset thực sự thỏa mãn nhu cầu của tôi.
KoreanXcodeWorker

Cập nhật giá trị dưới cùng trên textContainerInsettài sản không hoạt động đối với tôi khi tôi muốn thay đổi giá trị đó thành giá trị mới, xem stackoverflow.com/questions/19422578/ .
Evan R

@MaggiePhillips Đây không phải là câu trả lời hay nhất vì các giá trị được mã hóa cứng có thể không phải là cách đúng đắn để làm điều này và được đảm bảo sẽ thất bại trong một số trường hợp. Bạn cần đưa lineFragmentPadding vào tài khoản.
ldoogy

11

Đối với iOS 10, dòng sau hoạt động để xóa phần đệm trên cùng và dưới cùng.

captionTextView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)

Xcode 8.2.1. vẫn là vấn đề tương tự như được đề cập trong câu trả lời này. Giải pháp của tôi là chỉnh sửa các giá trị dưới dạng UIEdgeInsets (top: 0, left: -4.0, bottom: 0, right: -4.0).
Darkwonder

UIEdgeInset.zerohoạt động bằng Trình mô phỏng XCode 8.3 và iOS 10.3
Simon Warta

10

Swift mới nhất:

self.textView.textContainerInset = .init(top: -2, left: 0, bottom: 0, right: 0)
self.textView.textContainer.lineFragmentPadding = 0

Câu trả lời chính xác. Câu trả lời này sẽ loại bỏ phần bổ sung hàng đầu. textView.textContainerInset = UIEdgeInsets.zero không xóa 2 pixel khỏi phần trên cùng.
korgx9

10

Đây là một phiên bản cập nhật của câu trả lời rất hữu ích của Fattie. Nó thêm 2 dòng quan trọng giúp tôi có bố cục hoạt động trên iOS 10 và 11 (và có thể cả trên các dòng thấp hơn):

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        translatesAutoresizingMaskIntoConstraints = true
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
        translatesAutoresizingMaskIntoConstraints = false
    }
}

Các dòng quan trọng là hai translatesAutoresizingMaskIntoConstraints = <true/false>tuyên bố!

Điều này đáng ngạc nhiên loại bỏ tất cả các lề trong tất cả các trường hợp của tôi!

Mặc dù textViewđây không phải là phản hồi đầu tiên nhưng có thể xảy ra rằng có một số lề dưới kỳ lạ không thể giải quyết bằng sizeThatFitsphương pháp được đề cập trong câu trả lời được chấp nhận.

Khi gõ vào textView đột nhiên, lề dưới kỳ lạ biến mất và mọi thứ trông giống như vậy, nhưng chỉ ngay khi textView có firstResponder.

Vì vậy, tôi đã đọc ở đây trên SO rằng việc bật và tắt translatesAutoresizingMaskIntoConstraintssẽ giúp ích khi đặt khung / giới hạn theo cách thủ công ở giữa các cuộc gọi.

May mắn là điều này không chỉ hoạt động với cài đặt khung hình mà với 2 dòng setup()kẹp giữa hai translatesAutoresizingMaskIntoConstraintscuộc gọi!

Ví dụ, điều này rất hữu ích khi tính toán khung của chế độ xem bằng cách sử dụng systemLayoutSizeFittingtrên aUIView . Trả lại kích thước chính xác (mà trước đây nó không có)!

Như trong câu trả lời ban đầu đã đề cập:
Đừng quên tắt cuộn Đã bật trong Thanh tra!
Giải pháp đó không hoạt động đúng trong bảng phân cảnh, cũng như trong thời gian chạy.

Thế là xong, giờ bạn đã thực sự hoàn thành!


5

Đối với nhanh 4, Xcode 9

Sử dụng chức năng sau đây có thể thay đổi lề / phần đệm của văn bản trong UITextView

func công khai UIEdgeInsetsMake (_ top: CGFloat, _ left: CGFloat, _ bottom: CGFloat, _ right: CGFloat) -> UIEdgeInsets

vì vậy trong trường hợp này là

 self.textView?.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)

3

Làm giải pháp chèn tôi vẫn có phần đệm ở bên phải và phía dưới. Ngoài ra căn chỉnh văn bản đã gây ra vấn đề. Cách duy nhất chắc chắn mà tôi tìm thấy là đặt chế độ xem văn bản bên trong chế độ xem khác được cắt thành giới hạn.


3

Đây là một tiện ích mở rộng nhỏ dễ dàng sẽ loại bỏ lề mặc định của Apple khỏi mọi chế độ xem văn bản trong ứng dụng của bạn.

Lưu ý: Trình tạo giao diện vẫn sẽ hiển thị lề cũ, nhưng ứng dụng của bạn sẽ hoạt động như mong đợi.

extension UITextView {

   open override func awakeFromNib() {
      super.awakeFromNib();
      removeMargins();
   }

   /** Removes the Apple textview margins. */
   public func removeMargins() {
      self.contentInset = UIEdgeInsetsMake(
         0, -textContainer.lineFragmentPadding,
         0, -textContainer.lineFragmentPadding);
   }
}

1

Đối với tôi (iOS 11 & Xcode 9.4.1), điều làm việc kỳ diệu là thiết lập thuộc tính textView.font UIFont.preferred(forTextStyle:UIFontTextStyle) theo kiểu và cũng là câu trả lời đầu tiên như được đề cập bởi @Fattie. Nhưng câu trả lời @Fattie không hoạt động cho đến khi tôi đặt thuộc tính textView.font khác UITextView tiếp tục hoạt động thất thường.


1

Trong trường hợp bất cứ ai tìm kiếm phiên bản Swift mới nhất thì mã bên dưới đều hoạt động tốt với Xcode 10.2Swift 4.2

yourTextView.textContainerInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

0

Tôi đã tìm thấy một cách tiếp cận khác, nhận chế độ xem với văn bản từ các cuộc phỏng vấn của UITextView và thiết lập nó trong phương thức layoutSubview của một lớp con:

- (void)layoutSubviews {
    [super layoutSubviews];

    const int textViewIndex = 1;
    UIView *textView = [self.subviews objectAtIndex:textViewIndex];
    textView.frame = CGRectMake(
                                 kStatusViewContentOffset,
                                 0.0f,
                                 self.bounds.size.width - (2.0f * kStatusViewContentOffset),
                                 self.bounds.size.height - kStatusViewContentOffset);
}

0

Việc cuộn textView cũng ảnh hưởng đến vị trí của văn bản và làm cho nó trông giống như không được căn giữa theo chiều dọc. Tôi đã quản lý để căn giữa văn bản trong chế độ xem bằng cách vô hiệu hóa cuộn và đặt phần trên cùng thành 0:

    textView.scrollEnabled = NO;
    textView.textContainerInset = UIEdgeInsetsMake(0, textView.textContainerInset.left, textView.textContainerInset.bottom, textView.textContainerInset.right);

Vì một số lý do tôi chưa tìm ra, con trỏ vẫn không được căn giữa trước khi bắt đầu nhập, nhưng trung tâm văn bản ngay lập tức khi tôi bắt đầu nhập.


0

Trong trường hợp bạn muốn đặt chuỗi HTML và tránh phần đệm dưới cùng, vui lòng đảm bảo rằng bạn không sử dụng thẻ khối, ví dụ: div, p.

Trong trường hợp của tôi đây là lý do. Bạn có thể dễ dàng kiểm tra nó bằng cách thay thế các lần xuất hiện của thẻ khối bằng thẻ span.


0

Dành cho SwiftUI

Nếu bạn đang tạo TextView của riêng mình bằng cách sử dụng UIViewRepresentablevà muốn kiểm soát phần đệm, trong makeUIViewchức năng của bạn , chỉ cần thực hiện:

uiTextView.textContainerInset = UIEdgeInsets(top: 10, left: 18, bottom: 0, right: 18)

hoặc bất cứ điều gì bạn muốn.


-4
[firstNameTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.