2017-04-20 50 views
1

我正在製作一個自定義UIProgressView,它最終會有繪製指示符,所以我自然覆蓋了Draw方法。但是,我注意到在置換之後,即使調用Draw方法,用於遞增和遞減進度欄的方法也不再更新。UIProgressView不再更新繪製方法覆蓋之後

自定義類:

public class ModifiedProgressBar : UIProgressView 
{ 
    public ModifiedProgressBar(IntPtr handle) : base(handle) 
    { 
    } 

    public override void Draw(CGRect rect) 
    { 
     base.Draw(rect); 
    } 
} 

調用者:

private void UpdateDisplay(float step) 
{ 
    this.modifiedProgressBar.SetProgress(step); 
} 

UpdateDisplay然後通過遞增/遞減按鈕調用。此代碼對UIProgressView班級以及ModifiedProgressBar班級的工作完全正常,但沒有將Draw替代置於適當位置。 Progress屬性也用新的設置值進行更新,視圖只是不更新​​。我曾嘗試致電SetNeedsDisplay,這並未強制視圖更新。這裏的封面發生了什麼,有沒有辦法讓它正確繪製?提前致謝!

回答

1

您實際上需要提供您的繪圖例程,而不是調用基礎,並且當然需要根據Progress屬性更改繪圖。

一些簡單的黃色矩形:

enter image description here

public override void Draw(CGRect rect) 
{ 
    var color = UIColor.FromRGBA(1.0f, 1.0f, 0.0f, 1.000f); 
    var rectanglePath = UIBezierPath.FromRect(new CGRect(rect.X, rect.Y, rect.Width * Progress, rect.Height)); 
    color.SetFill(); 
    rectanglePath.Fill(); 
} 

或紅色尖尖的thingie™:

enter image description here

public override void Draw(CGRect frame) 
{ 
    var context = UIGraphics.GetCurrentContext(); 
    var color2 = UIColor.FromRGBA(0.199f, 0.018f, 0.018f, 1.000f); 
    var shadow = new NSShadow(); 
    shadow.ShadowColor = UIColor.Black; 
    shadow.ShadowOffset = new CGSize(3.1f, 3.1f); 
    shadow.ShadowBlurRadius = 5.0f; 
    UIBezierPath bezierPath = new UIBezierPath(); 
    bezierPath.MoveTo(new CGPoint(frame.GetMinX() + 0.00935f * frame.Width * Progress, frame.GetMinY() + 0.01351f * frame.Height)); 
    bezierPath.AddLineTo(new CGPoint(frame.GetMinX() + 0.99537f * frame.Width * Progress, frame.GetMinY() + 0.50000f * frame.Height)); 
    bezierPath.AddLineTo(new CGPoint(frame.GetMinX() + 0.99537f * frame.Width * Progress, frame.GetMinY() + 0.50000f * frame.Height)); 
    bezierPath.AddLineTo(new CGPoint(frame.GetMinX() + 0.00935f * frame.Width * Progress, frame.GetMinY() + 0.98570f * frame.Height)); 
    bezierPath.AddLineTo(new CGPoint(frame.GetMinX() + 0.00935f * frame.Width * Progress, frame.GetMinY() + 0.01351f * frame.Height)); 
    bezierPath.ClosePath(); 
    bezierPath.LineCapStyle = CGLineCap.Square; 
    bezierPath.LineJoinStyle = CGLineJoin.Bevel; 
    context.SaveState(); 
    context.SetShadow(shadow.ShadowOffset, shadow.ShadowBlurRadius, shadow.ShadowColor.CGColor); 
    UIColor.Red.SetFill(); 
    bezierPath.Fill(); 
    context.RestoreState(); 
    color2.SetStroke(); 
    bezierPath.LineWidth = 1.0f; 
    bezierPath.Stroke(); 
} 
+0

感謝您的幫助,它看起來像這不是解決我的問題的最好方法。由於我不想丟失標準的'UIProgressView'的功能,我改寫了自己的自定義類繼承自'UIView',並將其繪製在應用程序中當前存在的'UIProgressView'上。您的詳細答案幫助我瞭解當繪製方法被覆蓋時在封面下發生了什麼。 – PantAaroN