重新定义Button的图片和label位置

 

 

原文挺多的,说的很细,我就简化一些, 在加上自己的一些优化,

 http://m.blog.csdn.net/lqq200912408/article/details/51323336

 

UIButton的默认布局是:title在右,image在左;

很多时候我们需要的是title在左边,或者title在下面,这时就需要调整UIButton的TitleLabel和ImageView的位置了,

 

一种是设置UIButton的以下属性:

 

 

在xib,sb中直接设置就行了 .  左右上下 都能设置, 而且可以实时看到,简直不要太方便 . 如果代码创建的,那就老实的设置

属性值吧.

 

 

二,通过自定义Button

该方法,是通过自定义一个button,继承自UIButton,然后重写方法:

 

 

方法的参数contentRect,即内容的frame,其值和button的bounds是一样的,通过这个参数可以获取到当前button的size;

这里可以返回一个写死的frame,但要注意,不要超过contentRect的范围;

比如这种 :  ( 上图下字, 图是正方形 , 字的高度固定 20 像素)

 

// 调整图片的位置, 涨见识了, 还能这样写 ,重新调整Button的图片和label位置
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
    return CGRectMake(0, 0, self.width, self.width);

}
// 调整label的位置
- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
    return CGRectMake(0, self.height - 20, self.width, 20);
}

 

 

 

 

 

有一点需要说明:这两个方法不是只调用一次,会被多次调用,只要button的title改变,都会调用此方法,最后一次调用,返回的f

rame值,才是最终的布局frame,

 

效果图:

 

 

 

 

这是写死的方式,可能 不能普遍使用所有情况 , 那就在加点东西, 

 

.m文件 : 

在调用时,优先检测 有没有自己的设置, 如果有自己的设置, 就直接使用自己的设置, 没有的话, 就按照默认的显示 . 

 

Good ,几乎可以适应任何情况了.

 

3. 还有一种方式 , 反正都已经用继承了,直接重写layoutSubview就行了, 简单粗暴直接,  也可以像上面一样,写一个值存imageRect 和 labelRect  , 如果没有 使用这个默认值, 有的话就用存的值 , 但是这个有个问题 , 就是button的实际位置是没改的,绿色是背景色,是图片的真实frame, 下面的字是无法响应点击事件的,所以设置button的frame的时候要算好button的真正的frame .

- (void)layoutSubviews{
    [super layoutSubviews];
    
    if (self.imageRect.size.width != 0 && self.imageRect.size.height != 0) {
        self.imageView.frame = self.imageRect;
    } else {
        self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
    }
    
    if (self.titleRect.size.width != 0 && self.titleRect.size.height != 0) {
        self.titleLabel.frame = self.titleRect;
    } else {
        self.titleLabel.frame = CGRectMake(0, self.imageView.image.size.height+10, self.imageView.image.size.width, self.titleLabel.frame.size.height);        
    }
    
    
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的图片浏览器的代码,使用了 LabelButton 控件。 ```python import tkinter as tk from PIL import Image, ImageTk import os class ImageBrowser: def __init__(self, master): self.master = master master.title("Image Browser") # 设置图片路径和索引 self.image_dir = "images" self.image_names = os.listdir(self.image_dir) self.current_image_index = 0 # 创建图片 Label self.image_label = tk.Label(master) self.image_label.pack() # 创建按钮 self.prev_button = tk.Button(master, text="Prev", command=self.show_prev_image) self.prev_button.pack(side=tk.LEFT) self.next_button = tk.Button(master, text="Next", command=self.show_next_image) self.next_button.pack(side=tk.RIGHT) # 显示第一张图片 self.show_image() def show_image(self): # 加载图片 image_path = os.path.join(self.image_dir, self.image_names[self.current_image_index]) image = Image.open(image_path) # 调整图片大小适应 Label w, h = self.master.winfo_width(), self.master.winfo_height() image = image.resize((w, h)) # 将图片显示在 Label 上 photo = ImageTk.PhotoImage(image) self.image_label.config(image=photo) self.image_label.image = photo def show_prev_image(self): # 显示上一张图片 self.current_image_index = (self.current_image_index - 1) % len(self.image_names) self.show_image() def show_next_image(self): # 显示下一张图片 self.current_image_index = (self.current_image_index + 1) % len(self.image_names) self.show_image() root = tk.Tk() app = ImageBrowser(root) root.mainloop() ``` 在这个示例中,我们首先定义了一个 `ImageBrowser` 类,并在构造函数中设置了图片路径和索引。然后创建了一个 `Label` 控件用于显示图片,以及两个 `Button` 控件用于切换图片。 `show_image()` 方法用于加载并显示当前图片,它使用了 `PIL` 库来加载和调整图片大小,然后将图片显示在 `Label` 上。 `show_prev_image()` 和 `show_next_image()` 方法用于切换上一张和下一张图片,它们分别将当前图片索引减一或加一,并调用 `show_image()` 方法来显示新图片。 最后,我们通过创建 `Tk` 对象和 `ImageBrowser` 对象,并调用 `mainloop()` 方法来运行应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值