2013-08-19 19 views
0

我在屏幕上4個對象:(UIView的或UIButton的)更改佈局時,對象是不可見的

A B C D 

在某些情況下,我需要隱藏一個或更多的人,這將導致此:

A C D 

或本:

A  D 

有iOS 5中(的方式不能用AutoLayout)(使用大量的IFS和編程方式設置的位置)來修整空間,並迫使上述示例看起來像這樣旁:

A C D 
A D 
+3

我想沒有簡單的方法。您需要編寫代碼來更改框架或變換。 –

+0

幸運的是我只有1-4個對象可以顯示。如果我需要顯示和隱藏10個物體,該怎麼辦?這是很多ifs。 – Segev

+0

使用關鍵值觀察(KVO)。當一個視圖被隱藏時,您會看到該消息,因此您可以轉移其他視圖。在這種情況下,你不需要很多ifs。 –

回答

0

我用KVO實現這一點。
第1步:註冊ViewController作爲觀察員在所有視圖中隱藏屬性的更改。

[_view1 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; 
[_view2 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; 
[_view3 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; 
[_view4 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; 

第2步: Add方法來應對變化中ViewController

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 
    if(![object isEqual:[viewArray lastObject]]){ 
    UIView *viewToHide = (UIView *)object; 
    CGRect newFrame = viewToHide.frame; 
    CGRect oldFrame; 
    int indexOfObject = [viewArray indexOfObject:object]; 
    for(int i = indexOfObject + 1; i < viewArray.count; i++){ 
     UIView *viewToChange = [viewArray objectAtIndex:i]; 
     if(viewToChange.hidden){ 
     continue; 
     } 
     else{ 
     oldFrame = viewToChange.frame; 
     viewToChange.frame = newFrame; 
     [viewArray replaceObjectAtIndex:i withObject:viewToChange]; 
     newFrame = oldFrame; 
     } 
    } 
    } 
} 

第3步通知:我輕敲他們躲在意見。當然,你可以以任何你想要的方式實現這一點。

- (IBAction)viewTapped :(UIGestureRecognizer *)recogniser{ 
    CGPoint touchPoint = [recogniser locationInView:self.view]; 
    UIView *touchView = [self.view hitTest:touchPoint withEvent:nil]; 
    if([touchView isKindOfClass:[UIView class]]){ 
    touchView.hidden = YES; 
    } 
}