Bagaimana cara menghilangkan margin / padding di UITextView?


488

Saya punya UITextViewdi Aplikasi iOS saya, yang menampilkan sejumlah besar teks.

Saya kemudian paging teks ini dengan menggunakan parameter margin of the offset UITextView.

Masalah saya adalah bahwa padding UITextViewmembingungkan perhitungan saya karena tampaknya berbeda tergantung pada ukuran font dan jenis huruf yang saya gunakan.

Oleh karena itu, saya mengajukan pertanyaan: Apakah mungkin untuk menghapus lapisan di sekitar konten UITextView?

Nantikan tanggapan Anda!


9
Perhatikan bahwa QA ini hampir sepuluh tahun! Dengan 100.000+ tampilan, karena ini adalah salah satu masalah paling bodoh di iOS . Hanya FTR yang saya masukkan ke dalam saat ini, 2017, solusi yang cukup sederhana / biasa / diterima di bawah ini sebagai jawaban.
Fattie

1
Saya masih mendapatkan pembaruan tentang ini, setelah menulis solusi hardcoded pada tahun 2009 ketika IOS 3.0 baru saja dirilis. Saya baru saja mengedit jawaban untuk menyatakan dengan jelas bahwa itu sudah ketinggalan zaman dan mengabaikan status yang diterima.
Michael

Jawaban:


384

Mutakhir untuk 2019

Ini adalah salah satu bug paling konyol di iOS.

Kelas yang diberikan di sini, UITextViewFixedbiasanya merupakan solusi paling masuk akal secara keseluruhan.

Ini kelasnya:

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

Jangan lupa untuk mematikan scrollEnabled di Inspektur!

  1. Solusinya bekerja dengan baik di storyboard

  2. Solusinya bekerja dengan baik saat runtime

Itu dia, sudah selesai.

Secara umum, itu harus menjadi semua yang Anda butuhkan dalam banyak kasus .

Bahkan jika Anda mengubah ketinggian tampilan teks dengan cepat , UITextViewFixedbiasanya melakukan semua yang Anda butuhkan.

(Contoh umum mengubah ketinggian dengan cepat, mengubahnya sebagai tipe pengguna.)

Ini adalah UITextView dari Apple yang rusak ...

tangkapan layar IB dengan UITextView

Ini adalah UITextViewFixed:

tangkapan layar IB dengan UITextViewFixed

Perhatikan bahwa tentu saja Anda harus

matikan scrollEnabled di Inspektur!

Jangan lupa mematikan scrollEnabled! :)


Beberapa masalah lebih lanjut

(1) Dalam beberapa kasus yang tidak biasa - misalnya, beberapa kasus tabel dengan fleksibel, ketinggian sel yang berubah secara dinamis - Apple melakukan hal yang aneh: Mereka menambah ruang ekstra di bagian bawah . Tidak benar-benar! Ini harus menjadi salah satu hal yang paling menyebalkan di iOS.

Ini adalah "perbaikan cepat" untuk menambahkan hal-hal di atas yang biasanya membantu kegilaan itu.

...
        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) Kadang-kadang, untuk memperbaiki kekacauan Apple yang lain, Anda harus menambahkan ini:

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

(3) Dapat diperdebatkan, kita harus menambahkan:

contentInset = UIEdgeInsets.zero

setelah .lineFragmentPadding = 0di UITextViewFixed.

Namun ... percaya atau tidak ... itu tidak berfungsi di iOS saat ini! (Dicentang pada 2019.) Mungkin perlu menambahkan baris itu di masa mendatang.

Fakta yang UITextViewrusak di iOS adalah salah satu hal paling aneh di semua komputasi mobile. Sepuluh tahun ulang tahun pertanyaan ini dan masih belum diperbaiki!

Akhirnya, inilah tip yang agak mirip untuk Bidang Teks : https://stackoverflow.com/a/43099816/294884

Tip yang sepenuhnya acak: bagaimana cara menambahkan "..." di bagian akhir

Seringkali Anda menggunakan UITextView "like a UILabel". Jadi Anda ingin memotong teks menggunakan elipsis "..."

Jika demikian, tambahkan baris kode ketiga di "pengaturan":

 textContainer.lineBreakMode = .byTruncatingTail

Tip berguna jika Anda ingin tinggi nol, padahal tidak ada teks sama sekali

Seringkali Anda menggunakan tampilan teks untuk hanya menampilkan teks. Jadi, pengguna tidak dapat mengedit apa pun. Anda menggunakan baris "0" yang berarti tampilan teks akan secara otomatis mengubah ketinggian tergantung pada berapa banyak baris teks.

Itu bagus, tetapi jika tidak ada teks sama sekali maka sayangnya Anda mendapatkan ketinggian yang sama seperti jika ada satu baris teks !! Tampilan teks tidak pernah "hilang".

masukkan deskripsi gambar di sini

Jika Anda ingin "pergi", tambahkan saja ini

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
}

masukkan deskripsi gambar di sini

(Saya membuatnya '1' jadi jelas apa yang terjadi, '0' baik-baik saja.)

Bagaimana dengan UILabel?

Saat hanya menampilkan teks, UILabel memiliki banyak keunggulan dibandingkan UITextView. UILabel tidak mengalami masalah yang dijelaskan pada halaman QA ini. Memang alasan kita semua biasanya "menyerah" dan hanya menggunakan UITextView adalah bahwa UILabel sulit untuk dikerjakan. Khususnya sangat sulit untuk hanya menambahkan padding , dengan benar, ke UILabel. Sebenarnya di sini adalah diskusi lengkap tentang bagaimana "akhirnya" menambahkan padding dengan benar ke UILabel: https://stackoverflow.com/a/58876988/294884 Dalam beberapa kasus jika Anda melakukan tata letak yang sulit dengan sel ketinggian dinamis, kadang-kadang lebih baik melakukannya dengan cara yang sulit dengan UILabel.


1
saya lakukan self.textView.isScrollEnabled = falsedi dalam viewDidLayoutSubviews()dan itu berhasil juga. Apple hanya suka membuat kita melompat melalui lingkaran :)
AnBisw

1
Solusi terbaik untuk memperbaiki semua bug UitextView absurd autolayout pada Sel, Header, dan Footer UITableView saya dengan ketinggian dinamis (UITableViewAutomaticDimension). Bagus!
Peter Kreinz

1
Saya telah memposting jawaban yang diperbarui untuk jawaban @ Fattie yang membantu saya untuk benar-benar menyingkirkan semua inset menggunakan trik khusus untuk mengaktifkan / menonaktifkan translatesAutoresizingMaskIntoConstraints. Dengan jawaban ini saja saya tidak dapat menghapus semua margin (beberapa margin bawah aneh menolak untuk pergi) dalam hierarki tampilan menggunakan tata letak otomatis. Ini juga berkaitan dengan perhitungan ukuran tampilan menggunakan systemLayoutSizeFitting, yang sebelumnya mengembalikan ukuran tidak valid karena keretaUITextView
Fab1n

1
1up untuk IBDesignable. Saya akan mendukung teks tempat
penampung yang

1
Saya memiliki tampilan teks dalam tabel, yang memiliki satu baris teks tidak menghitung ketinggiannya dengan benar (autolayout). Untuk memperbaikinya saya harus mengganti didMoveToSuperview dan memanggil pengaturan di sana juga.
El Horrible

792

Untuk iOS 7.0, saya telah menemukan bahwa trik contentInset tidak lagi berfungsi. Ini adalah kode yang saya gunakan untuk menghilangkan margin / padding di iOS 7.

Ini membawa tepi kiri teks ke tepi kiri wadah:

textView.textContainer.lineFragmentPadding = 0

Ini menyebabkan bagian atas teks sejajar dengan bagian atas wadah

textView.textContainerInset = .zero

Kedua Lines diperlukan untuk menghapus margin / padding sepenuhnya.


2
Ini berfungsi untuk saya untuk dua baris, tetapi pada saat saya sampai 5 baris, teks terputus.
livings124

7
Perhatikan bahwa baris kedua juga dapat ditulis sebagai: self.descriptionTextView.textContainerInset = UIEdgeInsetsZero;
jessepinho

19
Pengaturan lineFragmentPaddingke 0 adalah keajaiban yang saya cari. Saya tidak tahu mengapa Apple membuatnya sangat sulit untuk mengatur konten UITextView dengan kontrol lain.
phatmann

3
Ini jawaban yang benar. Menggulir secara horizontal tidak terjadi dengan solusi ini.
Michael

2
lineFragmentPaddingtidak dimaksudkan untuk memodifikasi margin. Dari dokumen Line fragment padding tidak dirancang untuk mengekspresikan margin teks. Sebagai gantinya, Anda harus menggunakan insets pada tampilan teks Anda, menyesuaikan atribut margin paragraf, atau mengubah posisi tampilan teks dalam superview-nya.
Martin Berger

256

Solusi ini ditulis pada tahun 2009 ketika IOS 3.0 dirilis. Itu tidak berlaku lagi.

Saya mengalami masalah yang sama persis, pada akhirnya saya harus menggunakan

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

dimana nameField adalah a UITextView. Font yang kebetulan saya gunakan adalah Helvetica 16 point. Ini hanya solusi khusus untuk ukuran bidang tertentu yang saya gambar. Ini membuat offset kiri rata dengan sisi kiri, dan offset atas di mana saya inginkan untuk kotaknya.

Selain itu, ini sepertinya hanya berlaku untuk UITextViewstempat Anda menggunakan aligment default, yaitu.

nameField.textAlignment = NSTextAlignmentLeft;

Menyelaraskan ke kanan misalnya dan UIEdgeInsetsMaketampaknya tidak berdampak sama sekali di tepi kanan.

Paling tidak, menggunakan properti .contentInset memungkinkan Anda untuk menempatkan bidang Anda dengan posisi "benar", dan mengakomodasi penyimpangan tanpa mengimbangi Anda UITextViews.


1
Ya itu berfungsi di iOS 7. Pastikan UIEdgeInset diatur ke nilai yang benar. Mungkin berbeda dari UIEdgeInsetsMake (-4, -8,0,0).
app_

15
Di iOS 7 saya menemukan UIEdgeInsetsMake (0, -4,0, -4) bekerja paling baik.
Racura

2
Ya, itu adalah contoh nomor. Saya menyatakan "Ini hanya solusi khusus untuk ukuran bidang tertentu yang saya gambar". Terutama saya mencoba menggambarkan bahwa Anda harus bermain dengan angka untuk situasi tata letak unik Anda.
Michael

3
UITextAlignmentLeft sudah tidak digunakan lagi di iOS 7. Gunakan NSTextAlignmentLeft.
Jordi Kroon

7
Saya tidak mengerti mengapa orang memilih jawaban yang menggunakan nilai-nilai hard-coded. Sangat SANGAT rusak di versi iOS masa depan dan hanya ide buruk.
ldoogy

77

Membangun dari beberapa jawaban bagus yang sudah diberikan, berikut ini adalah murni solusi berbasis Storyboard / Interface Builder yang bekerja di iOS 7.0+

Atur Atribut Runtime yang Ditentukan Pengguna UITextView untuk kunci berikut:

textContainer.lineFragmentPadding
textContainerInset

Pembuat Antarmuka


4
Ini jelas jawaban terbaik, terutama jika Anda membutuhkan solusi XIB-satunya
yano

16
Salin / tempel: textContainer.lineFragmentPadding | textContainerInset
Luca De Angelis

3
Inilah yang membuat jawaban yang indah - mudah dan bekerja dengan baik, bahkan setelah 3 tahun :)
Shai Mishali


41

Saya pasti akan menghindari jawaban yang melibatkan nilai-nilai kode-keras, karena margin yang sebenarnya dapat berubah dengan pengaturan ukuran font pengguna, dll.

Inilah jawaban @ user1687195, ditulis tanpa mengubah textContainer.lineFragmentPadding(karena dokumen menyatakan ini bukan penggunaan yang dimaksudkan).

Ini berfungsi baik untuk iOS 7 dan yang lebih baru.

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

Ini secara efektif hasil yang sama, hanya sedikit lebih bersih karena tidak menyalahgunakan properti lineFragmentPadding.


Saya mencoba solusi lain berdasarkan jawaban ini dan itu berhasil. Solusinya adalah:self.textView.textContainer.lineFragmentPadding = 0;
Bakyt Abdrasulov

1
@ BakytAbdrasulov tolong baca jawaban saya. Sementara solusi Anda berfungsi, itu tidak sesuai dengan dokumen (lihat tautan di jawaban saya). lineFragmentPaddingtidak dimaksudkan untuk mengontrol margin. Itu sebabnya Anda seharusnya menggunakannya textContainerInset.
Ldoogy

21

Solusi Storyboard atau Pembangun Antarmuka menggunakan Atribut Runtime yang Ditentukan Pengguna :

Tangkapan layar adalah dari iOS 7.1 & iOS 6.1 dengan contentInset = {{-10, -5}, {0, 0}}.

Atribut Runtime Buatan Pengguna

keluaran


1
Bekerja untuk saya di iOS 7.
kubilay

Hanya untuk atribut runtime yang ditentukan pengguna - keren!
hris.to

16

Semua jawaban ini membahas pertanyaan judul, tetapi saya ingin mengusulkan beberapa solusi untuk masalah yang disajikan dalam tubuh pertanyaan OP.

Ukuran Konten Teks

Cara cepat untuk menghitung ukuran teks di dalamnya UITextViewadalah dengan menggunakan NSLayoutManager:

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

Ini memberikan total konten yang dapat digulir, yang mungkin lebih besar dari UITextViewbingkai. Saya menemukan ini jauh lebih akurat daripada textView.contentSizekarena itu benar-benar menghitung berapa banyak ruang teks. Misalnya, diberi yang kosong 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)

Tinggi garis

UIFontmemiliki properti yang dengan cepat memungkinkan Anda untuk mendapatkan ketinggian garis untuk font yang diberikan. Sehingga Anda dapat dengan cepat menemukan ketinggian baris teks di Anda UITextViewdengan:

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

Menghitung Ukuran Teks yang Terlihat

Menentukan jumlah teks yang benar-benar terlihat penting untuk menangani efek "paging". UITextViewmemiliki properti yang disebut textContainerInsetyang sebenarnya merupakan margin antara aktual UITextView.framedan teks itu sendiri. Untuk menghitung ketinggian sebenarnya dari bingkai yang terlihat, Anda dapat melakukan perhitungan berikut:

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

Menentukan Ukuran Paging

Terakhir, sekarang setelah Anda memiliki ukuran teks dan konten yang terlihat, Anda dapat dengan cepat menentukan apa yang seharusnya menjadi offset Anda dengan mengurangi textHeightdari 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

Dengan menggunakan semua metode ini, saya tidak menyentuh insets saya dan saya dapat pergi ke tanda sisipan atau di mana pun dalam teks yang saya inginkan.


12

Anda dapat menggunakan textContainerInsetproperti dari UITextView:

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

(atas, kiri, bawah, kanan)


1
Saya bertanya-tanya mengapa ini tidak ditugaskan sebagai jawaban terbaik di sini. TextContainerInset benar-benar memuaskan kebutuhan saya.
KoreanXcodeWorker

Memperbarui nilai bawah pada textContainerInsetproperti tidak berfungsi untuk saya ketika saya ingin mengubahnya ke nilai baru — lihat stackoverflow.com/questions/19422578/… .
Evan R

@MaggiePhillips Ini bukan jawaban terbaik karena nilai-nilai yang dikodekan tidak mungkin menjadi cara yang tepat untuk melakukan ini, dan dijamin gagal dalam beberapa kasus. Anda perlu mempertimbangkan lineFragmentPadding.
ldoogy

11

Untuk iOS 10, baris berikut berfungsi untuk menghapus lapisan atas dan bawah.

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

Xcode 8.2.1. masih masalah yang sama seperti yang disebutkan dalam jawaban ini. Solusi saya adalah mengedit nilai sebagai UIEdgeInsets (atas: 0, kiri: -4.0, bawah: 0, kanan: -4.0).
Darkwonder

UIEdgeInset.zerobekerja menggunakan XCode 8.3 dan iOS 10.3 Simulator
Simon Warta

10

Swift terbaru:

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

Jawaban yang bagus Jawaban ini menghapus inset Top tambahan. textView.textContainerInset = UIEdgeInsets.zero tidak menghapus 2 piksel dari inset atas.
korgx9

10

Ini adalah versi terbaru dari jawaban Fattie yang sangat membantu. Itu menambahkan 2 baris penting yang membantu saya membuat tata letak berfungsi pada iOS 10 dan 11 (dan mungkin juga pada yang lebih rendah):

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

Garis yang penting adalah dua translatesAutoresizingMaskIntoConstraints = <true/false>pernyataan!

Ini secara mengejutkan menghapus semua margin dalam semua keadaan saya!

Meskipun textViewbukan responden pertama, bisa saja terjadi bahwa ada beberapa margin bawah yang aneh yang tidak dapat diselesaikan dengan menggunakan sizeThatFitsmetode yang disebutkan dalam jawaban yang diterima.

Ketika mengetuk textView tiba-tiba margin bawah aneh menghilang dan semuanya tampak seperti seharusnya, tetapi hanya segera setelah textView didapat firstResponder.

Jadi saya baca di sini di SO bahwa mengaktifkan dan menonaktifkan translatesAutoresizingMaskIntoConstraintstidak membantu ketika mengatur frame / batas secara manual di antara panggilan.

Untungnya ini tidak hanya bekerja dengan pengaturan bingkai tetapi dengan 2 garis setup()terjepit di antara dua translatesAutoresizingMaskIntoConstraintspanggilan!

Ini misalnya sangat membantu ketika menghitung bingkai tampilan menggunakan systemLayoutSizeFittingpada aUIView . Memberikan ukuran yang benar (yang sebelumnya tidak)!

Seperti dalam jawaban asli yang disebutkan:
Jangan lupa mematikan scrollEnabled di Inspektur!
Solusi itu tidak berfungsi dengan baik di storyboard, serta saat runtime.

Itu saja, sekarang Anda benar-benar selesai!


5

Untuk swift 4, Xcode 9

Gunakan fungsi berikut ini dapat mengubah margin / padding teks di UITextView

func publik UIEdgeInsetsMake (_ atas: CGFloat, _ kiri: CGFloat, _ bawah: CGFloat, _ kanan: CGFloat) -> UIEdgeInsets

jadi dalam hal ini adalah

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

3

Melakukan solusi inset saya masih memiliki bantalan di sisi kanan dan bawah. Penyelarasan teks juga menyebabkan masalah. Satu-satunya cara pasti yang saya temukan adalah menempatkan tampilan teks di dalam tampilan lain yang terpotong menjadi batas.


3

Berikut ini adalah sedikit ekstensi mudah yang akan menghapus margin default Apple dari setiap tampilan teks di aplikasi Anda.

Catatan: Pembuat Antarmuka masih akan menunjukkan margin lama, tetapi aplikasi Anda akan berfungsi seperti yang diharapkan.

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

Bagi saya (iOS 11 & Xcode 9.4.1) yang berfungsi secara ajaib adalah mengatur properti textView.font sesuai UIFont.preferred(forTextStyle:UIFontTextStyle) gaya dan juga jawaban pertama yang disebutkan oleh @Fattie. Tapi jawaban @Fattie tidak berfungsi sampai saya mengatur properti textView.font yang lain UITextView terus bersikap tidak menentu.


1

Jika ada orang yang mencari versi Swift terbaru maka kode di bawah ini berfungsi dengan baik dengan Xcode 10.2 dan Swift 4.2

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

0

Saya telah menemukan satu pendekatan lagi, mendapatkan tampilan dengan teks dari subview UITextView dan mengaturnya dalam metode layoutSubview dari subclass:

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

Pengguliran textView juga mempengaruhi posisi teks dan membuatnya tampak seperti tidak terpusat secara vertikal. Saya berhasil memusatkan teks dalam tampilan dengan menonaktifkan gulir dan mengatur inset atas ke 0:

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

Untuk beberapa alasan saya belum mengetahuinya, kursor masih belum terpusat sebelum pengetikan dimulai, tetapi pusat teks segera saat saya mulai mengetik.


0

Jika Anda ingin mengatur string HTML dan menghindari bantalan bawah, pastikan Anda tidak menggunakan tag blok yaitu div, hal.

Dalam kasus saya ini adalah alasannya. Anda dapat dengan mudah mengujinya dengan mengganti kemunculan tag blok dengan tag span.


0

Untuk SwiftUI

Jika Anda membuat TextView sendiri menggunakan UIViewRepresentabledan ingin mengontrol padding, dalam makeUIViewfungsi Anda , cukup lakukan:

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

atau apapun yang kamu mau.


-4
[firstNameTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.