2013-05-20 175 views
0

在我的viewcontroller中,有幾個視圖。所有視圖的幀是依賴於可變如何在變量值更改時更改視圖的框架?

CGFloat的邊框寬度

這些視圖定義像

sec1 = [[MSSectionView alloc]initWithFrame:CGRectMake(self.borderWidth, self.borderWidth,self.frame.size.width/2-(self.borderWidth*3/2),self.frame.size.height/2 - (self.borderWidth*3/2)) ]; 

我想改變SEC1的幀時,我的borderwidth值從另一個類而改變。 我們該怎麼做? 我知道

[sec1 setFrame:CGRectMake(self.borderWidth, self.borderWidth,self.frame.size.width/2-(self.borderWidth*3/2),self.frame.size.height/2 - (self.borderWidth*3/2))];

將改變框架,但也有很多uiviews的。所以我不能在這個方法中爲它們設置框架。

+0

所有的子視圖的框架計算相同的方式? –

回答

0

爲了實現這一個,需要一個for循環並更改所有框架。

for(UIView *subview in yourview.subviews) 
{ 
    // Here you can change your frames based on the condition 
    //here you will get old frame value of subview so you can change by using the old frame values of all the subviews. 
    [subview setFrame:CGRectMake(self.borderWidth, self.borderWidth,self.frame.size.width/2-(self.borderWidth*3/2),self.frame.size.height/2 - (self.borderWidth*3/2))]; 
} 
+0

我的所有部分都沒有相同的框架。每個幀都不相同。 – manujmv

+0

一旦檢查我編輯的答案 – Balu

+0

我知道它會起作用。如果只有一個uiview,很容易。但我有大約40 uiview與不同的框架。所以我不能在這個方法中設置它們中的每一個 – manujmv

0

您可以考慮使用KVO。觀察borderWidth在您的sec1課程中的變化。這樣,如果borderWidthe更改,您的sec1類可以相應地更改。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self addObserver:self forKeyPath:@"borderWidth" options:NSKeyValueObservingOptionNew context:&self->borderWidth]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if (context == &self.borderWidth) { 
     if ([keyPath isEqualToString:@"borderWidth"]) { 
      // Calculate your subview's frame. 
     } 
    } 
} 
1

您可以實現這樣的:

在MSSectionView.m:

#import "MSSectionView.h" 

@implementation MSSectionView 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString: @"borderWidth"]) 
    { 
     CGFloat borderWidth = [(NSNumber*)[change objectForKey:NSKeyValueChangeNewKey] floatValue]; 
     [self setFrame: CGRectMake(borderWidth, borderWidth, self.frame.size.width/2 - (borderWidth * 3/2), self.frame.size.height/2 - (borderWidth * 3/2))]; 
    } 
    else 
    { 
     [super observeValueForKeyPath: keyPath 
          ofObject: object 
           change: change 
           context: context]; 
    } 
} 

@end 

在視圖控制器,它擁有一些MSSectionView爲子視圖:

@implementation TSViewController 

@synthesize borderWidth; 

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

    NSArray* views = [self.view subviews]; 

    for (UIView* subview in views) 
    { 
     if ([subview isKindOfClass: [MSSectionView class]]) 
     { 
      MSSectionView* sectionView = (MSSectionView*) subview; 
      [self addObserver: sectionView 
        forKeyPath: @"borderWidth" 
         options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 
         context: NULL]; 
     } 

    } 
} 

在viewcontroller.h :

@interface TSViewController : UIViewController 
{ 
    CGFloat borderWidth; 
} 

@property(nonatomic,readwrite,assign)CGFloat borderWidth;