Jak stracić margines / wypełnienie w UITextView?


486

Mam UITextVieww mojej aplikacji na iOS, która wyświetla dużą ilość tekstu.

Następnie stronicuję ten tekst za pomocą parametru marginesu przesunięcia parametru UITextView.

Mój problem polega na tym, że wypełnienie UITextViewpomieszało moje obliczenia, ponieważ wydaje się być różne w zależności od rozmiaru czcionki i kroju pisma, którego używam.

Dlatego zadaję pytanie: Czy można usunąć wypełnienie otaczające zawartość UITextView?

Czekamy na Wasze odpowiedzi!


9
Pamiętaj, że ta kontrola jakości ma prawie dziesięć lat! Ponad 100 000 wyświetleń, ponieważ jest to jeden z najgłupszych problemów w iOS . Po prostu FTR poniżej włączyłem poniższe, dość proste / zwykłe / zaakceptowane rozwiązanie poniżej.
Fattie

1
Nadal otrzymuję aktualizacje na ten temat, po tym jak napisałem na stałe obejście w 2009 roku, kiedy właśnie został wydany IOS 3.0. Właśnie zredagowałem odpowiedź, aby jasno stwierdzić, że lata są nieaktualne i zignorować zaakceptowany status.
Michael

Odpowiedzi:


383

Aktualizacja na 2019 rok

Jest to jeden z najgłupszych błędów w systemie iOS.

Podana tutaj klasa UITextViewFixedjest ogólnie najbardziej rozsądnym rozwiązaniem.

Oto klasa:

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

Nie zapomnij wyłączyć przewijania w Inspektorze!

  1. Rozwiązanie działa poprawnie w serii ujęć

  2. Rozwiązanie działa poprawnie w czasie wykonywania

To już koniec.

Zasadniczo powinno to być wszystko, czego potrzebujesz w większości przypadków .

Nawet jeśli zmieniasz wysokość widoku tekstowego w locie , UITextViewFixedzwykle robi wszystko, czego potrzebujesz.

(Typowym przykładem zmiany wysokości w locie jest zmiana jej w zależności od typu użytkownika.)

Oto zepsuty UITextView od Apple ...

zrzut ekranu IB z UITextView

Oto UITextViewFixed:

zrzut ekranu IB z UITextViewFixed

Pamiętaj, że oczywiście musisz

wyłącz scroll Przewiń w Inspektorze!

Nie zapomnij wyłączyć scrollEnabled! :)


Kilka dalszych problemów

(1) W niektórych nietypowych przypadkach - na przykład w niektórych tabelach z elastycznymi, dynamicznie zmieniającymi się wysokościami komórek - Apple robi dziwną rzecz: dodaje dodatkową przestrzeń u dołu . Nie naprawdę! To musiałaby być jedna z najbardziej irytujących rzeczy w iOS.

Oto „szybka poprawka” do dodania do powyższego, która zwykle pomaga w tym szaleństwie.

...
        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) Czasami, aby naprawić kolejny subtelny bałagan Apple, musisz dodać:

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

(3) Prawdopodobnie powinniśmy dodać:

contentInset = UIEdgeInsets.zero

po prostu .lineFragmentPadding = 0w UITextViewFixed.

Jednak ... wierzcie lub nie ... to po prostu nie działa w obecnym iOS! (Sprawdzone w 2019 r.) Może być konieczne dodanie tej linii w przyszłości.

Fakt, że UITextViewjest uszkodzony w iOS jest jednym z najdziwniejszych rzeczy na wszystkich komputerów przenośnych. Dziesięciolecie tego pytania i wciąż nie jest ustalone!

Wreszcie, jest nieco podobna wskazówka dla pola tekstowego : https://stackoverflow.com/a/43099816/294884

Zupełnie losowa wskazówka: jak dodać „...” na końcu

Często używasz UITextView „jak UILabel”. Więc chcesz, aby obcinał tekst za pomocą wielokropka „...”

Jeśli tak, dodaj trzeci wiersz kodu w „setup”:

 textContainer.lineBreakMode = .byTruncatingTail

Przydatna wskazówka, jeśli chcesz mieć zerową wysokość, kiedy nie ma w ogóle tekstu

Często używasz widoku tekstu tylko do wyświetlania tekstu. Tak więc użytkownik nie może tak naprawdę niczego edytować. Używasz linii „0”, co oznacza, że ​​widok tekstu automatycznie zmieni wysokość w zależności od liczby linii tekstu.

To świetnie, ale jeśli w ogóle nie ma tekstu, to niestety otrzymujesz taką samą wysokość, jakby był jeden wiersz tekstu !! Widok tekstu nigdy nie „znika”.

wprowadź opis zdjęcia tutaj

Jeśli chcesz, aby „zniknął”, po prostu dodaj to

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
}

wprowadź opis zdjęcia tutaj

(Zrobiłem to „1”, więc jasne jest, co się dzieje, „0” jest w porządku.)

Co z UILabel?

Podczas wyświetlania tekstu UILabel ma wiele zalet w porównaniu z UITextView. UILabel nie cierpi z powodu problemów opisanych na tej stronie kontroli jakości. Rzeczywiście powodem, dla którego wszyscy zwykle „poddajemy się” i używamy UITextView jest fakt, że UILabel jest trudny w obsłudze. W szczególności absurdalnie trudno jest po prostu poprawnie dodać wypełnienie do UILabel. W rzeczywistości tutaj jest pełna dyskusja na temat tego, jak „w końcu” poprawnie dodać dopełnienie do UILabel: https://stackoverflow.com/a/58876988/294884 W niektórych przypadkach, jeśli robisz trudny układ z dynamicznymi komórkami wysokości, czasami jest to lepiej zrobić to na poważnie dzięki UILabel.


1
Zrobiłem w self.textView.isScrollEnabled = falseśrodku viewDidLayoutSubviews()i to też zadziałało. Apple po prostu lubi zmuszać nas do przeskakiwania przez obręcze :)
AnBisw

1
Najlepsze rozwiązanie, aby naprawić wszystkie moje absurdalne błędy autoukładu UITextView w komórkach, nagłówku i stopce UITableView z dynamiczną wysokością (UITableViewAutomaticDimension). Świetny!
Peter Kreinz,

1
Opublikowałem zaktualizowaną odpowiedź na odpowiedź @ Fattie, która pomogła mi naprawdę pozbyć się wszystkich wstawek za pomocą specjalnej sztuczki włączania / wyłączania translatesAutoresizingMaskIntoConstraints. Tylko z tą odpowiedzią nie byłem w stanie usunąć wszystkich marginesów (niektóre dziwne dolne marginesy nie chciały zniknąć) w hierarchii widoków przy użyciu automatycznego układu. Zajmuje się również obliczaniem rozmiarów widoków systemLayoutSizeFitting, które wcześniej UITextView
zwracały

1
1 do IBDesignable. Głosowałbym również za bardzo dobrze dobranym tekstem zastępcy miejsca, gdybym tylko mógł
Toastor

1
Miałem widoki tekstów w tabeli, które miały pojedynczy wiersz tekstu, nie obliczały poprawnie jego wysokości (autolayout). Aby to naprawić, musiałem przesłonić didMoveToSuperview i tam również skonfigurować połączenie.
El Horrible

791

W przypadku iOS 7.0 okazało się, że sztuczka contentInset już nie działa. To jest kod, którego użyłem, aby pozbyć się marginesu / wypełnienia w iOS 7.

Sprowadza to lewą krawędź tekstu do lewej krawędzi kontenera:

textView.textContainer.lineFragmentPadding = 0

Powoduje to wyrównanie górnej części tekstu z górną krawędzią kontenera

textView.textContainerInset = .zero

Obie linie są potrzebne do całkowitego usunięcia marginesu / wypełnienia.


2
To działa dla mnie na dwie linie, ale zanim dojdę do 5 linii, tekst się urywa.
livings124

7
Zauważ, że drugi wiersz można również zapisać jako: self.descriptionTextView.textContainerInset = UIEdgeInsetsZero;
jessepinho

19
Ustawienie lineFragmentPaddingna 0 to magia, której szukałem. Nie mam pojęcia, dlaczego Apple tak trudno dopasowuje zawartość UITextView do innych elementów sterujących.
phatmann

3
To jest poprawna odpowiedź. W przypadku tego rozwiązania przewijanie w poziomie nie występuje.
Michael

2
lineFragmentPaddingnie ma na celu modyfikowania marginesów. Z dokumentów Wypełnienie fragmentu linii nie jest przeznaczone do wyrażania marginesów tekstu. Zamiast tego należy użyć wypustek w widoku tekstowym, dostosować atrybuty marginesu akapitu lub zmienić pozycję widoku tekstowego w jego nadzorze.
Martin Berger,

256

To obejście zostało napisane w 2009 roku, kiedy IOS 3.0 został wydany. To już nie ma zastosowania.

Wpadłem na dokładnie ten sam problem, w końcu musiałem skończyć z użyciem

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

gdzie nameField to UITextView . Czcionka, której używałem, to Helvetica 16 punktów. To tylko niestandardowe rozwiązanie dla konkretnego rozmiaru pola, które rysowałem. Powoduje to, że lewe przesunięcie wyrównuje się z lewą stroną, a górne przesunięcie tam, gdzie chcę, dla pudełka, w którym jest rysowane.

Ponadto wydaje się, że dotyczy to tylko sytuacji, w UITextViewsktórej używasz domyślnego wyrównania, tj.

nameField.textAlignment = NSTextAlignmentLeft;

Wyrównaj na przykład do prawej, a UIEdgeInsetsMakewydaje się, że nie ma żadnego wpływu na prawą krawędź.

Przynajmniej użycie właściwości .contentInset pozwala na umieszczenie pól w „prawidłowych” pozycjach i uwzględnienie odchyleń bez ich kompensowania UITextViews.


1
Tak, działa w systemie iOS 7. Upewnij się, że UIEdgeInset ma ustawione prawidłowe wartości. Może być inny niż UIEdgeInsetsMake (-4, -8,0,0).
app_

15
W IOS 7 znalazłem, że UIEdgeInsetsMake (0, -4,0, -4) działa najlepiej.
Racura,

2
Tak, to są liczby przykładowe. Powiedziałem: „To tylko niestandardowe rozwiązanie dla konkretnego rozmiaru pola, które rysowałem”. Głównie próbowałem zilustrować, że musisz grać liczbami w swojej wyjątkowej sytuacji w układzie.
Michael

3
UITextAlignmentLeft jest przestarzałe w iOS 7. Użyj NSTextAlignmentLeft.
Jordi Kroon

7
Nie rozumiem, dlaczego ludzie głosują za odpowiedzią, która wykorzystuje zakodowane wartości. Jest bardzo prawdopodobne, że złamie się w przyszłych wersjach iOS i jest to po prostu zły pomysł.
ldoogy,

77

Opierając się na niektórych dobrych odpowiedziach już podanych, oto rozwiązanie oparte wyłącznie na Storyboard / Interface Builder, które działa w iOS 7.0+

Ustaw Zdefiniowane przez użytkownika atrybuty środowiska wykonawczego UITextView dla następujących kluczy:

textContainer.lineFragmentPadding
textContainerInset

Konstruktor interfejsów


4
Jest to zdecydowanie najlepsza odpowiedź, szczególnie jeśli potrzebujesz rozwiązania
opartego

16
Kopiuj / wklej: textContainer.lineFragmentPadding | textContainerInset
Luca De Angelis

3
To sprawia, że ​​piękna odpowiedź - łatwa i działa dobrze, nawet po 3 latach :)
Shai Mishali


41

Zdecydowanie unikałbym odpowiedzi obejmujących wartości zakodowane na stałe, ponieważ rzeczywiste marginesy mogą się zmieniać w zależności od ustawień rozmiaru czcionki użytkownika itp.

Oto odpowiedź @ user1687195, napisana bez modyfikacji textContainer.lineFragmentPadding(ponieważ dokumenty stwierdzają, że nie jest to zamierzone użycie).

Działa to świetnie na iOS 7 i nowszych.

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

To faktycznie ten sam wynik, tylko trochę czystszy, ponieważ nie niewłaściwie używa właściwości lineFragmentPadding.


Wypróbowałem inne rozwiązanie oparte na tej odpowiedzi i działa świetnie. Rozwiązania są następujące:self.textView.textContainer.lineFragmentPadding = 0;
Bakyt Abdrasulov

1
@BakytAbdrasulov proszę przeczytać moją odpowiedź. Chociaż twoje rozwiązanie działa, nie jest zgodne z dokumentami (patrz link w mojej odpowiedzi). lineFragmentPaddingnie ma na celu kontrolowania marginesów. Właśnie dlatego powinieneś użyć textContainerInset.
ldoogy

20

Rozwiązanie do tworzenia scenorysów lub interfejsów wykorzystujące atrybuty środowiska wykonawczego zdefiniowanego przez użytkownika :

Zrzuty ekranu dotyczą systemu iOS 7.1 i iOS 6.1 contentInset = {{-10, -5}, {0, 0}}.

Zdefiniowane przez użytkownika atrybuty środowiska wykonawczego

wynik


1
Pracowałem dla mnie w iOS 7.
kubilay

Tylko dla zdefiniowanych przez użytkownika atrybutów środowiska wykonawczego - niesamowite!
hris.to

16

Wszystkie te odpowiedzi dotyczą pytania tytułowego, ale chciałem zaproponować kilka rozwiązań problemów przedstawionych w treści pytania PO.

Rozmiar treści tekstowej

Szybkim sposobem obliczenia rozmiaru tekstu w środku UITextViewjest użycie NSLayoutManager:

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

Daje to całkowitą przewijalną zawartość, która może być większa niż UITextViewramka. Odkryłem, że jest to o wiele dokładniejsze niż, textView.contentSizeponieważ oblicza, ile miejsca zajmuje tekst. Na przykład, biorąc pod uwagę pusty 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)

Wysokość linii

UIFontma właściwość, która pozwala szybko uzyskać wysokość linii dla danej czcionki. Dzięki temu możesz szybko znaleźć wysokość linii tekstu w UITextView:

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

Obliczanie widocznego rozmiaru tekstu

Określenie ilości faktycznie widocznego tekstu jest ważne dla obsługi efektu „stronicowania”. UITextViewma właściwość o nazwie, textContainerInsetktóra faktycznie stanowi margines między faktycznym UITextView.framea samym tekstem. Aby obliczyć rzeczywistą wysokość widocznej ramki, możesz wykonać następujące obliczenia:

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

Określanie rozmiaru stronicowania

Wreszcie, gdy masz już widoczny rozmiar tekstu i treść, możesz szybko określić, jakie powinny być przesunięcia, odejmując textHeightod 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

Używając wszystkich tych metod, nie dotknąłem swoich wypustek i mogłem pójść do kursora lub gdziekolwiek w tekście, który chcę.


12

możesz użyć textContainerInsetwłaściwości UITextView:

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

(góra, lewo, dół, prawo)


1
Zastanawiam się, dlaczego nie jest to najlepsza odpowiedź tutaj. TextContainerInset naprawdę spełnił moje potrzeby.
KoreanXcodeWorker

Aktualizacja dolną wartość na textContainerInsetwłasności nie działa na mnie, gdy chcę zmienić na nową wartość zobaczyć stackoverflow.com/questions/19422578/... .
Evan R

@MaggiePhillips To nie jest najlepsza odpowiedź, ponieważ zapisane na stałe wartości nie mogą być najlepszym sposobem na zrobienie tego, aw niektórych przypadkach z pewnością się nie powiedzie. Musisz wziąć pod uwagę lineFragmentPadding.
ldoogy

11

W systemie iOS 10 następujący wiersz działa w przypadku usuwania górnej i dolnej krawędzi.

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

Xcode 8.2.1. wciąż ten sam problem, jak wspomniano w tej odpowiedzi. Moim rozwiązaniem było edytowanie wartości jako UIEdgeInsets (góra: 0, lewo: -4,0, dół: 0, prawo: -4,0).
Darkwonder,

UIEdgeInset.zerodziała przy użyciu XCode 8.3 i iOS 10.3 Simulator
Simon Warta

10

Najnowszy Swift:

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

Świetna odpowiedź. Ta odpowiedź usuwa dodatkową wstawkę górną. textView.textContainerInset = UIEdgeInsets.zero nie usuwa 2 pikseli z górnej wstawki.
korgx9,

10

Oto zaktualizowana wersja bardzo pomocnej odpowiedzi Fattie. Dodaje 2 ważne linie, które pomogły mi uruchomić układ na iOS 10 i 11 (i prawdopodobnie także na niższych):

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

Ważnymi liniami są dwie translatesAutoresizingMaskIntoConstraints = <true/false>wypowiedzi!

To zaskakująco usuwa wszystkie marginesy we wszystkich moich okolicznościach!

Chociaż textViewnie jest to pierwsza odpowiedź, może się zdarzyć, że istnieje dziwny dolny margines, którego nie można rozwiązać za pomocą sizeThatFitsmetody wymienionej w zaakceptowanej odpowiedzi.

Po dotknięciu do textView nagle dziwny dolny margines zniknął i wszystko wyglądało tak, jak powinno, ale tylko jak tylko textView się pojawi firstResponder.

Czytam więc tutaj na SO, że włączanie i wyłączanie translatesAutoresizingMaskIntoConstraintspomaga podczas ręcznego ustawiania ramki / granic między połączeniami.

Na szczęście działa to nie tylko z ustawieniem ramki, ale z 2 liniami setup()umieszczonymi pomiędzy dwoma translatesAutoresizingMaskIntoConstraintswywołaniami!

Jest to na przykład bardzo pomocne podczas obliczania ramki widoku przy użyciu systemLayoutSizeFittingnaUIView . Zwraca prawidłowy rozmiar (czego wcześniej nie robił)!

Jak wspomniano w pierwotnej odpowiedzi:
Nie zapomnij wyłączyć scrollEnabled w Inspektorze!
To rozwiązanie działa poprawnie zarówno w scenorysie, jak i w środowisku wykonawczym.

To wszystko, teraz naprawdę gotowe!


5

Dla szybkiego 4, Xcode 9

Użyj poniższej funkcji, aby zmienić margines / wypełnienie tekstu w UITextView

public func UIEdgeInsetsMake (_ góra: CGFloat, _ lewo: CGFloat, _ dół: CGFloat, _ prawo: CGFloat) -> UIEdgeInsets

więc w tym przypadku jest

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

3

Robiąc rozwiązanie na wkładce nadal miałem wyściółkę po prawej stronie iu dołu. Wyrównanie tekstu również powodowało problemy. Jedynym pewnym sposobem, jaki udało mi się znaleźć, było umieszczenie widoku tekstu w innym widoku przyciętym do granic.


3

Oto proste, małe rozszerzenie, które usunie domyślny margines Apple z każdego widoku tekstu w Twojej aplikacji.

Uwaga: Konstruktor interfejsów nadal będzie wyświetlał stary margines, ale aplikacja będzie działać zgodnie z oczekiwaniami.

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

Dla mnie (iOS 11 i Xcode 9.4.1) magicznie działało ustawienie właściwości textView.font do UIFont.preferred(forTextStyle:UIFontTextStyle) stylu, a także pierwsza odpowiedź wspomniana przez @Fattie. Ale odpowiedź @Fattie nie zadziałała, dopóki nie ustawiłem właściwości textView.font. W przeciwnym razie UITextView zachowuje się nieprawidłowo.


1

Na wypadek, gdyby ktokolwiek szukał najnowszej wersji Swift, poniższy kod działa dobrze z Xcode 10.2 i Swift 4.2

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

0

Znalazłem jeszcze jedno podejście, uzyskiwanie widoku z tekstem z widoków podrzędnych UITextView i konfigurowanie go w metodzie layoutSubview podklasy:

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

Przewijanie textView wpływa również na pozycję tekstu i sprawia, że ​​wygląda on tak, jakby nie był wyśrodkowany w pionie. Udało mi się wyśrodkować tekst w widoku, wyłączając przewijanie i ustawiając górną wstawkę na 0:

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

Z jakiegoś powodu jeszcze tego nie rozgryzłem, kursor nadal nie jest wyśrodkowany przed rozpoczęciem pisania, ale tekst jest wyśrodkowany natychmiast po rozpoczęciu pisania.


0

Jeśli chcesz ustawić ciąg HTML i uniknąć dolnego dopełniania, upewnij się, że nie używasz tagów blokowych, np. Div, p.

W moim przypadku był to powód. Możesz to łatwo przetestować, zastępując występowanie tagów blokowych np. Tagiem span.


0

Dla SwiftUI

Jeśli tworzysz własny TextView UIViewRepresentablei chcesz kontrolować wypełnienie, w swojej makeUIViewfunkcji po prostu wykonaj:

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

lub cokolwiek chcesz.


-4
[firstNameTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.