Alignement du texte et de l'image sur UIButton avec les ensembles imageEdgeInsets et titleEdgeInsets
j'aimerais placer une icône à gauche des deux lignes de texte de sorte qu'il y ait environ 2-3 pixels d'espace entre l'image et le début du texte. Le contrôle lui-même est aligné au centre horizontalement (mis par Interface Builder)
le bouton ressemblerait à quelque chose comme ceci:
| |
|[Image] Add To |
| Favorites |
j'essaie de le configurer avec des gainsetscontentedgeinset, imageEdgeInsets et titleEdgeInsets en vain. Je comprends qu'une valeur négative développe le bord tandis qu'une valeur positive réduit pour le déplacer plus près du centre.
j'ai essayé:
[button setTitleEdgeInsets:UIEdgeInsetsMake(0, -image.size.width, 0, 0)];
[button setImageEdgeInsets:UIEdgeInsetsMake(0, button.titleLabel.bounds.size.width, 0, 0)];
mais cela ne l'affiche pas correctement. J'ai modifié les valeurs, mais passer de -5 à -10 sur la valeur de gauche ne semble pas la déplacer de la manière attendue. -10 va scoot le texte tout le chemin vers la gauche donc je m'attendais à -5 pour scoot le mi chemin à partir du côté gauche mais il ne le fait pas.
Quelle est la logique derrière des inserts? Je ne suis pas familier avec le placement d'images et la terminologie connexe.
j'ai utilisé cette question comme référence mais quelque chose à propos de mes valeurs n'est pas juste. UIButton: comment centrer une image et un texte en utilisant desenseignements imageEdgeInsets et titleEdgeInsets?
11 réponses
je suis d'accord que la documentation sur imageEdgeInsets
et titleEdgeInsets
devrait être meilleure, mais j'ai compris comment obtenir le positionnement correct sans recourir à l'essai et l'erreur.
l'idée générale est ici à cette question , mais c'était si vous vouliez à la fois texte et image centrée. Nous ne voulons pas que l'image et le texte sera centré individuellement, nous voulons que l'image et le texte soit centré ensemble, comme une seule entité. C'est en effet ce que l' UIButton le fait déjà donc nous avons simplement besoin d'ajuster l'espacement.
CGFloat spacing = 10; // the amount of spacing to appear between image and title
tabBtn.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, spacing);
tabBtn.titleEdgeInsets = UIEdgeInsetsMake(0, spacing, 0, 0);
j'ai aussi transformé cela en une catégorie pour UIButton donc il sera facile à utiliser:
UIButton+Position.h
@interface UIButton(ImageTitleCentering)
-(void) centerButtonAndImageWithSpacing:(CGFloat)spacing;
@end
UIButton+Position.m
@implementation UIButton(ImageTitleCentering)
-(void) centerButtonAndImageWithSpacing:(CGFloat)spacing {
self.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, spacing);
self.titleEdgeInsets = UIEdgeInsetsMake(0, spacing, 0, 0);
}
@end
donc maintenant tout ce que j'ai à faire est:
[button centerButtonAndImageWithSpacing:10];
et j'obtiens ce dont j'ai besoin à chaque fois. Aucun plus jouer avec les inserts de bord manuellement.
MODIFIER: Changer l'Image et le Texte
en réponse à @Javal dans les commentaires
avec ce même mécanisme, on peut échanger l'image et le texte. Pour effectuer l'échange, il suffit d'utiliser un espacement négatif, mais aussi d'inclure la largeur du texte et de l'image. Cela nécessitera des cadres à être connue et mise en page déjà.
[self.view layoutIfNeeded];
CGFloat flippedSpacing = -(desiredSpacing + button.currentImage.size.width + button.titleLabel.frame.size.width);
[button centerButtonAndImageWithSpacing:flippedSpacing];
Bien sûr, vous voudrez probablement faire une méthode agréable pour cela, en ajoutant potentiellement une méthode de deuxième catégorie, ceci est laissé comme un exercice au lecteur.
je suis un peu en retard à cette fête, mais je pense que j'ai quelque chose d'utile à ajouter.
la réponse de Kekoa est excellente mais, comme RonLugge le mentionne, elle peut faire en sorte que le bouton ne respecte plus sizeToFit
ou, ce qui est plus important, faire en sorte que le bouton clipse son contenu lorsqu'il est de taille intrinsèque. Oups!
mais d'Abord,
une brève explication de la façon dont je crois que imageEdgeInsets
et titleEdgeInsets
travail:
Le docs pour imageEdgeInsets
ont ceci à dire:
utilisez cette propriété pour redimensionner et repositionner le rectangle de dessin effectif pour l'image bouton. Vous pouvez spécifier une valeur différente pour chacun des quatre insets (haut, gauche, bas, droite). Une valeur positive rétrécit, ou insète, ce bord-le déplaçant plus près du centre du bouton. Une valeur négative se développe, ou dilate, ce bord.
je crois que cette documentation a été écrite en imaginant que le bouton n'a pas de titre, juste une image. Il fait beaucoup plus de sens pensée de cette façon, et se comporte comment UIEdgeInsets
font habituellement. Fondamentalement, le cadre de l'image (ou le titre, avec titleEdgeInsets
) est déplacé vers l'intérieur pour les insets positifs et vers l'extérieur pour les insets négatifs.
OK, et alors?
je suis il y! Voici ce que vous avez par défaut, définir une image et un titre (la bordure de bouton est vert juste pour montrer où il est):
Quand vous voulez l'espacement entre une image et un titre, sans causer soit d'être écrasés, vous devez définir quatre différents encarts, deux sur chaque image et le titre. C'est parce que vous ne voulez pas changer les tailles des cadres de ces éléments, mais juste leur position. Lorsque vous commencez à penser de cette façon, le changement nécessaire à la catégorie excellente de Kekoa devient clair:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
}
@end
Mais attendez , dites-vous, quand je fais cela, je reçois ceci:
Oh oui! J'ai oublié, le docs m'a prévenu à ce sujet. Ils disent:
cette propriété n'est utilisé que pour positionner l'image lors de la mise en page. Le bouton n'utilise pas cette propriété pour déterminer
intrinsicContentSize
etsizeThatFits:
.
mais là est une propriété qui peut aider, et qui est contentEdgeInsets
. Les docs pour dire que, dans la partie:
Le bouton utilise cette propriété pour déterminer
intrinsicContentSize
etsizeThatFits:
.
ça sonne bien. Alors retouchons la catégorie Une fois de plus:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
self.contentEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, insetAmount);
}
@end
Et qu'obtenez-vous?
Ressemble à un gagnant pour moi.
travailler chez Swift et ne veulent pas réfléchir du tout? Voici la version finale de L'extension dans Swift:
extension UIButton {
func centerTextAndImage(spacing: CGFloat) {
let insetAmount = spacing / 2
imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount, bottom: 0, right: insetAmount)
titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: -insetAmount)
contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
}
}
dans interface Builder. Sélectionnez le UIButton - > Attributes Inspector - > Edge=Title et modifiez les insets edge
aussi si vous voulez faire quelque chose de similaire à
Vous avez besoin de
1.Régler l'alignement horizontal et vertical du bouton sur
-
trouver toutes les valeurs requises et régler
UIImageEdgeInsets
CGSize buttonSize = button.frame.size; NSString *buttonTitle = button.titleLabel.text; CGSize titleSize = [buttonTitle sizeWithAttributes:@{ NSFontAttributeName : [UIFont camFontZonaProBoldWithSize:12.f] }]; UIImage *buttonImage = button.imageView.image; CGSize buttonImageSize = buttonImage.size; CGFloat offsetBetweenImageAndText = 10; //vertical space between image and text [button setImageEdgeInsets:UIEdgeInsetsMake((buttonSize.height - (titleSize.height + buttonImageSize.height)) / 2 - offsetBetweenImageAndText, (buttonSize.width - buttonImageSize.width) / 2, 0,0)]; [button setTitleEdgeInsets:UIEdgeInsetsMake((buttonSize.height - (titleSize.height + buttonImageSize.height)) / 2 + buttonImageSize.height + offsetBetweenImageAndText, titleSize.width + [button imageEdgeInsets].left > buttonSize.width ? -buttonImage.size.width + (buttonSize.width - titleSize.width) / 2 : (buttonSize.width - titleSize.width) / 2 - buttonImage.size.width, 0,0)];
cela arrangera votre titre et votre image sur le bouton.
S'il vous plaît noter cette mise à jour sur chaque relayout
Swift
import UIKit
extension UIButton {
// MARK: - UIButton+Aligment
func alignContentVerticallyByCenter(offset:CGFloat = 10) {
let buttonSize = frame.size
if let titleLabel = titleLabel,
let imageView = imageView {
if let buttonTitle = titleLabel.text,
let image = imageView.image {
let titleString:NSString = NSString(string: buttonTitle)
let titleSize = titleString.sizeWithAttributes([
NSFontAttributeName : titleLabel.font
])
let buttonImageSize = image.size
let topImageOffset = (buttonSize.height - (titleSize.height + buttonImageSize.height + offset)) / 2
let leftImageOffset = (buttonSize.width - buttonImageSize.width) / 2
imageEdgeInsets = UIEdgeInsetsMake(topImageOffset,
leftImageOffset,
0,0)
let titleTopOffset = topImageOffset + offset + buttonImageSize.height
let leftTitleOffset = (buttonSize.width - titleSize.width) / 2 - image.size.width
titleEdgeInsets = UIEdgeInsetsMake(titleTopOffset,
leftTitleOffset,
0,0)
}
}
}
}
, Vous pouvez éviter beaucoup de problèmes à l'aide de cette --
myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
myButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
cela alignera automatiquement tout votre contenu à gauche (ou où vous le voulez)
Swift 3:
myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left;
myButton.contentVerticalAlignment = UIControlContentVerticalAlignment.center;
dans Xcode 8.0 vous pouvez simplement le faire en changeant insets
en inspecteur de taille.
sélectionnez L'UIButton -> attributs Inspector -> allez à taille inspector et modifiez le contenu, l'image et les insets de titre.
et si vous voulez changer l'image sur le côté droit vous pouvez simplement changer la propriété sémantique à Force Right-to-left
dans L'attribut inspecteur.
je suis un peu en retard à cette fête aussi, mais je pense que j'ai quelque chose d'utile à ajouter :o).
j'ai créé une sous-classe UIButton
dont le but est de pouvoir choisir l'emplacement de l'image du bouton, soit verticalement, soit horizontalement.
Cela signifie que vous pouvez faire ce genre de boutons :
Ici les détails sur la façon de créer ces boutons avec ma classe :
func makeButton (imageVerticalAlignment:LayoutableButton.VerticalAlignment, imageHorizontalAlignment:LayoutableButton.HorizontalAlignment, title:String) -> LayoutableButton {
let button = LayoutableButton ()
button.imageVerticalAlignment = imageVerticalAlignment
button.imageHorizontalAlignment = imageHorizontalAlignment
button.setTitle(title, for: .normal)
// add image, border, ...
return button
}
let button1 = makeButton(imageVerticalAlignment: .center, imageHorizontalAlignment: .left, title: "button1")
let button2 = makeButton(imageVerticalAlignment: .center, imageHorizontalAlignment: .right, title: "button2")
let button3 = makeButton(imageVerticalAlignment: .top, imageHorizontalAlignment: .center, title: "button3")
let button4 = makeButton(imageVerticalAlignment: .bottom, imageHorizontalAlignment: .center, title: "button4")
let button5 = makeButton(imageVerticalAlignment: .bottom, imageHorizontalAlignment: .center, title: "button5")
button5.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
pour ce faire, j'ai ajouté 2 attributs: imageVerticalAlignment
et imageHorizontalAlignment
. Bien sûr, si votre bouton n'a qu'une image ou un titre ... ne pas utiliser cette classe à tous !
j'ai aussi ajouté un attribut nommé imageToTitleSpacing
qui vous permettent d'ajuster l'espace entre le titre et l'image.
cette classe faire de son mieux pour être compatible si vous voulez utiliser imageEdgeInsets
, titleEdgeInsets
et contentEdgeInsets
directement ou en combinaison avec les nouveaux attributs de layout.
comme nous l'explique @ravron, je fais de mon mieux pour que le bouton content edge soit correct (comme vous pouvez le voir avec les bordures rouges).
vous pouvez également l'utiliser dans Interface Builder:
- Créer un UIButton
- changer la classe de bouton
- Ajuster Layoutable Attributs à l'aide de "centre", "haut", "bas", "gauche" ou "droite"
ici le code ( gist ):
@IBDesignable
class LayoutableButton: UIButton {
enum VerticalAlignment : String {
case center, top, bottom, unset
}
enum HorizontalAlignment : String {
case center, left, right, unset
}
@IBInspectable
var imageToTitleSpacing: CGFloat = 8.0 {
didSet {
setNeedsLayout()
}
}
var imageVerticalAlignment: VerticalAlignment = .unset {
didSet {
setNeedsLayout()
}
}
var imageHorizontalAlignment: HorizontalAlignment = .unset {
didSet {
setNeedsLayout()
}
}
@available(*, unavailable, message: "This property is reserved for Interface Builder. Use 'imageVerticalAlignment' instead.")
@IBInspectable
var imageVerticalAlignmentName: String {
get {
return imageVerticalAlignment.rawValue
}
set {
if let value = VerticalAlignment(rawValue: newValue) {
imageVerticalAlignment = value
} else {
imageVerticalAlignment = .unset
}
}
}
@available(*, unavailable, message: "This property is reserved for Interface Builder. Use 'imageHorizontalAlignment' instead.")
@IBInspectable
var imageHorizontalAlignmentName: String {
get {
return imageHorizontalAlignment.rawValue
}
set {
if let value = HorizontalAlignment(rawValue: newValue) {
imageHorizontalAlignment = value
} else {
imageHorizontalAlignment = .unset
}
}
}
var extraContentEdgeInsets:UIEdgeInsets = UIEdgeInsets.zero
override var contentEdgeInsets: UIEdgeInsets {
get {
return super.contentEdgeInsets
}
set {
super.contentEdgeInsets = newValue
self.extraContentEdgeInsets = newValue
}
}
var extraImageEdgeInsets:UIEdgeInsets = UIEdgeInsets.zero
override var imageEdgeInsets: UIEdgeInsets {
get {
return super.imageEdgeInsets
}
set {
super.imageEdgeInsets = newValue
self.extraImageEdgeInsets = newValue
}
}
var extraTitleEdgeInsets:UIEdgeInsets = UIEdgeInsets.zero
override var titleEdgeInsets: UIEdgeInsets {
get {
return super.titleEdgeInsets
}
set {
super.titleEdgeInsets = newValue
self.extraTitleEdgeInsets = newValue
}
}
//Needed to avoid IB crash during autolayout
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.imageEdgeInsets = super.imageEdgeInsets
self.titleEdgeInsets = super.titleEdgeInsets
self.contentEdgeInsets = super.contentEdgeInsets
}
override func layoutSubviews() {
if let imageSize = self.imageView?.image?.size,
let font = self.titleLabel?.font,
let textSize = self.titleLabel?.attributedText?.size() ?? self.titleLabel?.text?.size(attributes: [NSFontAttributeName: font]) {
var _imageEdgeInsets = UIEdgeInsets.zero
var _titleEdgeInsets = UIEdgeInsets.zero
var _contentEdgeInsets = UIEdgeInsets.zero
let halfImageToTitleSpacing = imageToTitleSpacing / 2.0
switch imageVerticalAlignment {
case .bottom:
_imageEdgeInsets.top = (textSize.height + imageToTitleSpacing) / 2.0
_imageEdgeInsets.bottom = (-textSize.height - imageToTitleSpacing) / 2.0
_titleEdgeInsets.top = (-imageSize.height - imageToTitleSpacing) / 2.0
_titleEdgeInsets.bottom = (imageSize.height + imageToTitleSpacing) / 2.0
_contentEdgeInsets.top = (min (imageSize.height, textSize.height) + imageToTitleSpacing) / 2.0
_contentEdgeInsets.bottom = (min (imageSize.height, textSize.height) + imageToTitleSpacing) / 2.0
//only works with contentVerticalAlignment = .center
contentVerticalAlignment = .center
case .top:
_imageEdgeInsets.top = (-textSize.height - imageToTitleSpacing) / 2.0
_imageEdgeInsets.bottom = (textSize.height + imageToTitleSpacing) / 2.0
_titleEdgeInsets.top = (imageSize.height + imageToTitleSpacing) / 2.0
_titleEdgeInsets.bottom = (-imageSize.height - imageToTitleSpacing) / 2.0
_contentEdgeInsets.top = (min (imageSize.height, textSize.height) + imageToTitleSpacing) / 2.0
_contentEdgeInsets.bottom = (min (imageSize.height, textSize.height) + imageToTitleSpacing) / 2.0
//only works with contentVerticalAlignment = .center
contentVerticalAlignment = .center
case .center:
//only works with contentVerticalAlignment = .center
contentVerticalAlignment = .center
break
case .unset:
break
}
switch imageHorizontalAlignment {
case .left:
_imageEdgeInsets.left = -halfImageToTitleSpacing
_imageEdgeInsets.right = halfImageToTitleSpacing
_titleEdgeInsets.left = halfImageToTitleSpacing
_titleEdgeInsets.right = -halfImageToTitleSpacing
_contentEdgeInsets.left = halfImageToTitleSpacing
_contentEdgeInsets.right = halfImageToTitleSpacing
case .right:
_imageEdgeInsets.left = textSize.width + halfImageToTitleSpacing
_imageEdgeInsets.right = -textSize.width - halfImageToTitleSpacing
_titleEdgeInsets.left = -imageSize.width - halfImageToTitleSpacing
_titleEdgeInsets.right = imageSize.width + halfImageToTitleSpacing
_contentEdgeInsets.left = halfImageToTitleSpacing
_contentEdgeInsets.right = halfImageToTitleSpacing
case .center:
_imageEdgeInsets.left = textSize.width / 2.0
_imageEdgeInsets.right = -textSize.width / 2.0
_titleEdgeInsets.left = -imageSize.width / 2.0
_titleEdgeInsets.right = imageSize.width / 2.0
_contentEdgeInsets.left = -((imageSize.width + textSize.width) - max (imageSize.width, textSize.width)) / 2.0
_contentEdgeInsets.right = -((imageSize.width + textSize.width) - max (imageSize.width, textSize.width)) / 2.0
case .unset:
break
}
_contentEdgeInsets.top += extraContentEdgeInsets.top
_contentEdgeInsets.bottom += extraContentEdgeInsets.bottom
_contentEdgeInsets.left += extraContentEdgeInsets.left
_contentEdgeInsets.right += extraContentEdgeInsets.right
_imageEdgeInsets.top += extraImageEdgeInsets.top
_imageEdgeInsets.bottom += extraImageEdgeInsets.bottom
_imageEdgeInsets.left += extraImageEdgeInsets.left
_imageEdgeInsets.right += extraImageEdgeInsets.right
_titleEdgeInsets.top += extraTitleEdgeInsets.top
_titleEdgeInsets.bottom += extraTitleEdgeInsets.bottom
_titleEdgeInsets.left += extraTitleEdgeInsets.left
_titleEdgeInsets.right += extraTitleEdgeInsets.right
super.imageEdgeInsets = _imageEdgeInsets
super.titleEdgeInsets = _titleEdgeInsets
super.contentEdgeInsets = _contentEdgeInsets
} else {
super.imageEdgeInsets = extraImageEdgeInsets
super.titleEdgeInsets = extraTitleEdgeInsets
super.contentEdgeInsets = extraContentEdgeInsets
}
super.layoutSubviews()
}
}
une petite addition à Riley Avron réponse aux changements de Compte locale:
extension UIButton {
func centerTextAndImage(spacing: CGFloat) {
let insetAmount = spacing / 2
let writingDirection = UIApplication.sharedApplication().userInterfaceLayoutDirection
let factor: CGFloat = writingDirection == .LeftToRight ? 1 : -1
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount*factor, bottom: 0, right: insetAmount*factor)
self.titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount*factor, bottom: 0, right: -insetAmount*factor)
self.contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
}
}
Swift 4.x
extension UIButton {
func centerTextAndImage(spacing: CGFloat) {
let insetAmount = spacing / 2
let writingDirection = UIApplication.shared.userInterfaceLayoutDirection
let factor: CGFloat = writingDirection == .leftToRight ? 1 : -1
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount*factor, bottom: 0, right: insetAmount*factor)
self.titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount*factor, bottom: 0, right: -insetAmount*factor)
self.contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
}
}
Utilisation :
button.centerTextAndImage(spacing: 10.0)
voici un exemple simple de la façon d'utiliser imageEdgeInsets Cela fera un bouton de 30x30 avec une zone hittable 10 pixels plus grand tout autour (50x50)
var expandHittableAreaAmt : CGFloat = 10
var buttonWidth : CGFloat = 30
var button = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
button.frame = CGRectMake(0, 0, buttonWidth+expandHittableAreaAmt, buttonWidth+expandHittableAreaAmt)
button.imageEdgeInsets = UIEdgeInsetsMake(expandHittableAreaAmt, expandHittableAreaAmt, expandHittableAreaAmt, expandHittableAreaAmt)
button.setImage(UIImage(named: "buttonImage"), forState: .Normal)
button.addTarget(self, action: "didTouchButton:", forControlEvents:.TouchUpInside)
une manière élégante dans Swift 3 et mieux comprendre:
override func imageRect(forContentRect contentRect: CGRect) -> CGRect {
let leftMargin:CGFloat = 40
let imgWidth:CGFloat = 24
let imgHeight:CGFloat = 24
return CGRect(x: leftMargin, y: (contentRect.size.height-imgHeight) * 0.5, width: imgWidth, height: imgHeight)
}
override func titleRect(forContentRect contentRect: CGRect) -> CGRect {
let leftMargin:CGFloat = 80
let rightMargin:CGFloat = 80
return CGRect(x: leftMargin, y: 0, width: contentRect.size.width-leftMargin-rightMargin, height: contentRect.size.height)
}
override func backgroundRect(forBounds bounds: CGRect) -> CGRect {
let leftMargin:CGFloat = 10
let rightMargin:CGFloat = 10
let topMargin:CGFloat = 10
let bottomMargin:CGFloat = 10
return CGRect(x: leftMargin, y: topMargin, width: bounds.size.width-leftMargin-rightMargin, height: bounds.size.height-topMargin-bottomMargin)
}
override func contentRect(forBounds bounds: CGRect) -> CGRect {
let leftMargin:CGFloat = 5
let rightMargin:CGFloat = 5
let topMargin:CGFloat = 5
let bottomMargin:CGFloat = 5
return CGRect(x: leftMargin, y: topMargin, width: bounds.size.width-leftMargin-rightMargin, height: bounds.size.height-topMargin-bottomMargin)
}