自定义View的封装(代码方式)

view的封装

  • 如果一个view内部的子空间比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心
  • 外界可以传入对应的数据模型给view,view拿到模型数据后给内部的子控件设置对应的数据

封装控件的基本步骤

  • 第一步:在initWithFrame:方法中添加子控件,提供便利构造
    • 调用init方法,会自动调用initWithFrame:方法
- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super init]) {
        _imageView = [[UIImageView alloc]init];
        [_imageView setBackgroundColor:[UIColor redColor]];
        [self addSubview:_imageView];

        _label = [[UILabel alloc]init];
        [_label setBackgroundColor:[UIColor blueColor]];
        [self addSubview:_label];
    }
    return self;
}
  • 第二步:在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)
// 这个方法专门用来布局子控件,一般在这里设置子控件的frame
// 当控件本身的尺寸发生改变的时候,系统会自动调用这个方法
- (void)layoutSubviews
{
    [super layoutSubviews];
    CGFloat viewW = self.frame.size.width;
    CGFloat viewH = self.frame.size.height;
    _imageView.frame = CGRectMake(0, 0, viewW, viewW);
    _label.frame = CGRectMake(0, viewW, viewW, viewH - viewW);
}
  • 第三步:增加模型属性,在模型属性set方法中设置数据到子控件
// .h文件,因为要接收数据模型,所以外部要访问
/** 模型数据接口*/
@property (nonatomic, strong) WQShopData *shopData;
// .m实现文件
- (void)setShopData:(WQShopData *)shopData
{
    [self.imageView setImage:[UIImage imageNamed:shopData.icon]];
    self.label.text = shopData.name;
}
  • 在控制器中的向封装的view传入数据模型
    // 创建封装好的控件
    WQShopView *view = [[WQShopView alloc]init];
    // 设置view的frame,会自动调用封装好view的layoutSubviews
    view.frame = CGRectMake(originalX + (marginX + kImageViewW) * col, originalY + (kImageViewH + kMarginY) *row, kImageViewW, kImageViewH);
    // 将数据模型传入封装好view的成员属性
    view.shopData = self.shopsData[index];
    [self.shopsView addSubview:view];
  • 当view内部子控件很多,可以封装起来.当在外部创建该view对象,并设置或者修改该控件的frame时,就会自动调用layoutSubviews,这时可以设置修改子控件的frame(这时子控件才会显示,还没数据).
  • 在传入模型数据时,会调用数据模型的setter方法,这时设置子控件的数据(子控件显示数据)
  • 优化:有些子控件,开始不显示,需要时才显示,这时可以通过懒加载方式,在使用子控件时会调用其getter方法,在里面加载并只加载一次子控件.
#import "WQShopView.h"
#import "WQShopData.h"
@interface WQShopView ()
/**图片*/
@property (nonatomic, strong) UIImageView * imageView;
/**名字*/
@property (nonatomic, strong) UILabel * label;

@end
@implementation WQShopView

- (UIImageView *)imageView
{
    if (_imageView == nil) {
        _imageView = [[UIImageView alloc]init];
        [_imageView setBackgroundColor:[UIColor redColor]];
        [self addSubview:_imageView];
    }

    return _imageView;
}
- (UILabel *)label
{
    if (_label == nil) {
        _label = [[UILabel alloc]init];
        [_label setBackgroundColor:[UIColor blueColor]];
        [self addSubview:_label];
    }
    return _label;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
封装一个 Scroll-view 组件,你可以创建一个新的组件文件,例如 "ScrollViewWrapper.vue"。然后在这个文件中,你可以使用 Vue 的单文件组件语法来定义该组件。 在 "ScrollViewWrapper.vue" 文件中,你需要引入 Vue 和 scroll-view 的依赖,并创建一个名为 "ScrollViewWrapper" 的组件。在组件内部,你可以使用 scroll-view 组件来实现滚动功能,并提供一些可调整的属性和事件。 以下是一个简单的例子,演示如何封装一个基本的 scroll-view 组件: ```html <template> <scroll-view :style="scrollStyle" @scroll="handleScroll"> <slot></slot> </scroll-view> </template> <script> import ScrollView from 'scroll-view' export default { name: 'ScrollViewWrapper', components: { ScrollView }, props: { scrollStyle: { type: Object, default: () => ({}) } }, methods: { handleScroll(event) { // 处理滚动事件 console.log(event) this.$emit('scroll', event) } } } </script> <style scoped> /* 样式可以根据需要进行自定义 */ </style> ``` 在上面的例子中,我们引入了 `scroll-view` 组件,并在模板中使用了 `<scroll-view>` 标签。通过 `:style` 属性,我们可以传递一个对象给 `scroll-view` 组件,用于设置滚动视图的样式。我们还通过 `@scroll` 事件监听滚动事件,并将其通过 `$emit` 发送给父组件。 你可以根据实际需求,在示例代码中添加其他属性和方法,来满足你的具体需求。最后,在需要使用 scroll-view 的地方,你可以引入封装好的 `ScrollViewWrapper` 组件,并在其中放置需要滚动的内容。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值