アスペクト フィット オプションを使用して、あるビューを別のビューに挿入したいと考えています。contentMode
しかし、いくつかの理由で設定することはできません。
CGRect
外側に合わせて内側のサイズを変更することで解決策を提供できますCGRect
か?
はい、同様の質問がたくさんありますが、そのような解決策を提供する人はいません。
アスペクト フィット オプションを使用して、あるビューを別のビューに挿入したいと考えています。contentMode
しかし、いくつかの理由で設定することはできません。
CGRect
外側に合わせて内側のサイズを変更することで解決策を提供できますCGRect
か?
はい、同様の質問がたくさんありますが、そのような解決策を提供する人はいません。
アスペクト比を維持しながら、指定された 内に収まるようにスケーリングした後CGRect
、指定された の を返します。はの中央に配置されます。innerRect
outerRect
innerRect
outerRect
static inline CGRect aspectFitRect(CGRect outerRect, CGRect innerRect) {
// the width and height ratios of the rects
CGFloat wRatio = outerRect.size.width/innerRect.size.width;
CGFloat hRatio = outerRect.size.height/innerRect.size.height;
// calculate scaling ratio based on the smallest ratio.
CGFloat ratio = (wRatio < hRatio)? wRatio:hRatio;
// The x-offset of the inner rect as it gets centered
CGFloat xOffset = (outerRect.size.width-(innerRect.size.width*ratio))*0.5;
// The y-offset of the inner rect as it gets centered
CGFloat yOffset = (outerRect.size.height-(innerRect.size.height*ratio))*0.5;
// aspect fitted origin and size
CGPoint innerRectOrigin = {xOffset+outerRect.origin.x, yOffset+outerRect.origin.y};
CGSize innerRectSize = {innerRect.size.width*ratio, innerRect.size.height*ratio};
return (CGRect){innerRectOrigin, innerRectSize};
}
これを次のように使用できます。
// outer rect
CGRect outerRect = CGRectMake(0, 100, self.view.bounds.size.width, 500);
// outer rect's view
UIView* v = [[UIView alloc] initWithFrame:outerRect];
v.backgroundColor = [UIColor greenColor];
[self.view addSubview:v];
// inner rect
CGRect innerRect = CGRectMake(0, 0, self.view.bounds.size.width*2, 500);
CGRect scaledInnerRect = aspectFitRect(v.bounds, innerRect);
// inner rect's view
UIView* v1 = [[UIView alloc] initWithFrame:scaledInnerRect];
v1.backgroundColor = [UIColor redColor];
[v addSubview:v1];
この場合、innerRect
は に対して幅が広すぎるため、outerRect
幅に応じてスケーリングされます。
ここで、赤い部分がinnerRect
で、緑の部分がouterRect
です。どちらも元は同じ高さでしたが、縮小後 (幅が 2 倍になったため)、innerRect
の高さは の半分になりましたouterRect
。
ここでinnerRect
は、 がサブビューとして に追加されouterRect
ます。それらを同じスーパービューに追加したい場合は、 ではなく を関数に渡すことがouterRect
できframe
ますbounds
。
// Your First View
UIView *firstView = self;
// Your second View
UIView *secondView = [[UIView alloc] initWithFrame:CGRectZero]; change
newSubview.translatesAutoresizingMaskIntoConstraints = NO;
[containerView addSubview:newSubview];
// Top Constraint
[firstView addConstraint:[NSLayoutConstraint constraintWithItem:secondView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:firstView
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0]];
// Leading Constraint
[firstView addConstraint:[NSLayoutConstraint constraintWithItem:secondView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:firstView
attribute:NSLayoutAttributeLeading
multiplier:1.0
constant:0.0]];
// Bottom Constraint
[firstView addConstraint:[NSLayoutConstraint constraintWithItem:secondView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:firstView
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:0.0]];
// Trailing Constraint
[firstView addConstraint:[NSLayoutConstraint constraintWithItem:secondView
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:firstView
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:0.0]];
}
これはあなたに役立つと思います。