UIProgressView
からnib
を作成しています。高さを増やしたいのですが、9に固定されています。iPad
の場合、高さを増やす必要があります。どうすればできますか?
前もって感謝します。
Nibを使用してUIProgressViewの高さを変更することはできません。高さを変更する場合は、カスタム描画メソッドを使用して実装する必要があります。
CGAffineTransformを使用して寸法を変更します。
CGAffineTransform transform = CGAffineTransformMakeScale(1.0f, 3.0f);
progressView.transform = transform;
レイアウト制約を使用するとうまくいきました:
このソースを配置
@implementation UIProgressView (customView)
- (CGSize)sizeThatFits:(CGSize)size {
CGSize newSize = CGSizeMake(self.frame.size.width, 9);
return newSize;
}
@end
UIProgressViewのフレームは、初期化後にコードで設定するだけです。例えば:
UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
// progressView's frame will be small/standard height
progressView.frame = CGRectMake(0, 0, 100, 20);
// Now the frame is set to my custom rect.
これはiOS 5で機能しています。ただし、カスタムtrackImageとprogressImageを使用しています。私のコードは次のようになります。私はprogressViewを別のビューに追加し、それを含むビューと同じサイズにしたいので、フレームをself.boundsに設定することに注意してください。
_progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
_progressView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
_progressView.trackImage = [[UIImage imageNamed:@"search-progress-track"] resizableImageWithCapInsets:UIEdgeInsetsMake(3.0f, 3.0f, 3.0f, 3.0f)];
_progressView.progressImage = [[UIImage imageNamed:@"search-progress"] resizableImageWithCapInsets:UIEdgeInsetsMake(3.0f, 3.0f, 3.0f, 3.0f)];
_progressView.frame = self.bounds;
[_progressView setProgress:0.5];
Interface Builder内で高さを変更する簡単な方法があります。コードは不要で、変更はIBに表示されます。
ストーリーボードまたはxibでUIProgressViewオブジェクトを選択し、エディター>ピン>高さを選択します。これにより、高さの制約が作成され、左端の(使用)パネルの属性インスペクターで値を変更できます。
スウィフト3:
progressView.transform = progressView.transform.scaledBy(x: 1, y: 9)
次のコードは最新のSwift xCodeで動作します:
var transform : CGAffineTransform = CGAffineTransformMakeScale(1.0, 6.0)
progressView.transform = transform
Swift
var transform : CGAffineTransform = CGAffineTransform(scaleX: 1.0, y: 6.0)
progressBar.transform = transform
補遺
IBDesignable
クラスを使用している場合は、ストーリーボードからこれを調整できます。
@IBInspectable var progressBarHeight: CGFloat = 2.0 {
didSet {
let transform = CGAffineTransform(scaleX: 1.0, y: progressBarHeight)
self.progressView.transform = transform
}
}
ここに解決策があります
変換を使用できますが、デバイスの向きを変更すると、UIProgressViewの高さが元の高さに変わるという問題が発生します。
UIProgressViewの高さを増やす最良の方法は
yourProgressView.progressImage=[UIImage imageNamed:@"image1.png"];
yourProgressView.trackImage = [UIImage imageNamed:@"image2.png"];
// IMPORTANT: image1/image2 height (in pixel) = height that you want for yourProgressView.
// no need to set other properties of yourProgressView.
ありがとうございました
AutoLayoutを使用して同じ外観を実現し、iOS 7.1でも機能します。進行状況バーの高さと同じ高さの制約を追加するだけです。詳細については、この同様の質問に関するこの回答をご覧ください。
IOS 7以降の場合、Core GraphicsおよびCATransform3DScaleを使用して、そのビューのレイヤーをスケーリングします。
CATransform3D transform = CATransform3DScale(progressView.layer.transform, 1.0f, 3.0f, 1.0f);
progressView.layer.transform = transform;
これを行うことを確認してくださいafterbeforeではなく、progressViewのフレームを設定します。
IOS 7以降では、次のことを行いました。(a)動作し、(b)警告を生成しません。
最初にUIProgressView
をストーリーボードのView Controllerに追加します。次に、Ctrlキーを押しながらUIProgressView
をドラッグして、UIProgressView
にHeight制約を追加します。制約は、2
のデフォルト値で作成されます。放っておけ。
高さを変更するには、次のようなコードでIBOutlet
をUIViewController
サブクラスに追加します。
@property (nonatomic, weak) IBOutlet NSLayoutConstraint *progressHeight;
次に、コードに、おそらく- viewDidLoad
を追加します。
self.progressHeight.constant = 9;
これはあなたのためにうまくいくはずです。
高さを設定できるサードパーティのプログレスバーがあります。 https://github.com/yannickl/YLProgressBar
コードまたはインターフェイスビルダーを介してフレームを設定します。ただし、アニメーションまたはストライプを無効にすることもできます。
濃い緑色のプログレスバーのコードは次のとおりです。
YLProgressBar *bar = [[YLProgressBar alloc] initWithFrame:CGRectMake(0, 100, 100, 50)];
bar.progress = 0.5;
bar.type = YLProgressBarTypeFlat;
bar.hideStripes = YES;
bar.behavior = YLProgressBarBehaviorDefault;
bar.progressTintColors = @[[UIColor greenColor], [UIColor greenColor]];
カテゴリ(新しいファイル-カテゴリ)を実装し、クラスの最初にカテゴリを追加するだけです。 iboutlet(nib/storyboard)でも正常に動作します。
コードはただ
@interface UIProgressView (heavyView)
@end
@implementation UIProgressView (heavyView)
- (CGSize)sizeThatFits:(CGSize)size
{
CGSize newSize = CGSizeMake(size.width, 9);
return newSize;
}
@end
1つのprogressViewのみに変更を適用し、クラスに複数のprogressViewがある場合、代わりにサブクラスを使用できます。
MayurのメソッドはiOS 7でうまく機能しました。ここにコードがあります(UIImage + BBlockを使用)
CGFloat progressViewHeight = 5;
[[UIProgressView appearance] setProgressImage:[UIImage imageForSize:CGSizeMake(1, progressViewHeight) withDrawingBlock:^{
CGContextRef context = UIGraphicsGetCurrentContext();
UIColor * colortoUse = [UIColor blueColor];
CGContextSetFillColorWithColor(context, [colortoUse CGColor]);
CGContextFillRect(context, CGRectMake(0, 0, 1, progressViewHeight));
}]];
[[UIProgressView appearance] setTrackImage:[UIImage imageForSize:CGSizeMake(1, progressViewHeight) withDrawingBlock:^{
CGContextRef context = UIGraphicsGetCurrentContext();
UIColor * colortoUse = [UIColor progressViewBackgroundColor];
CGContextSetFillColorWithColor(context, [colortoUse CGColor]);
CGContextFillRect(context, CGRectMake(0, 0, 1, progressViewHeight));
}]];
インターフェイスビルダーを使用する代わりに、UIProgressView
の高さをプログラムで制約を追加することで変更できます。
UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
progressView.translatesAutoresizingMaskIntoConstraints = NO;
CGRect frame = CGRectMake(100, 200, 200, 50);
[self.view addSubview:progressView];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-y-[progressView(height)]" options:0
metrics:@{@"y": @(CGRectGetWidth(frame)),
@"height": @(CGRectGetHeight(frame))}
views:NSDictionaryOfVariableBindings(progressView)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-x-[progressView(width)]" options:0
metrics:@{@"x": @(CGRectGetMinX(frame)),
@"width": @(CGRectGetWidth(frame))}
views:NSDictionaryOfVariableBindings(progressView)]];
サブクラスを作成し、固有のサイズを調整します。
class FatProgressView: UIProgressView {
override var intrinsicContentSize: CGSize {
return CGSize(width: UIView.noIntrinsicMetric, height: 20.0)
}
}