MonoTouch: удобный метод округленного UIImage - PullRequest
2 голосов
/ 22 января 2012

Существует ли встроенный метод MonoTouch для округления краев UIImage?

Кажется, я помню, что видел это однажды.

Ответы [ 5 ]

3 голосов
/ 23 января 2012

Вот хороший помощник по коду для пользователей MonoTouch, которые ищут функцию быстрого помощника. Измененный код был получен с сайта * Xamarin.com :

public static UIImage RounderCorners (UIImage image, float width, float radius)
{
    UIGraphics.BeginImageContext (new SizeF (width, width));
    var c = UIGraphics.GetCurrentContext ();

                //Note: You need to write the Device.IsRetina code yourself 
    radius = Device.IsRetina ? radius * 2 : radius;

    c.BeginPath ();
    c.MoveTo (width, width / 2);
    c.AddArcToPoint (width, width, width / 2, width, radius);
    c.AddArcToPoint (0, width, 0, width / 2, radius);
    c.AddArcToPoint (0, 0, width / 2, 0, radius);
    c.AddArcToPoint (width, 0, width, width / 2, radius);
    c.ClosePath ();
    c.Clip ();

    image.Draw (new PointF (0, 0));
    var converted = UIGraphics.GetImageFromCurrentImageContext ();
    UIGraphics.EndImageContext ();
    return converted;
}
3 голосов
/ 22 января 2012

Округление UIImage приведет к созданию другого UIImage.

Вы можете сделать это, если создадите CGContext для рендеринга с тем же размером, что и исходное изображение, а затем добавьте обтравочный контур с закругленными углами и визуализируетеoriginal UIImage.

Затем вы можете извлечь UIImage из CGContext.

Другой вариант - избежать промежуточного шага, это выдвинуть графическое состояние в вашем контекстном чертеже, добавить округленный путь.в качестве обтравочного контура нарисуйте изображение, а затем выдвиньте графическое состояние, чтобы вернуться к этому.

Вы можете увидеть, как TweetStation использует это для своих стеклянных кнопок:

https://github.com/migueldeicaza/MonoTouch.Dialog/blob/master/MonoTouch.Dialog/Utilities/GlassButton.cs#L76

2 голосов
/ 22 января 2012

В MonoTouch (и самой iOS) это не то, что вы можете сделать на самой UIImage.Однако вы можете сделать это на UIImageView, манипулируя его свойством Layer.

См. ответ для примера Objective-C, который было бы просто преобразовать в C #.

1 голос
/ 22 января 2012

Я также предлагаю вам следующий учебник по Знакомство с каллерами .В нем рассматриваются интересные материалы по настройке слоев в iOS.

Надеюсь, это поможет.

0 голосов
/ 07 декабря 2012

Основано на ответе BahaiResearch.com . Я сделал другой метод для неквадратных изображений и округлости в процентах вместо литерального радиуса.

Я не уверен, правильно ли он выдает многоточие. Поэтому я буду признателен, если кто-нибудь сможет протестировать или даже улучшить этот метод.

private static UIImage RoundCorners (UIImage image, float roundnessPercentage)
{
    float width = image.Size.Width;
    float height = image.Size.Height;
    float radius = ((width+height)/2) * (roundnessPercentage/(100*2));

    UIGraphics.BeginImageContext (new SizeF (width, height));
    CGContext c = UIGraphics.GetCurrentContext();

    c.BeginPath ();
    c.MoveTo(width, height/2);
    //Bottom-right Corner
    c.AddArcToPoint(width, height, height / 2, width, radius);
    //Bottom-left Corner
    c.AddArcToPoint(0, height, 0, 0, radius);
    //Top-left Corner
    c.AddArcToPoint(0, 0, width/2, 0, radius);
    //Top-right Corner
    c.AddArcToPoint(width, 0, width, height/2, radius);
    c.ClosePath();
    c.Clip();

    image.Draw (new PointF (0, 0));
    UIImage converted = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext ();
    return converted;
}
...