天道酬勤,学无止境

PHP word wrap with pixel dimensions

I'm looking for a way to wrap text into a box of specific width using PHP. I have dynamic text strings coming in, and variable font sizes.

I found a great way to cut the text up the way I want it from this thread: Smarter word-wrap in PHP for long words?

Using this block of code:

function smart_wordwrap($string, $width = 10, $break = "\n") {
// split on problem words over the line length
$pattern = sprintf('/([^ ]{%d,})/', $width);
$output = '';
$words = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

foreach ($words as $word) {
    if (false !== strpos($word, ' ')) {
        // normal behaviour, rebuild the string
        $output .= $word;
    } else {
        // work out how many characters would be on the current line
        $wrapped = explode($break, wordwrap($output, $width, $break));
        $count = $width - (strlen(end($wrapped)) % $width);

        // fill the current line and add a break
        $output .= substr($word, 0, $count) . $break;

        // wrap any remaining characters from the problem word
        $output .= wordwrap(substr($word, $count), $width, $break, true);
    }
}

// wrap the final output
return wordwrap($output, $width, $break);

}

This works great, but I need to find a way to feed a set pixel dimension (the constraining box), and font size into the above. The above function is using a character count - and if the font-size is very small obviously the character count needs to be larger and vice versa.

Is there anyway I could do this if I have the following variables?

$boxWidth = 200(px);
$text = (dynamic string);
$font = 'customfont.ttf'
$fontSize = (dynamic size);

I was thinking another loop to the word wrap function. Or maybe there's a way to edit the "explode" as I'm not entirely sure how that function works.

标签

评论

As suggested by @Mark Baker I have implemented this behaviour using imagettfbbox()

  • Complete code-snippet with helper functions can be found here
  • I'm posting the relevant bits of code for reference

// utility functions to help text rendering on image

// Returns expected width of rendered text in pixels
public static function getWidthPixels(string $text, string $font, int $font_size): int {
    // https://www.php.net/manual/en/function.imageftbbox.php#refsect1-function.imageftbbox-returnvalues
    $bbox = imageftbbox($font_size, 0, $font, " " . $text);
    return $bbox[2] - $bbox[0];
}

// Returns wrapped format (with newlines) of a piece of text (meant to be rendered on an image)
// using the width of rendered bounding box of text
public static function wrapTextByPixels(
    string $text,
    int $line_max_pixels,
    int $font_size,
    string $font
): string {
    $words = explode(' ', $text);   // tokenize the text into words
    $lines = [];                             // Array[Array[string]]: array to store lines of words
    $crr_line_idx = 0;                       // (zero-based) index of current lines in which words are being added
    $crr_line_pixels = 0;                    // width of current line (in which words are being added) in pixels

    foreach ($words as $word) {
        // determine the new width of current line (in pixels) if the current word is added to it (including space)
        $crr_line_new_pixels = $crr_line_pixels + ImageTextRenderUtils::getWidthPixels(' ' . $word, $font, $font_size);
        // determine the width of current word in pixels
        $crr_word_pixels = ImageTextRenderUtils::getWidthPixels($word, $font, $font_size);


        if ($crr_word_pixels > $line_max_pixels) {
            // if the current word itself is too long to fit in single line
            // then we have no option: it must still be put in oneline only
            if ($crr_line_pixels == 0) {
                // but it is put into current line only if current line is empty
                $lines[$crr_line_idx] = array($word);
                $crr_line_idx++;
            } else {
                // otherwise if current line is non-empty, then the extra long word is put into a newline
                $crr_line_idx++;
                $lines[$crr_line_idx] = array($word);
                $crr_line_idx++;
                $crr_line_pixels = 0;
            }
        } else if ($crr_line_new_pixels > $line_max_pixels) {
            // otherwise if new width of current line (including current word and space)
            // exceeds the maximum permissible width, then force the current word into newline
            $crr_line_idx++;
            $lines[$crr_line_idx] = array($word);
            $crr_line_pixels = $crr_word_pixels;
        } else {
            // else if the current word (including space) can fit in the current line, then put it there
            $lines[$crr_line_idx][] = $word;
            $crr_line_pixels = $crr_line_new_pixels;
        }
    }

    // after the above foreach loop terminates, the $lines 2-d array Array[Array[string]]
    // would contain words segregated into lines to preserve the $line_max_pixels

    // now we just need to stitch together lines (array of word strings) into a single continuous piece of text with
    $concatenated_string = array_reduce(
        $lines,
        static function (string $wrapped_text, array $crr_line): string {
            return $wrapped_text . PHP_EOL . implode(' ', $crr_line);
        },
        ''
    );

    // the above process of concatenating lines into single piece of text will inadvertently
    // add an extra newline '\n' character in the beginning; so we must remove that
    return StringUtils::removeFirstOccurrence($concatenated_string, "\n");
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 获取文本区域中插入符号的偏移位置(以像素为单位)(Get the offset position of the caret in a textarea in pixels [duplicate])
    问题 这个问题已经在这里有了答案: 如何在文本框中获取插入符号的(x,y)像素坐标? (3个答案) 7年前关闭。 在我的项目中,我试图获取插入符号在textarea中的偏移位置(以像素为单位)。 能做到吗? 在这里问之前,我已经遍历了许多链接,尤其是Tim Down的链接,但是我找不到能在IE8 +,Chrome和Firefox中使用的解决方案。 蒂姆·唐(Tim Down)似乎正在为此工作。 我发现的其他一些链接有很多问题,例如找不到插入符位置的顶部偏移。 我试图获取插入符的偏移位置,因为我想展现内部的自动完成建议框textarea通过定位它的基础上插入符的偏移位置。 PS:我无法使用contenteditable div因为我编写了很多与textarea相关的代码。 回答1 这是一种使用rangyinputs,rangy和jQuery的方法。 它基本上将整个文本从文textarea复制到相同大小的div中。 我设置了一些CSS,以确保在每个浏览器中, textarea和div以完全相同的方式包装其内容。 单击textarea ,我读出插入符位于哪个字符索引,然后在div内的相同索引处插入一个插入符span 。 通过这样做,如果用户单击行的开头,插入符号span跳回到上一行,因此我最终遇到了问题。 为了解决这一问题,我检查了前一个字符是否为space (这将允许换行)
  • 在文字换行的阿拉伯区域中找到“换行符”(finding “line-breaks” in textarea that is word-wrapping ARABIC text)
    问题 我有一个在文本区域(从右到左方向)显示的文本字符串。 用户可以动态调整textarea的大小(为此我使用jquery),并且文本将根据需要自动换行。 当用户点击“提交”时,我将使用该文本并使用PHP,BUT创建图像,然后再提交,我想知道“换行符”或“自动换行”发生的位置。 到目前为止,我所看到的所有地方仅向我展示了如何在php端处理换行符。 我想明确地说,没有线路中断。 我所拥有的是一个长字符串,它将根据用户设置的文本区域的宽度以不同的方式进行文字换行。 我不能使用“列”或任何其他标准宽度表示形式,因为我有一个非常复杂的阿拉伯字体,实际上是由许多不同宽度的字形(字符)组成的。 如果有人知道访问自动换行的位置的方式(如果需要,可以在textarea或div中),我真的很想知道。 我唯一的其他解决方案是实际存储每个字符的宽度(在我的数据库中)(这有点乏味,因为在600种不同的字体中有200多个字符,总共……有些庞大)。 我的希望不高,但我想我会问。 谢谢 一世。 贾马尔 回答1 好吧,除了找到换行符(实际上是不可能的)之外,您还可以使用以下功能将其强制进入文本区域: function ApplyLineBreaks(strTextAreaId) { var oTextarea = document.getElementById(strTextAreaId); if
  • 如何缩放/调整文本大小以适合TextView?(How to scale/resize text to fit a TextView?)
    问题 我试图创建一个调整多行文本的方法TextView ,使得它的边界(包括X和Y尺寸)内适合TextView 。 目前,我有一些东西,但是它所做的只是调整文本的大小,以便仅文本的第一个字母/字符填充TextView的尺寸(即,只有第一个字母是可见的,并且很大)。 我需要它来适合TextView范围内的所有文本行。 这是我到目前为止的内容: public static void autoScaleTextViewTextToHeight(TextView tv) { final float initSize = tv.getTextSize(); //get the width of the view's back image (unscaled).... float minViewHeight; if(tv.getBackground()!=null) { minViewHeight = tv.getBackground().getIntrinsicHeight(); } else { minViewHeight = 10f;//some min. } final float maxViewHeight = tv.getHeight() - (tv.getPaddingBottom()+tv.getPaddingTop())-12;// -12 just to be sure
  • 从源代码中的res / values / dimension.xml加载维度值(Load dimension value from res/values/dimension.xml from source code)
    问题 我想按原样加载该值。 我有两个dimension.xml文件,一个在/res/values/dimension.xml ,另一个在/res/values-sw360dp/dimension.xml 。 从源代码,我想做类似的事情 getResources().getDimension(R.dimen.tutorial_cross_marginTop); 这可行,但是我得到的值乘以屏幕密度系数(对于hdpi为1.5,对于xhdpi等为2.0)。 我也试着做 getResources().getString(R.dimen.tutorial_cross_marginTop); 从原理上讲,这是可行的,但是我得到一个以“ dip”结尾的字符串。 回答1 在我的dimens.xml中,我有 <dimen name="test">48dp</dimen> 在代码中,如果我愿意 int valueInPixels = (int) getResources().getDimension(R.dimen.test) 这将返回72,这是文档状态乘以当前电话的密度(在我的情况下为48dp x 1.5) 完全按照docs的说明: 检索特定资源ID的维度。 单位转换基于与资源关联的当前DisplayMetrics。 因此,如果您想要精确的dp值,就像在xml中一样
  • 删除YouTube缩略图上的黑色边框4:3(Removing black borders 4:3 on youtube thumbnails)
    问题 例如,我有一个链接 http://img.youtube.com/vi/aOPGepdbfpo/0.jpg 对于youtube视频缩略图: 我想删除黑色的顶部和底部边框,所以我得到这样的图片: 可以使用PHP函数javascript / jQuery或youtube api本身来完成吗? 回答1 将其用作背景图像,将其居中并更改高度。 http://dabblet.com/gist/4012604 .youtubePreview { background:url('http://img.youtube.com/vi/aOPGepdbfpo/0.jpg') center no-repeat; height:204px; width:480px; } 回答2 YouTube提供的图像没有比例为4:3的黑色条纹。 要获得没有黑条的16:9视频缩略图,请尝试以下方法之一: http://img.youtube.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg http://img.youtube.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg 第一个mqdefault为320x180像素的图像。 第二个maxresdefault为1500x900像素的图像
  • Can DPI scaling be enabled/disabled programmatically on a per-session basis?
    My application happens to be written in Python using pygame, which wraps SDL, but I'm imagining that this is probably a more-general question to do with the Windows API. In some of my Python applications, I want pixel-for-pixel control under Windows 10 even at high resolutions. I want to be able to ensure, for example, that if my Surface Pro 3 has a native resolution of 2160x1440, then I can enter full-screen mode with those dimensions and present a full-screen image of exactly those dimensions. The barrier to this is "DPI scaling". By default, under Windows' Settings -> Display, the value of
  • 在Textarea中光标位置处显示DIV [重复](Display DIV at Cursor Position in Textarea [duplicate])
    问题 这个问题已经在这里有了答案: 如何在文本框中获取插入符号的(x,y)像素坐标? (3个答案) 7年前关闭。 对于我的一个项目,我很乐意为特定的textarea提供自动完成功能。 类似于智能感知/全残式的工作原理。 但是为此,我必须找出绝对光标位置,以便知道DIV应该出现的位置。 事实证明:(几乎希望如此)这是不可能实现的。 有谁有一些巧妙的想法如何解决这个问题? 回答1 我的Hacky实验版本2 此新版本适用于可以根据需要进行调整的任何字体以及任何textarea大小。 在注意到某些人仍在尝试使此方法起作用之后,我决定尝试一种新方法。 这次我的结果更好-至少在Linux上的Google chrome上。 我不再有Windows PC可用,因此我只能在Ubuntu上的chrome / firefox上进行测试。 我的结果在Chrome上可以始终保持100%的效果,而在Firefox上可以达到70-80%左右,但是我不认为很难找到不一致之处。 此新版本依赖于Canvas对象。 在我的示例中,我实际上展示了非常画布-就像您可以在实际中看到它一样,但是可以使用隐藏的画布对象很容易地完成它。 当然,这肯定是一种hack,对于那些我认为相当混乱的代码,我会提前表示歉意。 至少在Google chrome中,无论我设置为哪种字体或textarea的大小,它都能始终如一地工作。 我使用了萨姆
  • 文字大小和不同的Android屏幕大小(Text size and different android screen sizes)
    问题 我知道,已经讨论了1000次,但是我无法针对不同的屏幕尺寸调整文本大小。 我尝试使用“ sp”作为我的自定义样式的尺寸单位: <style name="CustumButtonStyle" parent="@android:style/Widget.Button"> ... <item name="android:textSize">30sp</item> ... </style> 在2.7 QVGA中,看起来不错: 但是在7英寸WSVGA中,它看起来像这样: 我试图同时使用'sp'和'dp'并获得相同的结果。 您能否解释一下如何使这些按钮在任何屏幕上看起来都一样? 完整的自定义按钮样式 <style name="CustumButtonStyle" parent="@android:style/Widget.Button"> <item name="android:background">@drawable/custom_button</item> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_margin">3dp</item> <item name=
  • jQuery动画-平滑的尺寸过渡(jQuery Animation - Smooth Size Transition)
    问题 所以这可能真的很简单,但是我还没有找到任何可以借鉴的例子,所以请耐心等待。 ;) 这基本上是我想要做的: <div>Lots of content! Lots of content! Lots of content! ...</div> .... $("div").html("Itsy-bitsy bit of content!"); 当要注入新内容时,我想在包含大量内容的div尺寸之间平滑过渡,而在包含很少内容的div尺寸之间平滑过渡。 有什么想法吗? 回答1 试试这个jQuery插件: // Animates the dimensional changes resulting from altering element contents // Usage examples: // $("#myElement").showHtml("new HTML contents"); // $("div").showHtml("new HTML contents", 400); // $(".className").showHtml("new HTML contents", 400, // function() {/* on completion */}); (function($) { $.fn.showHtml = function(html, speed, callback)
  • 如何在Android中以编程方式获取ScreenSize(How do I get the ScreenSize programmatically in android)
    问题 Android将屏幕尺寸定义为Normal Large XLarge等。 它会自动在适当文件夹中的静态资源之间进行选择。 我的Java代码中需要有关当前设备的数据。 DisplayMetrics仅提供有关当前设备密度的信息。 屏幕大小无可用。 我确实在这里的grep代码中找到了ScreenSize枚举,但是对于4.0 SDK来说,这似乎不可用。 有没有办法获取此信息? 回答1 将此代码复制并粘贴到您的“ Activity ,执行该代码时将“ Toast ”设备的屏幕尺寸类别。 int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; String toastMsg; switch(screenSize) { case Configuration.SCREENLAYOUT_SIZE_LARGE: toastMsg = "Large screen"; break; case Configuration.SCREENLAYOUT_SIZE_NORMAL: toastMsg = "Normal screen"; break; case Configuration.SCREENLAYOUT_SIZE_SMALL: toastMsg =
  • 最佳自动换行算法? [关闭](Best word wrap algorithm? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 1年前关闭。 改善这个问题 自动换行是现代文本编辑器中的必备功能之一。 如何处理自动换行? 换行的最佳算法是什么? 如果文本是几百万行,那么我该如何快速自动换行呢? 为什么需要解决方案? 因为我的项目必须绘制具有各种缩放级别并同时具有美观外观的文本。 运行环境是Windows Mobile设备。 很小的内存大小,最高600 MHz速度。 我应该如何处理线路信息? 假设原始数据有三行。 THIS IS LINE 1. THIS IS LINE 2. THIS IS LINE 3. 之后,中断文本将如下所示: THIS IS LINE 1. THIS IS LINE 2. THIS IS LINE 3. 我应该再分配三行吗? 或其他建议? 回答1 这是我用C#编写的自动换行算法。 翻译成其他语言应该很容易(也许IndexOfAny除外)。 static char[] splitChars = new char[] { ' ', '-', '\t' }; private static string WordWrap(string str, int width) { string[] words = Explode(str, splitChars)
  • 将文字换行标签(Wrap text in <td> tag)
    问题 我想包装一些添加到<td>元素的文本。 我已经尝试过style="word-wrap: break-word;" width="15%" style="word-wrap: break-word;" width="15%" 。 但这不是包装文字。 是否必须提供100%的宽度? 我还有其他控件要显示,因此只有15%的宽度可用。 回答1 换行TD文本 首先设置表样式 table{ table-layout: fixed; } 然后设置TD风格 td{ word-wrap:break-word } 回答2 HTML表支持“ table-layout:fixed” css样式,该样式可防止用户代理根据其内容调整列宽。 您可能要使用它。 回答3 我相信您遇到过桌子的问题22。 表格非常适合以表格形式将内容包装起来,它们在“拉伸”方面做得很出色,可以满足其中包含的内容的需求。 默认情况下,表格单元格将拉伸以适合内容……因此您的文本只会使其更宽。 有一些解决方案。 1.)您可以尝试在TD上设置最大宽度。 <td style="max-width:150px;"> 2)您可以尝试将文本放在包装元素(例如,跨度)中,并在其上设置约束。 <td><span style="max-width:150px;">Hello World...</span></td> 请注意,尽管旧版本的IE不支持最小
  • JLabel是否有“自动换行”属性?(Is there a “word wrap” property for JLabel?)
    问题 我在JLabel中显示一些文本。 基本上,我是动态生成该文本的,然后应用一些HTML标记(例如BR和B )来格式化文本。 最后,我将此格式文本分配给我的JLabel。 现在,我希望Jlabel在到达屏幕末尾时自动将文本换行到下一行,例如“记事本”中的“自动换行”功能。 我怎样才能做到这一点? 回答1 如果将文本包装在<html>...</html> 更新:那么,您可能也应该设置最大大小。 回答2 可以使用HTML样式(CSS)为body设置宽度。 反过来,这将确定要渲染的行数,并由此确定标签的首选高度。 在CSS中设置宽度避免了需要计算标签(或标签的最佳尺寸)应在何处出现换行的地方。 import javax.swing.*; public class FixedWidthLabel { public static void main(String[] srgs) { final String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eu nulla urna. Donec sit amet risus nisl, a porta enim. Quisque luctus, ligula eu scelerisque gravida, tellus quam vestibulum
  • 使图像适合ImageView,保持宽高比,然后将ImageView调整为图像尺寸?(Fit image into ImageView, keep aspect ratio and then resize ImageView to image dimensions?)
    问题 如何将随机大小的图像拟合到ImageView ? 什么时候: 最初ImageView尺寸为250dp * 250dp 图片的较大尺寸应放大/缩小到250dp 图像应保持其宽高比缩放后, ImageView尺寸应与缩放后的图像尺寸匹配 例如,对于100 * 150的图像,该图像和ImageView应该为166 * 250。 例如,对于150 * 100的图像,该图像和ImageView应该为250 * 166。 如果我将界限设置为 <ImageView android:id="@+id/picture" android:layout_width="250dp" android:layout_height="250dp" android:layout_gravity="center_horizontal" android:layout_marginTop="20dp" android:adjustViewBounds="true" /> 图像完全适合ImageView ,但ImageView始终为250dp * 250dp。 回答1 (在对原始问题进行澄清后,对答案进行了重大修改) 经过澄清: 这不能仅在xml中完成。 无法同时缩放图像和ImageView以使图像的一维始终为250dp,而ImageView的维数与图像相同。 这段代码将ImageView
  • 在Android上的Chrome中获取物理屏幕尺寸/ dpi /像素密度(Getting the physical screen dimensions / dpi / pixel density in Chrome on Android)
    问题 问题 在Android上的Chrome中,有没有一种安全的方法来获取实际正确的屏幕物理尺寸? 如有必要,可以将旧版本的Chrome和Android排除在外。 先前的研究 关于从Javascript(或CSS)中获取设备的实际物理屏幕尺寸的问题,stackoverflow有很多死胡同的问题。 似乎html api标准化与实际的浏览器实现之间没有融合,更不用说浏览器实现依赖于OS api,而OS api则依赖于提供正确信息的硬件。 顺便说一下,在假定当时盛行的某个像素密度的情况下,有些先验答案是奥秘的(2011年等),因此毫无用处。 其他与webkit有关,而Chrome闪烁可能已取代了Chrome(?)中的webkit。 我想通过将事物限制为仅适用于Android上的Chrome来探索简单解决方案的存在。 笔记 这全都与浏览器内部的javascript(或css)解决方案有关,而不是针对本机应用程序的解决方案。 回答1 您无法真正获得实际的物理尺寸或实际的DPI,即使可以,也无法对它们进行任何操作。 这是一个漫长而复杂的故事,请原谅。 网络和所有浏览器都将1px定义为一个称为CSS像素的单位。 CSS像素不是真实像素,而是根据设备的视角被认为是英寸的1/96英寸的单位。 这被指定为参考像素。 参考像素是设备上一个像素的可视角度,像素密度为96dpi,距阅读器的距离为臂长。 因此
  • UILabel Text Not Wrapping
    I am working on a Swift project with Storyboards where I want text to wrap in a label. In the old Objective-C version where I did not use a Storyboard I used the following settings and things worked perfectly. Here are the settings for Swift I have been reading about the potential auto layout issues with preferred width settings. I currently have them set to auto layout and the label itself is set to a width of 560. I've added a constraint to keep the label 20 pixels from the trailing superview and while I thought this would work I still cannot get the text to wrap. The dimension settings are
  • 导出具有高质量图像的画布的最佳实践是什么?(What is the best practice to export canvas with high quality images?)
    问题 我需要你的帮助。 我解释一下我的情况:我正在使用fabric.js库在应用程序中放置形状,文本等。 我的画布大小为1000x1000像素(约26.45x26.45厘米)。 我有一个图像上传脚本,仅用于上传高质量(例如300 dpi)的图像。 基本上,我要做的是:-绘制画布(上传图像,放置文本等); -调整画布的大小乘以比例因子,以最终获得300dpi的图像; -将画布保存为PNG格式; -使用php / ajax和Imagick,以300 dpi的质量放置画布,并以jpg格式保存。 问题是:保存画布时,上载图像的质量会下降,因为我将画布的大小调整为72 dpi(目前保存为PNG)。 我认为可能的解决方案是:上传图像时,将位置保存在具有x和y位置和大小的数组中,直到整个过程结束,然后将图像替换为JPG。 如果这是最好的方法,可以用Imagick库还是用PHP来实现? 我想知道您对此的看法。 谢谢你。 回答1 处理图像时,DPI完全无关紧要。 图像以像素为单位进行测量,因此需要进行调整。 您可以放心地忽略DPI,因为在这种情况下它毫无意义。 缩放在这里无济于事-请记住,您使用的是像素设备,而不是矢量,因此画布必须已经达到您想要用于打印等的尺寸。否则缩放时由于插值会降低质量。 就是这样: 您需要根据最终阶段所需的大小预先计算画布大小(以像素为单位)。
  • PHP Thumbnail Image Resizing with proportions
    As a brief run down, I am currently making a dating type site. Users can create accounts and upload profile pictures (up to 8). In order to display these in the browse area of the website, I am looking for a way in PHP (with third party processor/scripts) to resize all images uploaded to have thumbnails that adhere to certain dimensions. As an example, I will want "profile" images (thumbnails) to be NO larger than 120*150px. The scripting needs to resize uploaded images (regardless of whether they are portrait or landscape, and regardless of proportions) to adhere to these dimensions without
  • iOS中的像素和点是什么?(What are pixels and points in iOS?)
    问题 从UIImage参考: @property(nonatomic, readonly) CGSize size 考虑到方向的图像尺寸。 讨论在iOS 4.0及更高版本中,此值反映图像的逻辑大小,并以点为单位。 在iOS 3.x及更早版本中,此值始终反映以像素为单位的图像尺寸。 iOS中像素和点之间有什么区别? 回答1 iOS上的像素是设备的完整分辨率,这意味着如果我的图像长度为100x100像素,那么手机将在标准的非视网膜设备上将其渲染为100x100像素。 但是,由于较新的iPhone具有四倍的像素密度,因此同一图像将以100x100像素渲染,但看起来只有该尺寸的一半。 iOS工程师很久以前(使用Quartz在OS X中使用Quartz)解决了这一问题,当时他们引入了Core Graphics的标记系统。 点是相当于非视网膜设备上1x1像素和视网膜设备上2x2像素的标准长度。 这样,您的100x100图像将在视网膜设备上呈现两倍大小的图像,并基本上使用户看到的图像正常化。 它还提供了iOS设备上的标准测量系统,因为无论像素密度如何变化,iPhone屏幕上始终有320x480点,而iPad屏幕上始终有768x1024点。* 但是与此同时,考虑到视网膜设备至少是在iOS 4中引入的,您基本上可以忽略文档,而且我不知道有太多人还在更新的iPhone上运行iOS 3。 但是
  • Word wrap a string in multiple lines
    I am trying to word wrap a string into multiple lines. Every line will have a defined width. For example, I would get this result if I word wrap it to an area of 120 pixels in width: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed augue velit, tempor non vulputate sit amet, dictum vitae lacus. In vitae ante justo, ut accumsan sem. Donec pulvinar, nisi nec sagittis consequat, sem orci luctus velit, sed elementum ligula ante nec neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam erat est, pellentesque eget tincidunt ut, egestas