zoukankan      html  css  js  c++  java
  • 便利的初始化view以及设置tag值

    便利的初始化view以及设置tag值

    效果

    源码

    https://github.com/YouXianMing/iOS-Project-Examples 中的 SetRect

    //
    //  AccessViewTagProtocol.h
    //  Animations
    //
    //  Created by YouXianMing on 16/6/17.
    //  Copyright © 2016年 YouXianMing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    typedef void(^ViewSetupBlock)(UIView * view);
    
    @protocol AccessViewTagProtocol <NSObject>
    
    @required
    
    /**
     *  Set the view whose tag matches the specified value.
     *
     *  @param view View.
     *  @param tag  tag.
     */
    - (void)setView:(UIView *)view withTag:(NSInteger)tag;
    
    /**
     *  Remove the tag.
     *
     *  @param tag View's tag.
     */
    - (void)removeReferenceWithTag:(NSInteger)tag;
    
    /**
     *  Get the view from the tag.
     *
     *  @param tag.
     *
     *  @return view's object.
     */
    - (id)viewWithTag:(NSInteger)tag;
    
    @end
    //
    //  UIView+FrameAndTag.h
    //  SetRect
    //
    //  Created by YouXianMing on 16/6/19.
    //  Copyright © 2016年 YouXianMing. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    #import "AccessViewTagProtocol.h"
    
    @interface UIView (FrameAndTag) <AccessViewTagProtocol>
    
    #pragma mark - Set tags.
    
    /**
     *  Support AccessViewTagProtocol.
     */
    - (void)supportAccessViewTagProtocol;
    
    /**
     *  Get the view with specified tag from CustomViewController type's controller.
     *
     *  @param tag    View's tag.
     *  @param object AccessViewTagProtocol's object.
     *
     *  @return The view.
     */
    + (instancetype)viewWithTag:(NSInteger)tag from:(id <AccessViewTagProtocol>)object;
    
    /**
     *  Set the view's tag.
     *
     *  @param tag    View's tag.
     *  @param object AccessViewTagProtocol's object.
     */
    - (void)setTag:(NSInteger)tag attachedTo:(id <AccessViewTagProtocol>)object;
    
    #pragma mark - Init frames.
    
    /**
     *  设置尺寸以及设置tag值
     */
    + (instancetype)viewWithFrame:(CGRect)frame insertIntoView:(UIView *)view tag:(NSInteger)tag
                       attachedTo:(id <AccessViewTagProtocol>)object setupBlock:(ViewSetupBlock)block;
    
    /**
     *  设置尺寸
     */
    + (instancetype)viewWithFrame:(CGRect)frame insertIntoView:(UIView *)view setupBlock:(ViewSetupBlock)block;
    
    #pragma mark - Init line view.
    
    /**
     *  水平线条
     */
    + (instancetype)lineViewInsertIntoView:(UIView *)view positionY:(CGFloat)positionY thick:(CGFloat)thick
                                   leftGap:(CGFloat)leftGap rightGap:(CGFloat)rightGap color:(UIColor *)color;
    
    /**
     *  垂直线条
     */
    + (instancetype)lineViewInsertIntoView:(UIView *)view positionX:(CGFloat)positionX thick:(CGFloat)thick
                                    topGap:(CGFloat)topGap bottomGap:(CGFloat)bottomGap color:(UIColor *)color;
    
    @end
    
    NS_INLINE id viewFrom(id <AccessViewTagProtocol> object, NSInteger tag) {
        
        return [UIView viewWithTag:tag from:object];
    }
    //
    //  UIView+FrameAndTag.m
    //  SetRect
    //
    //  Created by YouXianMing on 16/6/19.
    //  Copyright © 2016年 YouXianMing. All rights reserved.
    //
    
    #import <objc/runtime.h>
    #import "UIView+FrameAndTag.h"
    
    @interface UIView ()
    
    @property (nonatomic, strong) NSNumber  *tagNumberValue;
    @property (nonatomic, strong) NSMapTable <NSString *, UIView *> *viewsWeakMap;
    
    @end
    
    @implementation UIView (FrameAndTag)
    
    - (void)supportAccessViewTagProtocol {
        
        self.viewsWeakMap = [NSMapTable strongToWeakObjectsMapTable];
    }
    
    + (instancetype)viewWithTag:(NSInteger)tag from:(id <AccessViewTagProtocol>)object {
        
        return [object viewWithTag:tag];
    }
    
    - (void)setTag:(NSInteger)tag attachedTo:(id <AccessViewTagProtocol>)object {
        
        self.tagNumberValue ? [object removeReferenceWithTag:self.tagNumberValue.integerValue] : 0;
        self.tag            = tag;
        self.tagNumberValue = @(tag);
        [object setView:self withTag:tag];
    }
    
    + (instancetype)viewWithFrame:(CGRect)frame
                   insertIntoView:(UIView *)view
                              tag:(NSInteger)tag
                       attachedTo:(id <AccessViewTagProtocol>)object
                       setupBlock:(ViewSetupBlock)block {
        
        UIView *tmpView = [[[self class] alloc] initWithFrame:frame];
        [tmpView supportAccessViewTagProtocol];
        
        view   && [view isKindOfClass:[UIView class]]                     ? ([view addSubview:tmpView])              : 0;
        object && [object respondsToSelector:@selector(setView:withTag:)] ? ([tmpView setTag:tag attachedTo:object]) : 0;
        
        if (block) {
            
            block(tmpView);
        }
        
        return tmpView;
    }
    
    + (instancetype)viewWithFrame:(CGRect)frame
                   insertIntoView:(UIView *)view
                       setupBlock:(ViewSetupBlock)block {
        
        UIView *tmpView = [[[self class] alloc] initWithFrame:frame];
        [tmpView supportAccessViewTagProtocol];
        
        view && [view isKindOfClass:[UIView class]] ? ([view addSubview:tmpView]) : 0;
        
        if (block) {
            
            block(tmpView);
        }
        
        return tmpView;
    }
    
    + (instancetype)lineViewInsertIntoView:(UIView *)view positionY:(CGFloat)positionY thick:(CGFloat)thick
                                   leftGap:(CGFloat)leftGap rightGap:(CGFloat)rightGap color:(UIColor *)color {
        
        UIView *tmpView = [[[self class] alloc] initWithFrame:CGRectMake(leftGap, positionY, view.frame.size.width - leftGap - rightGap, thick)];
        color ? tmpView.backgroundColor = color : 0;
        [view addSubview:tmpView];
        
        return tmpView;
    }
    
    + (instancetype)lineViewInsertIntoView:(UIView *)view positionX:(CGFloat)positionX thick:(CGFloat)thick
                                    topGap:(CGFloat)topGap bottomGap:(CGFloat)bottomGap color:(UIColor *)color {
        
        UIView *tmpView = [[[self class] alloc] initWithFrame:CGRectMake(positionX, topGap, thick, view.frame.size.height - topGap - bottomGap)];
        color ? tmpView.backgroundColor = color : 0;
        [view addSubview:tmpView];
        
        return tmpView;
    }
    
    #pragma mark - Runtime property.
    
    - (void)setTagNumberValue:(NSNumber *)tagNumberValue {
        
        objc_setAssociatedObject(self, @selector(tagNumberValue), tagNumberValue, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSNumber *)tagNumberValue {
        
        return objc_getAssociatedObject(self, _cmd);
    }
    
    - (void)setViewsWeakMap:(NSMapTable<NSString *,UIView *> *)viewsWeakMap {
        
        objc_setAssociatedObject(self, @selector(viewsWeakMap), viewsWeakMap, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSMapTable<NSString *,UIView *> *)viewsWeakMap {
        
        return objc_getAssociatedObject(self, _cmd);
    }
    
    #pragma mark - AccessViewTagProtocol.
    
    - (void)setView:(UIView *)view withTag:(NSInteger)tag {
        
        [self.viewsWeakMap setObject:view forKey:@(tag).stringValue];
    }
    
    - (id)viewWithTag:(NSInteger)tag {
        
        return [self.viewsWeakMap objectForKey:@(tag).stringValue];
    }
    
    - (void)removeReferenceWithTag:(NSInteger)tag {
        
        [self.viewsWeakMap removeObjectForKey:@(tag).stringValue];
    }
    
    @end

    细节

    需要实现协议(用NSMapTable的strongToWeakObjectsMapTable来作为存储string - view)

    获取tag更为便利,不依赖于从哪一个view中获取view,而是直接从NSMapTable中获取

  • 相关阅读:
    GTK+ 3.6.2 发布,小的 bug 修复版本
    RunJS 新增 Echo Ajax 测试功能
    Mozilla 发布 Popcorn Maker,在线创作视频
    Sina微博OAuth2框架解密
    Mina状态机State Machine
    Mozilla 发布 Shumway —— 纯JS的SWF解析器
    Code Browser 4.5 发布,代码浏览器
    ROSA 2012 "Enterprise Linux Server" 发布
    ltrace 0.7.0 发布,程序调试工具
    Artifactory 2.6.5 发布,Maven 扩展工具
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/5598514.html
Copyright © 2011-2022 走看看