便利的初始化view以及設定tag值,初始化viewtag

來源:互聯網
上載者:User

便利的初始化view以及設定tag值,初始化viewtag

便利的初始化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;@endNS_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中擷取

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.