UIView装饰模式示例

时间:2014-05-21 23:18:45

标签: ios objective-c design-patterns uiview decorator

有人可以共享一个目标c UIView装饰器模式示例。您可以参考下面的结构。

带背景的父视图

- >背景为儿童的顶栏视图

- >内容视图,背景为儿童

我试图创建类似于Pro Objective C Design Patterns装饰专家的例子。我想使用UIView而不是UIImage视图,这个例子很复杂。如果装饰师不适用,请告诉我。

我尝试自己做,但顶部栏似乎会覆盖父视图。

1 个答案:

答案 0 :(得分:4)

我必须解决这个问题。

首先,我创建了一个协议所在的头文件。

@interface Window : NSObject
@end
@protocol Window <NSObject>
@optional
-(void)draw;
-(NSString*)getDescription;
-(UIView*)addView;
@end

创建了一个具体的窗口:

@implementation SimpleWindow
-(void)draw{
}

-(NSString*)getDescription{
    return @"simple window";
}

-(UIView*)addView{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 450)];
    [view setBackgroundColor:[UIColor orangeColor]];
     return view;
}

创建装饰/视图功能/插件:

@implementation VerticalScrollBarDecorator
- (instancetype)initWithDecoratedWindow:(id<Window>)win
{
    self = [super init];
    if (self) {
        decoratedWindow = win;
    }
    return self;
}

-(void)draw{  
}

-(void)drawVerticalScrollBar{   
}

-(NSString *)getDescription{
    return  [NSString stringWithFormat:@"%@, %@",[super getDescription], @"including vertical scrollbars" ];
}

-(UIView*)addView{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 450)];
    [view setBackgroundColor:[UIColor greenColor]];
    UIView *superView = [super addView];
    [superView addSubview:view];
    return superView;
}

在viewDidLoad中实现它,例如:

- (void)viewDidLoad
{
    [super viewDidLoad];
    id<Window> decoratedWindow = [[VerticalScrollBarDecorator alloc] initWithWindow:[[SimpleWindow alloc] init]];
    decoratedWindow = [[HorizontalScrollBarDecorator alloc] initWithWindow:decoratedWindow];
    NSLog(@"%@", [decoratedWindow getDescription]);
    [self.view addSubview:[decoratedWindow addView]];
}

这将导致主视图将一些视图添加为子视图。有很多方法可以实现相同的结果,但我想在Objective C上遵循相同的模式,因为我也用Java编写了Android。顺便说一句,这是基于维基百科中的Java示例。