UITextView-də margin / padding itirmək necə?

UITextView böyük bir hissəsini göstərən iOS proqramımda bir UITextView var. Daha sonra bu mətni UITextView marjının UITextView istifadə edərək UITextView . Mənim problemim, UITextView doldurulması mənim hesablarımı qarışdırır, çünki onlar font ölçüsünə və istifadə etdiyim UITextView görə fərqlənirlər.

Buna görə də soruşuram: UITextView in məzmununu əhatə edən əlavə çıxarma mümkündürmü?

Cavabınızı gözləyirik!

417
14 апр. set sniurkst 14 apr. 2009-04-14 10:42 '09 da 10:42 'da 2009-04-14 10:42
@ 1 cavab

2019-cu ilə qədər bu günə qədər

Bu, iOS-un ən axmaq səhvlərindən biridir.

UITextViewFixed sinfi adətən ağıllı bir həlldir.

İşdə sinif:

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

Müfəttişdə scrollEnabled funksiyasını aradan götürməyi unutmayın!

  1. Həll metodunda düzgün işləyir.

  2. Həll müddətində düzgün işləyir.

Budur, bunu etdiniz.

Ümumiyyətlə, bu, əksər hallarda sizə lazım olan bütün olmalıdır .

Mətn görünüşünün hündürlüyünü tez bir şəkildə dəyişdirdiyiniz halda, adətən lazım olan hər şeyi edir.

(Tezlikdə hündürlüyü dəyişməsinin tipik bir nümunəsi istifadəçi növü ilə dəyişdirməkdir).

İşdə Apple'ın broken UITextView ...

2019

237
20 февр. Cavab Fattie tərəfindən verildi. 2017-02-20 01:45 '17 'də 1:45' də 2017-02-20 01:45 'də

İOS 7.0 üçün contentInset trick artıq işləmədiyini gördüm. Bu, iOS 7-də sahəsində / add-ondən xilas olmaq üçün istifadə etdiyim koddur.

Mətnin sol tərəfini konteynerin sol kənarına gətirir:

 textView.textContainer.lineFragmentPadding = 0 

Bu konteynerin üstü ilə mətnin yuxarı hissəsini hizalanacaq.

 textView.textContainerInset = .zero 

Hər iki xətt sahəni / dolumu tamamilə silmək üçün tələb olunur.

746
24 сент. Cavab 24 sentyabr user1687195 tərəfindən verilir 2013-09-24 20:05 '13 saat 20:05 'da 2013-09-24 20:05

Bu həlli 2009-cu ildə iOS 3.0-in buraxıldığı zaman yazılmışdır. Artıq tətbiq edilmir.

Eyni problemə qaçdım, sonunda istifadə etməyi bitirdim

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

burada nameField bir UITextView . Istifadə etdiyim yazı Helvetica 16 bal idi. Bu çəkdiyim bir sahənin ölçüsü üçün yalnız xüsusi həlldir. Bu, soldan ofsetin sol tərəfi və yuxarı ofsetin yerləşdirilməsini istəmişəm.

Bundan əlavə, yalnız UITextViews tətbiq olunur, burada siz default qayda istifadə edirsiniz.

 nameField.textAlignment = NSTextAlignmentLeft; 

Məsələn, UIEdgeInsetsMakeUIEdgeInsetsMake heç də sağ kənarını təsir etmir.

Ən azından, .contentInset xüsusiyyətindən istifadə edərək sahələri "düzgün" mövqelərlə yerləşdirmək və UITextViews kompensasiya etmədən sapma hesabına imkan verir.

250
26 июля '09 в 21:59 2009-07-26 21:59 Cavab Maykl tərəfindən 26 iyul 2009-cu il tarixdə 21: 59-da verilmişdir

Artıq qəbul edilmiş yaxşı cavablara əsaslanaraq burada İstifadəçi Tanımlı Runtime və iOS 7.0 + -də işləyən xüsusiyyətləri istifadə edən tamamilə interfeys əsaslı Builder həlli:

2019

68
04 февр. Cavab azdev tərəfindən 04 fevralda verilir. 2015-02-04 03:58 '15 at 03:58 2015-02-04 03:58

İOS 5-də, UIEdgeInsetsMake(-8,-8,-8,-8); yaxşı iş görürük.

44
08 мая '12 в 15:36 2012-05-08 15:36 cavabına Engin Kurutepe verilir May 08 '12 at 15:36 2012-05-08 15:36

Qəti kodlu dəyərlərə aid cavablardan qətiyyətlə çəkinərəm, çünki faktiki marjinlər istifadəçi yazı tipi ölçüsü parametrləri ilə fərqlənə bilər.

TextContainer.lineFragmentPadding dəyişdirilmədən yazılmış @ user1687195 cavabını textContainer.lineFragmentPadding ( sənədlər bu istifadə üçün nəzərdə tutulmadığını göstərir).

Bu iOS 7 və daha sonra üçün böyük işləyir.

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

Bu, həqiqətən, eyni nəticədir, yalnız bir az təmiz, çünki lineFragmentPadding əmlakını sui-istifadə etmir.

39
24 апр. cavab 24 aprel ldoogy tərəfindən verilir 2016-04-24 21:36 '16 saat 09:36 'da 2016-04-24 21:36

Xüsusi işləmə müddəti istifadə edərək, storyboard və ya interface həll. Yeniləmə. İOS7.1 və iOS6.1-in ekrandan əlavə contentInset = {{-10, -5}, {0, 0}} 2019

18
05 сент. Cavab Uladzimir verilir 05 Sep. 2013-09-05 12:02 '13 'da 12:02' də 2013-09-05 12:02

Bu cavabların hamısı başlıq sualına təsir edir, amma OP sorğusunda təqdim olunan problemlər üçün bəzi həllər təklif etmək istərdim.

Mətnin məzmun ölçüsü

Bir UITextView daxilində mətn ölçüsünü hesablamaq üçün sürətli bir yol UITextView istifadə NSLayoutManager :

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

Bu, bir UITextView çərçivəsindən daha böyük ola biləcək tam kaydırılabilir məzmunu verir. textView.contentSize nə qədər məkanı textView.contentSize , çünki bu, textView.contentSize dən çox daha dəqiq textView.contentSize . Məsələn, boş bir 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) 

Line hündürlüyü

UIFont , bir yazı tipi üçün satırın hündürlüyünü tez bir zamanda əldə etməyə imkan verən bir xüsusiyyətə malikdir. Buna görə, bir mətn xəttinin hündürlüyü UITextView istifadə edərək tez bir zamanda tapa bilərsiniz:

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

Görünən mətn ölçüsünü hesablamaq

Görünən mətnin məbləğini müəyyənləşdirmək, paging effekti idarə etmək üçün vacibdir. UITextView , həqiqətən gerçək UITextView.frame və mətnin özü arasında olan fərq olan UITextView xüsusiyyətinə malikdir. Görünən çərçivənin faktiki hündürlüyünü hesablamaq üçün aşağıdakı hesablamaları yerinə yetirə bilərsiniz:

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

Çağırmanın ölçüsünü müəyyənləşdirmək

Son olaraq, görünən mətn ölçüsü və məzmununuz textHeight görə, textSize textHeight asılı textSize textHeight nə olduğunu müəyyən edə bilərsinizSize:

 // 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 

Bütün bu üsulları istifadə edərək, mənim əlavələrimə toxunmadılar və istədiyim mətndə daşıyıcıya və ya istənilən yerdə gedə bildilər.

15
26 июня '15 в 18:31 2015-06-26 18:31 Cavab mikeho tərəfindən 26 iyun 'da 18:31' də verilir 2015-06-26 18:31

textContainerInset UITextView əmlakını istifadə edə bilərsiniz:

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

(yuxarı, sol, alt, sağ)

11
05 мая '15 в 8:24 2015-05-05 08:24 Himanşu padiya tərəfindən 05.05.2014 tarixində cavab 08:24 AM 2015-05-05 08:24

İOS 10 üçün yuxarı və aşağı girintiləri aradan qaldırmaq üçün aşağıdakı xətt çalışır.

 captionTextView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0) 
8
12 окт. Anson Yao tərəfindən 12 oktyabrda verilən cavab 2016-10-12 09:38 '16 saat 09:38 'da 2016-10-12 09:38' a qədər

Fattie'nin çox faydalı bir cavabının yenilənmiş versiyası. O, iOS 10 və 11-də (və yəqin ki, aşağı) mükəmməl layout işləməyimə kömək edən 2 çox vacib xətt əlavə edir.
d

5
14 февр. Cavab Fab1n 14 fevralda verilir. 2018-02-14 17:37 '18 saat 17:37 'də 2018-02-14 17:37

Sürətli 4, Xcode 9 üçün

UITextView-də mətn sahəsini / padding dəyişdirmək üçün aşağıdakı funksiyanı istifadə edin

public func UIEdgeInsetsMake (_ üst: CGFloat, sol: CGFloat, alt: CGFloat, sağ: CGFloat) → UIEdgeInsets

bu halda

  self.textView?.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0) 
3
26 окт. Cavab 26 oktyabrda Şan Ye'ye verildi 2017-10-26 19:54 '17 də 19:54 2017-10-26 19:54

Başvurunuzdaki hər bir mətn görünümünden varsayılan Apple markerini kaldıracak kiçik bir kiçik uzantı.

Qeyd Builder interfeysi hələ də köhnə margin göstərəcək, ancaq tətbiqiniz gözlənildiyi kimi işləyəcək.

 extension UITextView { open override func awakeFromNib() { super.awakeFromNib(); removeMargins(); }  public func removeMargins() { self.contentInset = UIEdgeInsetsMake( 0, -textContainer.lineFragmentPadding, 0, -textContainer.lineFragmentPadding); } } 
2
04 марта '18 в 3:19 2018-03-04 03:19 cavab 04/08 '18 'də saat 15:19' də Cal S tərəfindən verilir. 2018-03-04 03:19

Son sürət

self.textView.textContainerInset = .init (üst: -2, sol: 0, aşağı: 0, sağ: 0) self.textView.textContainer.lineFragmentPadding = 0

2
24 мая '18 в 10:54 2018-05-24 10:54 Cavab Urvish Modi tərəfindən 24 may 1818 tarixində 10:54 2018-05-24 10:54 tarixində verilir

Daxili həllinin icrası hələ də sağ və altındakı bir conta idi. Mətnin hizalanması da problem yaratdı. Mən tapdığım yanğının yeganə əmin yolu mətni, sərhədlərə kəsilmiş bir başqa görünüşə qoymaq idi.

2
01 апр. cavab rp90 01 apr verilir . 2011-04-01 02:49 '11 at 2:49 2011-04-01 02:49

UIFont.preferred(forTextStyle:UIFontTextStyle) üçün UIFont.preferred(forTextStyle:UIFontTextStyle) xüsusiyyətinin UIFont.preferred(forTextStyle:UIFontTextStyle) yaradılması və mənim üçün (iOS 11 və Xcode 9.4.1), həmçinin @Fattie tərəfindən göstərilən ilk cavab sehrli şəkildə işləmişdir. Amma @Fattie cavab textView.font mülkiyyətini təyin etməmişəm, əks halda UITextView düzgün işləməyə davam edir.

0
17 июня '18 в 14:20 2018-06-17 14:20 Cavab Nikhil Pandey tərəfindən 17 İyun 18: 18-20 : 2018-06-17 14:20 tarixində verilir

Keçid textView həmçinin mətnin mövqeyini təsir edir və onu şaquli mərkəzləşmə kimi görünür. Menyu kaydırmayı söndürerek ve üst eklemeyi 0 olaraq ayarlayarak görünüşteki metnin merkezini yönetebildim:

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

Nədənsə hələ də başa düşmürəm ki, kursor hələ girişin başlamasından əvvəl mərkəzləşdirilmir, lakin mətn dərhal girişin başlanğıcından başlayır.

-1
25 дек. cavab verildi Alex 25 Dekabr 2016-12-25 22:37 '16 saat 10:37 'da 2016-12-25 22:37

UITextView alt proyektlərindən mətn ilə bir görünüş əldə edərək, başqa bir yanaşma tapdım və alt sinif üçün layoutSubview metodunda yerləşdirdilər:

 - (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); } 
-1
28 февр. Cavab Nikita 28 feb. 2013-02-28 13:17 '13 'da 13:17 2013-02-28 13:17
 [firstNameTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter]; 
-4
12 авг. Cavab0nice4eva 12 avqust verilir . 2011-08-12 00:48 '11 'də 0:48' da 2011-08-12 00:48

bağlı digər suallar və ya bir sual