0

いくつかの棒グラフ (グラフごとに 30 以上のバー) と画面の下部からのプルアップ メニューを含む iPad アプリを作成しています。設計では、これらのバーの左上隅と右上隅の角を丸くする必要がありますが、左下と右下の角は直角にする必要があります。

現在、マスク レイヤーを使用して、個々のグラフ バーの上部の角を丸めています。

#import "UIView+RoundedCorners.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIView (RoundedCorners)

-(void)setRoundedCorners:(UIRectCorner)corners radius:(CGFloat)radius {
    CGRect rect = self.bounds;

    // Create the path 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect 
                                                   byRoundingCorners:corners
                                                         cornerRadii:CGSizeMake(radius, radius)];

    // Create the shape layer and set its path
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = rect;
    maskLayer.path = maskPath.CGPath;

    // Set the newly created shape layer as the mask for the view's layer
    self.layer.mask = maskLayer;
    self.layer.shouldRasterize = YES;
}

@end

これは機能しますが、プルアップ メニューをプルアップすると、重大なフレーム ロス/ラグが発生します (メニューが重なってグラフの上に表示されることに注意してください)。丸みを帯びた角を取り除くと、メニューが美しく引き上がります。私が集めたものから、マスクレイヤーを使用するのではなく、ビューを直接変更して角を丸くする方法が必要です。どうすればこれをやってのけることができるか、または別の可能な解決策を知っている人はいますか? どんな助けでも大歓迎です

4

2 に答える 2

4

私が集めたものから、マスクレイヤーを使用するのではなく、ビューを直接変更して角を丸くする方法が必要です。どうすればこれをやってのけることができるか、または別の可能な解決策を知っている人はいますか?

通常の方法は、ビューのレイヤーを取得してcornerRadiusプロパティを設定することです:

myView.layer.cornerRadius = 10.0;

そうすれば、マスク レイヤーやベジェ パスは必要ありません。メソッドのコンテキストでは、次のようになります。

-(void)setRoundedCorners:(UIRectCorner)corners radius:(CGFloat)radius
{
    self.layer.cornerRadius = radius;
}

更新:申し訳ありませんが、この部分を見逃しました:

設計では、これらのバーの左上隅と右上隅の角を丸くする必要がありますが、左下と右下の角は直角にします。

角の一部だけを丸くしたい場合は、レイヤーのcornerRadiusプロパティを設定してそれを行うことはできません。あなたが取ることができる2つのアプローチ:

  • 2 つの角が丸く、2 つの角が正方形のベジェ パスを作成し、それを塗りつぶします。そのためにマスクレイヤーは必要ありません。

  • サイズ変更可能な画像を使用します。UIImage-resizableImageWithCapInsets:-resizableImageWithCapInsets:resizingMode:メソッドを参照してください。サイズ変更可能な画像をアニメーション化する方法もいくつかあるため、バーを適切な長さに簡単に伸ばすことができます。

于 2012-11-05T21:03:54.113 に答える
1

shouldRasterizeレイヤーに設定してみてください。助けるべきです。

于 2012-11-05T21:38:45.903 に答える