UIButton如何正确调整imageView及titleLabel的位置

来源:互联网 发布:常德第七元素网络 编辑:程序博客网 时间:2024/05/16 19:46

一些开发者知道通过imageEdgeInsets及titleEdgeInsets可以调整imageView及titleLabel的位置,但不知道如何正确计算,基本上都是通过多次调整相应的值达到期望的目标(次数过多可能会失去信心),究其原因就是不能正确理解imageEdgeInsets及titleEdgeInsets.

下面步入主题.

如果button的bounds足够大(宽度至少是imageView宽度与titleLabel宽度之和,高度至少为imageView高度与titleLabel高度中的最大值),那么就可以同时显示imageView及titleLabel,如下图:

如果,想要得到imageView及titleLabel都居中显示,且要达到imageView在上,titleLabel在下的效果(通过设置imageView及titleLabel的frame是无法达到这样的效果的),如下图:

此时,button的bounds也要足够大(宽度至少是imageView宽度与titleLabel宽度之和,高度至少为imageView高度与titleLabel高度之和),并且,需要修改button的imageEdgeInsets及titleEdgeInsets.可参考下面的代码:

 

//这里的图片,必须有Xcode.png及Xcode@2x.png,便于得到正确的以设备点为单位的宽度及高度

 UIImage *buttonImage =[UIImage imageNamed:@"Xcode"];

 CGFloatbuttonImageViewWidth =CGImageGetWidth(buttonImage.CGImage);

 CGFloatbuttonImageViewHeight =CGImageGetWidth(buttonImage.CGImage);

 if ([UIScreenmainScreen].scale == 2.0f) {// iOS 4.0+

    buttonImageViewWidth *=0.5f;

    buttonImageViewHeight *=0.5f;

 }

 NSString *buttonTitle =@"中华人民共和国";

 UIFont *buttonTitleFont =[UIFont systemFontOfSize:17.0f];

 CGSizebuttonTitleLabelSize = [buttonTitlesizeWithFont:buttonTitleFont];

 //button宽度,至少为imageView宽度与titleLabel宽度之和

 CGFloat buttonWidth =buttonImageViewWidth +buttonTitleLabelSize.width;

 //button高度,至少为imageView高度与titleLabel高度之和

 CGFloat buttonHeight =buttonImageViewHeight +buttonTitleLabelSize.height;

 

 UIButton *b = [[UIButtonalloc] init];

 [bsetCenter:CGPointMake(160, 160)];

 [bsetBounds:CGRectMake(0, 0, buttonWidth,buttonHeight)];

 [b.titleLabelsetFont:buttonTitleFont];

 [bsetBackgroundColor:[UIColor redColor]];

 

 [b setImage:buttonImageforState:UIControlStateNormal];

 [b.imageViewsetBackgroundColor:[UIColor greenColor]];

 

 [b setTitle:buttonTitleforState:UIControlStateNormal];

 [b setTitleColor:[UIColorblackColor] forState:UIControlStateNormal];

 [b setTitleColor:[UIColorscrollViewTexturedBackgroundColor]forState:UIControlStateHighlighted];

 [b.titleLabelsetBackgroundColor:[UIColor whiteColor]];

 

 [self.viewaddSubview:b];

 

 CGPointbuttonBoundsCenter = CGPointMake(CGRectGetMidX(b.bounds),CGRectGetMidY(b.bounds));

 //找出imageView最终的center

 CGPointendImageViewCenter = CGPointMake(buttonBoundsCenter.x,CGRectGetMidY(b.imageView.bounds));

 //找出titleLabel最终的center

 CGPointendTitleLabelCenter = CGPointMake(buttonBoundsCenter.x,CGRectGetHeight(b.bounds)-CGRectGetMidY(b.titleLabel.bounds));

 //取得imageView最初的center

 CGPointstartImageViewCenter = b.imageView.center;

 //取得titleLabel最初的center

 CGPointstartTitleLabelCenter = b.titleLabel.center;

 //设置imageEdgeInsets

 CGFloatimageEdgeInsetsTop = endImageViewCenter.y -startImageViewCenter.y;

 CGFloatimageEdgeInsetsLeft = endImageViewCenter.x -startImageViewCenter.x;

 CGFloatimageEdgeInsetsBottom = -imageEdgeInsetsTop;

 CGFloatimageEdgeInsetsRight = -imageEdgeInsetsLeft;

 b.imageEdgeInsets =UIEdgeInsetsMake(imageEdgeInsetsTop, imageEdgeInsetsLeft,imageEdgeInsetsBottom, imageEdgeInsetsRight);

 //设置titleEdgeInsets

 CGFloattitleEdgeInsetsTop =endTitleLabelCenter.y-startTitleLabelCenter.y;

 CGFloattitleEdgeInsetsLeft = endTitleLabelCenter.x -startTitleLabelCenter.x;

 CGFloattitleEdgeInsetsBottom = -titleEdgeInsetsTop;

 CGFloattitleEdgeInsetsRight = -titleEdgeInsetsLeft;

 b.titleEdgeInsets =UIEdgeInsetsMake(titleEdgeInsetsTop, titleEdgeInsetsLeft,titleEdgeInsetsBottom, titleEdgeInsetsRight);

 [brelease];

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天热宝宝不好好吃饭怎么办 天热宝宝不爱吃饭怎么办 天热宝宝不想吃饭怎么办 夏天天热宝宝不爱吃饭怎么办 3岁宝宝吃饭不香怎么办 胃ca吃饭反胃没食欲怎么办 12岁儿童脸色发黄怎么办 胃饿 但是没食欲不想吃饭怎么办 牙缝大经常塞西怎么办 吃肉老是塞牙缝怎么办 宝宝光喝奶粉不吃饭怎么办 九个月宝宝缺维c怎么办 九个月宝宝缺维d怎么办 9个月大宝宝缺锌怎么办 三周岁宝宝不爱吃饭怎么办 一周岁宝宝不爱吃饭怎么办 两岁半宝宝不自己吃饭怎么办 3岁宝宝不会吃饭怎么办 节食减肥胃疼怎么办呢 减肥不吃饭胃疼怎么办 过度节食伤了胃怎么办 3岁宝宝啥也不吃怎么办 1岁多宝宝不吃饭怎么办 胃口吃辣的难受怎么办 空腹吃辣椒胃疼怎么办 吃东西辣的胃口疼怎么办 吃辣的东西胃烧怎么办 吃母乳的宝宝不爱喝水怎么办 三个月宝宝不肯吃奶粉怎么办 三个月宝宝不肯喝奶粉怎么办 三个月的宝宝不肯喝奶粉怎么办 三个月的宝宝不肯吃奶粉怎么办 饿了还是没食欲怎么办 3岁半幼儿便秘怎么办 小孩字写得难看怎么办 小孩的字写的丑怎么办 小孩字写的太差怎么办 小孩很多字不会写怎么办 食欲不好吃不多怎么办 中班小孩子子不肯写字怎么办 1岁宝便秘该怎么办