2013-02-13 13 views
44

Szukam sposobu, aby dodać właściwość padding do UIView. Idealnie, chciałbym uniknąć subclassing i umieszczenie go w kategorii. Wykorzystanie byłoby coś jak:Dodawanie padding do UIView

myview.padding = UIEdgeInsetsMake(10, 10, 10, 10); 

i może mieć właściwość paddingBox także co zwrócić CGRect opisujący rozmiar i położenie okna wyściółki wewnętrznej.

Teraz, jak można zaimplementować w kategorii coś takiego. Początkowo jednak używałem bounds, ale niestety rozmiar bounds jest powiązany z rozmiarem frame (zawsze taki sam) tylko współrzędne mogą się różnić.

Odpowiedz

38

Zazwyczaj robi się to przez ustawienie granic w widoku. Więc jeśli chcesz się wstawka z 10 cały czas można zrobić:

view.bounds = CGRectInset(view.frame, 10.0f, 10.0f); 

Granice wyznacza rozciągliwej obszar widzenia, w stosunku do ramy. Tak więc powinno to w efekcie dopełniać. Następnie możesz uzyskać "paddingBox" właśnie z granic.

Mam nadzieję, że to pomoże! :)

+3

Zmienia to również rozmiar widoku, niestety. Jak wspomniałem w moim pytaniu, dokumenty stwierdzają, że "Rozmiar prostokąta obwiedni jest sprzężony z rozmiarem prostokąta ramki, tak że zmiany jednego wpływają na drugi". Innymi słowy, napisany kod powinien mieć -10 nie 10, a nawet tak, doda tylko górny i lewy margines, ale będę testować ponownie, aby upewnić się, że czegoś nie brakuje. – Meda

+0

Czy masz link do dokumentów, ponieważ jestem pewien, że rozmiar granic i ramka mogą się różnić? –

+0

http://stackoverflow.com/questions/749558/why-is-there-an-frame-rectangle-and-an-bounds-rectangle-in-an-uiview i http://stackoverflow.com/questions/1071112/uiviews-frame-bound-center-origin-when-to-use-co to jest dobra informacja na ten temat. –

7

To, co naprawdę musisz zrobić, to stworzyć widok i dodać do niego podgląd. Zrób widok tła i nadaj mu odpowiednią ramkę. Następnie utwórz drugi widok z klatki, w której chcesz wstawić krawędzie.

UIView backgroundView = new UIView(CGRect.FromLTRB(0, 0, 100, 100)) 
{ 
    BackgroundColor = backgroundGray, 
}; 

//Will have a right edge inset of 10 
UIView edgyView = new UIView(CGRect.FromLTRB(0, 0, 90, 100)) 
{ 
    BackgroundColor = backgroundGray, 
} 

backgroundView.AddSubview(edgyView); 
15

Aktualizacja Swift 3

view.bounds = view.frame.insetBy(dx: 10.0, dy: 10.0) 

:)

2

Można zastąpić właściwość alignmentRectInsets. Oto przykład w Swift 4

class YourCustomView: UIView { 

    override var alignmentRectInsets: UIEdgeInsets { 
     return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 
    } 
}