@interface UIView (resizeToFit) -(void)resizeToFitSubviews; -(void)resizeHightToFitSubviews; -(void)resizeWidthToFitSubviews; @end @implementation UIView (resizeToFit) -(void)resizeToFitSubviews { float w = 0; float h = 0; for (UIView *v in [self subviews]) { float fw = v.frame.origin.x + v.frame.size.width; float fh = v.frame.origin.y + v.frame.size.height; w = MAX(fw, w); h = MAX(fh, h); } [self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, w, h)]; } -(void)resizeHightToFitSubviews{ float h = 0; for (UIView *v in [self subviews]) { float fh = v.frame.origin.y + v.frame.size.height; h = MAX(fh, h); } [self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, h)]; } -(void)resizeWidthToFitSubviews{ float w = 0; for (UIView *v in [self subviews]) { float fw = v.frame.origin.x + v.frame.size.width; w = MAX(fw, w); } [self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, w, self.frame.size.height)]; } @end
enter image description here Code is worth a billion words. Here is the solution: @interface UIView (UIView_Expanded) - (void)resizeToFitSubviews; @end @implementation UIView (UIView_Expanded) - (void)resizeToFitSubviews { // 1 - calculate size CGRect r = CGRectZero; for (UIView *v in [self subviews]) { r = CGRectUnion(r, v.frame); } // 2 - move all subviews inside CGPoint fix = r.origin; for (UIView *v in [self subviews]) { v.frame = CGRectOffset(v.frame, -fix.x, -fix.y); } // 3 - move frame to negate the previous movement r = CGRectOffset(r, fix.x, fix.y); [self setFrame:r]; } @end
版权声明:本文为博主原创文章,未经博主允许不得转载。