예제 #1
0
        public SizeF MeasureString(string text, Alignment alignment, int maxWidth = int.MaxValue)
        {
            //todo: support alignment
            var key = new TextMeasureKey(text, InnerFont, maxWidth);

            return(_measurements.GetOrAdd(key, k =>
            {
                using (NSMutableAttributedString str = new NSMutableAttributedString(text))
                {
                    NSRange range = new NSRange(0, k.Text.Length);

                    str.SetAttributes(new CTStringAttributes
                    {
                        Font = k.Font,
                    }, range);

                    using (CTFramesetter frameSetter = new CTFramesetter(str))
                    {
                        NSRange fitRange;
                        CGSize size = frameSetter.SuggestFrameSize(range, null, new CGSize(k.MaxWidth, float.MaxValue), out fitRange);
                        return new SizeF((float)size.Width, (float)size.Height);
                    }
                }
            }));
        }
예제 #2
0
        //http://egoco.de/post/19077604048/calculating-the-height-of-text-in-android
        //http://stackoverflow.com/questions/16082359/how-to-auto-adjust-text-size-on-a-multi-line-textview-according-to-the-view-max
        public SizeF MeasureString(string text, int maxWidth = 2147483647)
        {
            var key = new TextMeasureKey(text, InnerFont, SizeInPoints, maxWidth);

            return(_measurements.GetOrAdd(key, k =>
            {
                TextPaint paint = AndroidBrush.CreateTextPaint();
                paint.TextSize = k.SizeInPoints;
                paint.SetTypeface(k.Font);
                AndroidTextLayout layout = new AndroidTextLayout(paint);
                return layout.MeasureString(k.Text, k.MaxWidth);
            }));
        }
예제 #3
0
        public static System.Drawing.SizeF Measure(this string text, Font font, int maxWidth = int.MaxValue)
        {
            var key  = new TextMeasureKey(text, font, maxWidth);
            var size = _measurements.GetOrAdd(key,
                                              k =>
            {
                lock (DesktopBitmapTextDraw.GraphicsLocker)
                {
                    return(_graphics.Value.MeasureString(k.Text, k.Font, k.MaxWidth, StringFormat.GenericTypographic));
                }
            });

            return(size);
        }
예제 #4
0
 public static System.Drawing.SizeF Measure(this string text, Font font, API.Alignment alignment, int maxWidth = int.MaxValue)
 {
     try
     {
         var key  = new TextMeasureKey(text, font, maxWidth, alignment);
         var size = _measurements.GetOrAdd(key,
                                           k =>
         {
             var format = alignment.GetFormat(maxWidth != int.MaxValue);
             lock (DesktopBitmapTextDraw.GraphicsLocker)
             {
                 return(_graphics.Value.MeasureString(k.Text, k.Font, k.MaxWidth, format));
             }
         });
         return(size);
     }
     catch (ObjectDisposedException)
     {
         return(SizeF.Empty);
     }
 }