iOS: Algorithm to center a word in a sentence inside of a UILabel

ⅰ亾dé卋堺 提交于 2020-01-05 04:55:16

问题


I need to center a particular word in a sentence by truncating the beginning and endings of a long sentence inside of a UILabel, For example

NSString mySentence = @"This is my very long sentence to give you an example of what I am trying to do.. And its still going..";

NSString myWord = @"example";

<Algorithm goes here>

Should display:

"...sentence to give you an example of what I am trying to..."

If the word is closer to one end or the other, just do your best to center and display an appropriate amount of the text, example:

NSString myWord = @"my";

"This is my very long sentence to give you an example of what..."

Any ideas?

Thanks.


回答1:


I believe you can do a scan for your search to be placed. Let's say you have the index in a variable named centerWordIndex. You could then split the string based on whitechars, and add words to the beginning and the end of your word until you are out of words at each side, or until the size of you string matches the size of the label.

what do you think :) ?




回答2:


The data you need to start is:

  • the width of your label (call it labelWidth)
  • the width of the word you want to center (call it wordWidth)

Then the size on each side you have to work with is (labelWidth - wordWidth) / 2. Don't worry about using this value, it's just the target.

You can use the ability to calculate the size of a NSString using

CGSize newSize = [myString sizeWithFont: myFont];
CGFloat newWidth = newSize.width;

The goal of the algorithm should be to continue to add words on each side of the centered word and recalculating the total width each step. If you've gone past labelWidth, you can't add that word or anymore from that direction. So, in pseudocode, one approach is:

calculate labelWidth and wordWidth
set currentWidth to wordWidth
set currentLeftPosition to position of first letter of word
set currentRightPosition to position of last letter of word
set currentString to word
set currentImbalance to 0

algorithm  start:
scan for position of 2 spaces to left of currentLeftPosition or start of string
    set leftTrialPosition to position found
    set leftTrialString as between leftTrialPosition and currentRightPosition inclusive
    calculate trialLeftWidth of leftTrialString
scan for position of 2 spaces to right of currentRightPosition or end of string
    set rightTrialPosition to position found
    set rightTrialString as between currentLeftPosition and rightTrialPositon inclusive
    calculate trialRightWidth of rightTrialString

if (trialLeftWidth - currentImbalance <= trialRightWidth 
&& trialLeftWidth <= labelWidth
&& trialLeftWidth != currentWidth)
    set currentImbalance -= calculate width of string from leftTrialPosition to currentLeftPosition 
    set currentLeftPosition = leftTrialPosition
    set currentWidth = trialLeftWidth
    set currentString = leftTrialString
else if (same checks for right)
    same steps using right data
else if (both left and right are larger than label or both sides no longer grow bigger)
    algorithm is done - return here

recurse to algorithm start

Using this basic strategy, you track the left imbalance (negative) or right imbalance (positive) throughout the algorithm and preferentially add the left or right word accordingly until you have the biggest string of complete words that can fit on the label or you have used the full string. The key iOS specific part here is the NSString method that calculates the width.



来源:https://stackoverflow.com/questions/6949195/ios-algorithm-to-center-a-word-in-a-sentence-inside-of-a-uilabel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!