2016-11-11 54 views
0

我嘗試顯示覆選標記(GitHub WVCheckMark),當我點擊按鈕。這裏是代碼,只有當我第二次點擊按鈕時纔有效。如何正確添加和顯示水龍頭UIView

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    mark = [[WVCheckMark alloc] init];//WithFrame:CGRectMake(50, 50, 100, 100)]; 
    mark.backgroundColor = [UIColor clearColor]; 

    //[mark setFrame:CGRectMake(100, 100, 100, 100)]; 
    //[self.view addSubview:mark]; 
} 

- (IBAction) btnShow{ 

    [mark setFrame:CGRectMake(100, 100, 100, 100)]; 
    [self.view addSubview:mark]; 
    [mark setNeedsDisplay]; 
    [mark updateConstraints]; 
    [mark setNeedsLayout]; 

    [mark start]; 
} 

如果在viewDidLoad中使用addSubview,這就是我想要的(點擊並顯示)。

調用這個方法並沒有幫助。

[mark setNeedsDisplay]; 
[mark updateConstraints]; 
[mark setNeedsLayout]; 

是否可以添加子視圖並將其顯示在代碼的一個位置?

的完整代碼

#import "ViewController.h" 
#import "TestCheckmark-Swift.h" 

@interface ViewController() 

@end 

WVCheckMark *mark; 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    mark = [[WVCheckMark alloc] initWithFrame:CGRectMake(50, 50, 100, 100)]; 
    mark.backgroundColor = [UIColor clearColor]; 

    [mark setFrame:CGRectMake(100, 100, 100, 100)]; 
    //[self.view addSubview:mark]; 
} 

- (IBAction) btnShow{ 

    //[mark setFrame:CGRectMake(100, 100, 100, 100)]; 
    //[self.view addSubview:mark]; 
    [mark setNeedsDisplay]; 
    [mark updateConstraints]; 
    [mark setNeedsLayout]; 

    [mark start]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


@end 
+0

調試'btnShow'。它被稱爲? (刪除三個setNeed ... updateCo ...) – shallowThought

+0

根據viewCont生命週期調用方法'viewDidLoad','viewWillAppear'和'viewDidAppear',只需在'viewDidAppear'中添加按鈕,然後在其上應用任何代碼。 – vaibhav

+0

@shallowThought是的,當我點擊它的第一次時btnShow調用 – olegi

回答

0

簡短的回答:在OP代碼不需要調用setNeedsDisplaysetNeedsLayoutupdateConstraints上添加的視圖,但它確實需要調用addSubview:父視圖,如[self.view addSubview:mark];

但是要深入一點,它看起來像GitHub上的WVCheckMark是UIView的一個子類。這是一件好事,因爲這意味着我們可以指望從UIView繼承的一些理想的東西。

例如,.alpha屬性,這是改變可見性而不會混淆視圖層次結構(添加和刪除子視圖)的好方法。 .alpha的另一個好處是 - 不像.hidden - alpha可以是動畫。

因此,讓我們在一個地方設置視圖層次結構和框架。主要想法 - 也許最令OP代碼混淆的想法是致電addSubview:。懶惰地進行設置是確保我們只在我們需要的時候完成一次的好方法。

- (WVCheckMark *)mark { 
    WVCheckMark *mark = [self.view viewWithTag:64]; // 64 must be non-zero and unique amongst self.view subviews 
    if (!mark) { 
     mark = [[WVCheckMark alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 
     mark.tag = 64; // so we can find it later 
     mark.backgroundColor = [UIColor clearColor]; 
     // start out invisible 
     mark.alpha = 0.0; 
     // important, addSubview, which is probably the main problem in the OP 
     [self.view addSubview:mark]; 
    } 
    return mark; 
} 

現在,每當你需要顯示/隱藏這一觀點,只是這樣做:

self.mark.alpha = 1.0; // show 
self.mark.alpha = 0.0; // hide 

由於該屬性設置動畫,就可以得到一點點花哨褪色這樣的:

- (void)setMarkHidden:(BOOL)hidden animated:(BOOL)animated { 
    NSTimeInterval duration = (animated)? 0.3 : 0.0; 
    CGFloat alpha = (hidden)? 0.0 : 1.0; 

    [UIView animateWithDuration:duration animations:^{ 
     self.mark.alpha = alpha; 
    }]; 
} 

你可以扔掉你所有的其他複選標記相關的代碼,只要按下按鈕來觸發外觀就可以做到這一點...

- (IBAction)pressed:(id)sender { 
    [setMarkHidden:YES animated:YES]; 
}