年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3602|回复: 0

[实用控件] ios实战开发之xib基本介绍

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-3-30 00:36:02 | 显示全部楼层 |阅读模式
    1、效果演示




    2、基本思路
    2.1 使用storyboard将基本框架画出来,如图所示

    QQ20140330-2@2x.png

    2.2 新建一个xib,在xib中创建好需要添加到联系人列表的元素,实质为创建一个类(如RowView),将每行联系人记录当作一个对象处理
    2.3 将RowView类创建一个初始化的类方法供外界调用,视图中的各个元素可通过类成员变量的形式展示并供外界访问

    2.4 添加到主视图的哪个位置,添加及删除以何种形式进行这些都在主视图类中完成,封装思想;

    3、关键代码

    RowView.xib

    QQ20140330-1@2x.png

    SARowView.h
    1. //
    2. //  SARowView.h
    3. //  ContactList
    4. //
    5. //  Created by yusian on 14-3-29.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <UIKit/UIKit.h>
    9. @interface SARowView : UIView
    10. // 将xib上的三个子视图分别创建为该类的成员变量
    11. @property (weak, nonatomic) IBOutlet UIButton *iconButton;
    12. @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
    13. @property (weak, nonatomic) IBOutlet UIButton *deleteButton;
    14. // 提供一个类方法将xib提供给外界使用,并提供两个参数初始化对象
    15. + (id)rowViewWithIcon:(NSString *)iconName andLabelName:(NSString *)labelName;
    16. @end
    复制代码
    SARowView.m
    1. //
    2. //  SARowView.m
    3. //  ContactList
    4. //
    5. //  Created by yusian on 14-3-29.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import "SARowView.h"
    9. @implementation SARowView
    10. + (id)rowViewWithIcon:(NSString *)iconName andLabelName:(NSString *)labelName
    11. {
    12.     // 利用xib将绘制好的视图提供给方法调用者,并将视图中的元素(头像图片名、Label文件内容)通过参数的方式提供给外界访问
    13.     SARowView *view = [[NSBundle mainBundle] loadNibNamed:@"RowView" owner:nil options:nil][0];
    14.     [view.iconButton setImage:[UIImage imageNamed:iconName] forState:UIControlStateNormal];
    15.     view.nameLabel.text = labelName;
    16.     return view;
    17. }
    18. @end
    复制代码
    SAViewController.h
    1. //
    2. //  SAViewController.h
    3. //  ContactList
    4. //
    5. //  Created by yusian on 14-3-28.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <UIKit/UIKit.h>
    9. @interface SAViewController : UIViewController
    10. @property (weak, nonatomic) IBOutlet UIBarButtonItem *removeItem;
    11. - (IBAction)add:(UIBarButtonItem *)sender;  // 增加一行
    12. - (IBAction)remove:(UIBarButtonItem *)sender;   // 删除一行
    13. @end
    复制代码
    SAViewController.m
    1. //
    2. //  SAViewController.m
    3. //  ContactList
    4. //
    5. //  Created by yusian on 14-3-28.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import "SAViewController.h"
    9. #import "SARowView.h"
    10. #define kSubviewHeight 50
    11. // 类扩展(class extension,匿名分类)
    12. @interface SAViewController ()
    13. {
    14.     NSArray *_nameIndex;
    15. }
    16. @end
    17. @implementation SAViewController
    18. -(void)viewDidLoad
    19. {
    20.     [super viewDidLoad];
    21.     _nameIndex = @[@"赵一", @"钱二", @"孙三", @"李四", @"周五", @"吴六", @"郑七", @"王八", @"张九", @"余十"];
    22. }
    23. #pragma mark 增加联系人
    24. - (IBAction)add:(UIBarButtonItem *)sender {
    25.    
    26.     self.removeItem.enabled = YES;  // 只要触发添加联系人事件,即将删除按钮可用性设置为enable
    27.     int random = arc4random_uniform(9); // 创建0-9十个随机数;
    28.     NSString *imageName = [NSString stringWithFormat:@"%d.png", random];    //利用随机数创建十张随机图片
    29.     NSString *labelName = _nameIndex[random];   // 从_nameIndex(viewDidLoad中有定义)数组中取出随机取出一个字符串
    30.    
    31.     // 创建一个SARowView类型的视图,并初始化icon和labelName随机
    32.     SARowView *subview = [SARowView rowViewWithIcon:imageName andLabelName:labelName];
    33.     // 确定subView摆放位置,即新添加的subView为上一个子控件(subViews的最后一个子控件)的y值加控件高度
    34.     UIView *lastObject = [self.view.subviews lastObject];   // 取出最后一个子控件
    35.     CGFloat lastObjHeight = lastObject.frame.size.height;   // 最后一个子控件的高度
    36.     CGFloat lastObjY = lastObject.frame.origin.y;   // 最后一个子控件的y值
    37.     CGFloat superviewWidth = self.view.frame.size.width;    // 父控件的宽度
    38.     CGFloat animateDistance = kSubviewHeight;   // 动画移动距离
    39.     CGFloat subviewY = lastObjY + lastObjHeight + 1 + animateDistance;  // 新添加子控件的y值
    40.     subview.frame = CGRectMake(0, subviewY, superviewWidth, kSubviewHeight);    // 初始化子控件位置
    41.     subview.alpha = 0;  // 初始化子控件透明度为100%,为动画淡出效果做准备
    42.    
    43.     // 动画范围,{}内的数据变动将以动画形式完成
    44.     [UIView animateWithDuration:0.5 animations:^{
    45.         
    46.         // 该subView的y值上移一个动画移动距离,经过动画移动到该放的位置
    47.         CGRect tempRect = subview.frame;
    48.         tempRect.origin.y -= animateDistance;
    49.         subview.frame = tempRect;
    50.         
    51.         // 将透明度设置为1,淡出效果
    52.         subview.alpha = 1;
    53.         
    54.     }];
    55.    
    56.     // 添加到View
    57.     [self.view addSubview:subview];
    58.     // 添加两个按钮事件(头像点击与删除键点击)
    59.     [subview.iconButton addTarget:self action:@selector(iconClink:) forControlEvents:UIControlEventTouchUpInside];
    60.     [subview.deleteButton addTarget:self action:@selector(deleteClick:) forControlEvents:UIControlEventTouchUpInside];
    61. }
    62. #pragma mark 删除联系人
    63. - (IBAction)remove:(UIBarButtonItem *)sender {
    64.    
    65.     // 取出最后一个UIView元素
    66.     UIView *lastSubview = [self.view.subviews lastObject];
    67.    
    68.     // 以下代码均为动画演示代码相关
    69.     CGRect lastRect = lastSubview.frame;
    70.     lastRect.origin.y = self.view.frame.size.height;
    71.     [UIView animateWithDuration:0.5 animations:^{
    72.         lastSubview.frame = lastRect;   // 最终动画效果下移到整个视图最底端并淡出;
    73.         lastSubview.alpha = 0;
    74.     } completion:^(BOOL finished) {
    75.         
    76.         // 删除最后一个UIView元素,
    77.         [lastSubview removeFromSuperview];
    78.         self.removeItem.enabled = self.view.subviews.count > 1; // 判断如果只剩下UIToolBar了,则将删除按钮变灰
    79.     }];
    80.    
    81. }
    82. #pragma mark 联系人头像按钮
    83. - (void)iconClink:(UIButton *)sender
    84. {
    85.     // 如果点击了头像按钮,则打印出当前头像所在视图的nameLabelmwpq
    86.     SARowView *superView = (SARowView *)sender.superview;
    87.     NSLog(@"%@", superView.nameLabel.text);
    88. }
    89. #pragma mark 联系人删除按钮
    90. - (void)deleteClick:(UIButton *)btn
    91. {
    92.     //**********动画淡出删除效果开始******
    93.    
    94.     [UIView animateWithDuration:0.5 animations:^{
    95.         CGRect tempF = btn.superview.frame;
    96.         tempF.origin.x += 320;
    97.         btn.superview.frame = tempF;
    98.         btn.superview.alpha = 0;
    99.     } completion:^(BOOL finished) {
    100.         
    101.     //**********动画结束*****************
    102.    
    103.         //删除中间某行后,后续行往上移一个行距,嵌套一个动画
    104.         [UIView animateWithDuration:0.5 animations:^{
    105.             NSInteger index = [self.view.subviews indexOfObject:btn.superview];
    106.             
    107.             // 对象方法将自己从父视图中移出
    108.             [btn.superview removeFromSuperview];
    109.             self.removeItem.enabled = self.view.subviews.count > 1; // 判断当前是否为最后一个子控件,是否将删除键变灰
    110.             
    111.             // 利用循环将后续所有的对象往上移动一个行间距
    112.             for (NSInteger i = index; i < self.view.subviews.count; i++) {
    113.                 UIView *temp = self.view.subviews[i];
    114.                 CGRect tempFrame = temp.frame;
    115.                 tempFrame.origin.y -= 51;
    116.                 temp.frame = tempFrame;
    117.             }
    118.         }];
    119.     }];
    120. }
    121. @end
    复制代码
    4、源代码下载
    游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0

    5、参考链接
    图片与按钮示例:ios实战开发之汤姆猫
    ios实战开发之UISegmentedControl





    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-4-27 17:23 , Processed in 0.052980 second(s), 24 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表