iOSiOS入门Demo

06.项目实战 百思不得姐 精华子控制器view懒加载,监听状态

2016-01-28  本文已影响1164人  Liwx

@(iOS 项目实战)[项目实战]


目录


【相关知识点补充】

UIScrollView动画滚动方式

UIScrollView监听停止滚动

坐标系转换

    // 描述控件A在window中的x\y\width\height
    CGRect rect = [A.superview convertRect:A.frame toView:window];
    CGRect rect = [A.superview convertRect:A.frame toView:nil];
    CGRect rect = [A convertRect:A.bounds toView:window];
    CGRect rect = [A convertRect:A.bounds toView:nil];
    CGRect rect = [window convertRect:A.frame fromView:A.superview];
    CGRect rect = [window convertRect:A.bounds fromView:A];

判断是否重叠

- (BOOL)wx_intersectWithView:(UIView *)view
{
    // 如果传入的参数是nil,则表示为[UIApplication sharedApplication].keyWindow
    if (view == nil) view = [UIApplication sharedApplication].keyWindow;
    
    // 都统一转换成window坐标系,并判断是否重叠,返回判断结果
    CGRect rect1 = [self convertRect:self.bounds toView:nil];
    CGRect rect2 = [view convertRect:view.bounds toView:nil];
    return CGRectIntersectsRect(rect1, rect2);
}

导航条按钮显示异常bug

// 如果super的方法名写错,会出现界面显示的一些小问题
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

状态栏点击事件


UIWindow相关知识点

监听按钮事件


1.精华子控制器view懒加载

子控制器view懒加载实现

// ----------------------------------------------------------------------------
// 添加子控制器
- (void)setupAllChildViewController
{
    // 1.添加5个子控制器
    [self addChildViewController:[[WXAllViewController alloc] init]];
    [self addChildViewController:[[WXVideoViewController alloc] init]];
    [self addChildViewController:[[WXVoiceViewController alloc] init]];
    [self addChildViewController:[[WXPictureViewController alloc] init]];
    [self addChildViewController:[[WXWordViewController alloc] init]];
    
    // 2.获取子控制器数量
    NSInteger count = self.childViewControllers.count;
    // 设置默认显示第0个子控制器的view
    [self addChildVcViewIntoScrollView:0];
    // 3.设置scrollView的滚动范围
    self.scrollView.contentSize = CGSizeMake(count * self.scrollView.wx_width, 0);
}
#pragma =======================================================================
#pragma mark - titleButton按钮点击
// ----------------------------------------------------------------------------
// 监听按钮点击
- (void)titleButtonClick:(WXTitleButton *)button
{
    // 切换中状态
    self.selectedButton.selected = NO;
    button.selected = YES;
    self.selectedButton = button;
    
    // 1.获取索引,按钮的tag值
    NSInteger index = button.tag;
    
    // 2.执行下划线动画,动画执行完成修改scrollView的偏移量,显示对应子控制器的view
    [UIView animateWithDuration:0.25 animations:^{
        
        // TODO: 设置下划线的宽度和中心点
        self.underLineView.wx_width = button.titleLabel.wx_width;
        self.underLineView.wx_centerX = button.wx_centerX;
        
        // 切换到对应的view
        self.scrollView.contentOffset = CGPointMake(self.scrollView.wx_width * index, self.scrollView.contentOffset.y);
    } completion:^(BOOL finished) {
        // 更新偏移量
        CGPoint offset = self.scrollView.contentOffset;
        offset.x = index * self.scrollView.wx_width;
        [self.scrollView setContentOffset:offset];
        
        // 添加对应子控制器的view
        [self addChildVcViewIntoScrollView:index];
    }];
}

2.监听顶部状态栏区域的点击

监听顶部状态栏的点击事件的实现

3.状态栏点击控制tableView滚动

查找所有的scrollView

// ----------------------------------------------------------------------------
// 判断方法调用者和view是否重叠
- (BOOL)wx_intersectWithView:(UIView *)view
{
    // 如果传入的参数是nil,则表示为[UIApplication sharedApplication].keyWindow
    if (view == nil) {
        view = [UIApplication sharedApplication].keyWindow;
    }
    
    // 都统一转换成window坐标系,并判断是否重叠,返回判断结果
    CGRect rect1 = [self convertRect:self.bounds toView:nil];
    CGRect rect2 = [view convertRect:view.bounds toView:nil];
    return CGRectIntersectsRect(rect1, rect2);
}

4.监听tabBarButton的重复点击


监听tabBarButton重复点击方式一(使用tabBarButton addTarget方式,本项目使用此方式)


监听tabBarButton重复点击方式二(使用UITabBarController的代理方式)

// ----------------------------------------------------------------------------
// 监听点击跳过按钮
- (IBAction)jump {
    
    // 关闭定时器
    [self.timer invalidate];
    
    WXTabBarController *tabBarVc = [[WXTabBarController alloc] init];
    tabBarVc.delegate = (id<UITabBarControllerDelegate>)[UIApplication sharedApplication].delegate;
    [UIApplication sharedApplication].keyWindow.rootViewController = tabBarVc;
}
// ----------------------------------------------------------------------------
// 监听tabBarController当前选中哪个控制器
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    // selectedVc用于存放TabBarController上一次选中的控制器
    static UIViewController *selectedVc = nil;
    
    // 设置初始化上一次选中的控制器为tabBarController的第0个子控制器.
    if (selectedVc == nil) {
        selectedVc = tabBarController.childViewControllers[WXDefaultVcIndex];
    }
    
    // 如果上一次选中的控制器和当前选中控制器一样,表示重复点击,发送通知
    if (selectedVc == viewController) {
        [[NSNotificationCenter defaultCenter] postNotificationName:WXTabBarButtonDidRepeatClickNotification object:nil];
    }
    
    // 更新上一次选中控制器
    selectedVc = viewController;
}

子控制器监听tabBarButton重复点击通知

- (void)viewDidLoad {
    [super viewDidLoad];
    
    WXFunc();
    
    self.view.backgroundColor = WXRandomColor;
    self.tableView.contentInset = UIEdgeInsetsMake(WXNavMaxY + WXTitlesViewH, 0, WXTabBarH, 0);
    
    // 1.监听通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarButtonDidRepeatClick) name:WXTabBarButtonDidRepeatClickNotification object:nil];
}

#pragma =======================================================================
#pragma mark - 监听tabBarButton重复点击通知
- (void)tabBarButtonDidRepeatClick
{
    NSLog(@"%@: 重复点击,执行下拉刷新", [self class]);
}

- (void)dealloc
{
    // 移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
上一篇下一篇

猜你喜欢

热点阅读