0

TapkuLibraryの他の点では優れたTKCalendarDayEventViewを使用しており、 StuDevがここで示すように、ビューのコーナーの1つを選択的に丸めようとしています。残念ながら、StuDevのコードスニペットを適用すると、EventViewが含まれているTKCalendarDayTimelineViewから完全に消えてしまいます。このコードスニペットを現在のコードの下に追加しています

+ (id)eventViewWithFrame:(CGRect)frame id:(NSNumber *)id startDate:(NSDate *)startDate endDate:(NSDate *)endDate title:(NSString *)title location:(NSString *)location;

方法。コードの境界線の幅、色、または半径を設定するコードをコメントアウトしました。アップルのドキュメントではスーパーレイヤーのあるレイヤーにマスクを追加しないように警告されているため、TKCalendarDayEventViewにスーパーレイヤーがないことを確認しました。

マスクを新しいレイヤーに設定するときは、最初に新しいレイヤーのスーパーレイヤーをnilに設定する必要があります。そうしないと、動作が定義されません。

また、maskLayerのbackgroundColorプロパティとfillColorプロパティを試してみました。TKCalendarDayEventViewには、このマスクが正しく適用されないようにする可能性のあるものは何もありません。何が間違っているのでしょうか?

4

1 に答える 1

1

メソッドにブレークポイントをeventViewWithFrame:id:startDate:endDate:title:location:設定すると、イベントビューを作成するときに、フレームをに設定していることがわかりますCGRectZero。次に、丸みを帯びたコーナーマスクを設定するコードスニペットはCGRectZero、マスクレイヤーのフレームとして使用しています。

おそらくこれに対処する最も簡単な方法は、次のようにTKCalendarDayEventViewsetFrame:メソッドをオーバーライドすることです。

- (void)setFrame:(CGRect)newFrame
{
    if (!CGRectEqualToRect([super frame], newFrame)) {
        [super setFrame:newFrame];

        // Change the view's mask layer to fit the new frame.
        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds 
                                                       byRoundingCorners:UIRectCornerTopLeft
                                                             cornerRadii:CGSizeMake(15.0, 15.0)];
        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        maskLayer.frame = self.bounds;
        maskLayer.path = maskPath.CGPath;
        self.layer.mask = maskLayer;
    }
}

このように、ビューのフレームを変更するたびに、マスクが自動的に調整されます。

于 2012-01-02T21:55:12.270 に答える