天道酬勤,学无止境

表情符号弄乱了 obj-c 的 sizeWithFont 数学(Emojis messing with obj-c's sizeWithFont math)

问题

在需要显示一长串类似聊天的对话的UITableView中,通常包含表情符号,会发生大小计算错误。

我的问题是,如果一个字符串的长度恰到好处,并且我使用sizeWithFont ,那么我在第一次使用sizewithfont测量时sizewithfont得到不正确的字符串长度,从而导致“换行”。

我认为这是因为字符串“:-)”比实际的笑脸图标更宽。

证据可以在这里看到:

使用 <code>SizeWithFont</code>

现在,在其他一些堆栈上,有些人声称sizeWithFont只会考虑字符串,而不是表情符号,这对我来说没有意义,因为它“最终”正确......

但是他们建议改用 sizeToFit,所以我决定试一试。

使用 SizeToFit

巴姆,同样的结果。

有谁知道如何反驳这个? 是否有一个boolean来检查“标签是否已完成表情符号处理”,以便我可以跳过该调用?

两次运行同一行没有任何作用,似乎需要在sizeWithFont意识到其错误之前绘制视图。

显示的列在自定义单元格上的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath段中运行。 我也可以在完美的常规 UITableViewCell 上复制错误,所以似乎不是这样。

回答1
- (CGFloat)heightStringWithEmojis:(NSString*)str fontType:(UIFont *)uiFont ForWidth:(CGFloat)width {

// Get text
CFMutableAttributedStringRef attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
CFAttributedStringReplaceString (attrString, CFRangeMake(0, 0), (CFStringRef) str );
CFIndex stringLength = CFStringGetLength((CFStringRef) attrString);

// Change font
CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef) uiFont.fontName, uiFont.pointSize, NULL);
CFAttributedStringSetAttribute(attrString, CFRangeMake(0, stringLength), kCTFontAttributeName, ctFont);

// Calc the size
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
CFRange fitRange;
CGSize frameSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(width, CGFLOAT_MAX), &fitRange);

CFRelease(ctFont);
CFRelease(framesetter);
CFRelease(attrString);

return frameSize.height + 10;

}
回答2

谢谢@SergiSolanellas! 这是一个采用attributedString 的版本,由于已经设置了文本和字体,因此缩短了方法。

//
// Given an attributed string that may have emoji characters and the width of 
// the display area, return the required display height.
//
- (CGFloat)heightForAttributedStringWithEmojis:(NSAttributedString *)attributedString forWidth:(CGFloat)width {
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedString);
    CFRange fitRange;
    CGSize frameSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(width, CGFLOAT_MAX), &fitRange);

    CFRelease(framesetter);

    return frameSize.height;
}
回答3

我正在使用 UILabel

sizeThatFits(_ size: CGSize) -> CGSize

它对我有用。

我的代码

let tempLabel = UILabel()
tempLabel.font = font
tempLabel.attributedText = attText
tempLabel.numberOfLines = 0
let size = tempLabel.sizeThatFits(CGSize(width: 200, height:CGFloat.greatestFiniteMagnitude))

作为代码,您需要分配三个属性。

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Emojis messing with obj-c's sizeWithFont math
    In a UITableView that needs to display a long list of chatlike conversations, often containing emojis, a size calculation error occurs. My problem is, that if a string is just the right length, and I use sizeWithFont, I on my first measurement using sizewithfont get an incorrect length of the string, causing a "linebreak". I assume that it is because the string ":-)" is broader than the actual smiley icon. The evidence can be seen here : Now, over at some other stacks, some claim that sizeWithFont will only account for the string, not the Emoji, which for me doesn't make sense, since it gets
  • 如何在C / C ++ / Obj-C中编码处理负数的模(%)运算符(How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbers)
    问题 我最讨厌C语言衍生的语言(作为数学家)是 (-1) % 8 // comes out as -1, and not 7 fmodf(-1,8) // fails similarly 最好的解决方案是什么? C ++允许模板和运算符重载,但对我而言,这两者都是晦涩难懂的地方。 实例感激不尽。 回答1 首先,我想指出,您甚至不能依靠(-1) % 8 == -1的事实。 您唯一可以依靠的是(x / y) * y + ( x % y) == x 。 但是,余数是否为负是实现定义的。 现在为什么在这里使用模板? int和long的重载就可以了。 int mod (int a, int b) { int ret = a % b; if(ret < 0) ret+=b; return ret; } 现在您可以像mod(-1,8)这样称呼它,它看起来像是7。 编辑:我发现我的代码中的错误。 如果b为负,则它将不起作用。 所以我认为这样更好: int mod (int a, int b) { if(b < 0) //you can check for b == 0 separately and do what you want return -mod(-a, -b); int ret = a % b; if(ret < 0) ret+=b; return ret; } 参考:C ++ 03第5
  • 带有表情符号/表情符号 url 编码的 NSString(NSString with emoticons/emojis url encode)
    问题 我正在尝试获取可能包含特殊字符和表情符号的 UITextField 的内容,并将其转换为我可以通过 GET 请求传递给 PHP 服务的内容。 如果我根本不对字符串进行编码,表情符号就会显示得很好(我可以在数据库中看到它们并且它们会正确地返回给我)……但是如果我添加特殊字符(~!@#$% 等) .) GET 请求阻塞。 所以我通过 url 编码器运行字符串: [commentText stringByAddingPercentEscapesUsingEncoding:NSNonLossyASCIIStringEncoding]; 我正在使用 NSNonLossyASCIIStringEncoding 来正确获取表情符号,这是可行的,但是使用它进行编码会返回一个 nil 字符串。 事实上,唯一不返回 nil 的编码是 UTF8,但它用百分比转义来填充 emoji unicode。 我该怎么做呢? 我是否必须为这种情况编写自己的字符串替换,或者是否有一种我没有看到的 iOS 方法来做到这一点? 干杯, 克里斯 回答1 NSNonLossyASCIIStringEncoding to stringByAddingPercentEscapesUsingEncoding:返回nil因为你传入的字符串不是 ASCII。 使用NSUTF8StringEncoding百分比会转义表情符号字¬
  • 记事本++缩进弄乱了(Notepad++ indentation messes up)
    问题 我使用Python编写代码,我真的很喜欢Notepad ++。 但是,当我使用制表符进行缩进时,在Notepad ++中看起来很晚,但是当我运行该程序时,出现了缩进错误,并且当我在Emacs中检查代码时,我发现Notepad ++实际上添加了比制表符更多的空格。它显示在屏幕上。 怎么了? 回答1 没有通用的制表符大小,因此我始终确保用空格替换制表符(因此您知道所看到的就是在其他任何地方都可以看到的) 转到“设置”->“首选项...”->“语言”菜单/“制表符设置”,然后选中“按空格替换” 回答2 我建议去查看>显示符号>显示空白和制表符,以更好地了解您的缩进外观。 回答3 PEP 8告诉我们在Python中使用空格而不是制表符来实现跨编辑器的兼容性和一致性: http://www.python.org/dev/peps/pep-0008/ 看一下这个答案,了解如何在Tabpad ++中将制表符更改为空格 将制表符转换为Notepad ++中的空格 也许那可以解决您的问题 回答4 微小的更新-要以空格作为选项卡,现在转到“设置” >>“首选项” >>“制表符设置”,然后选中“按空格替换”框 回答5 我是python的新手,并开始使用Notepad ++。 但是我和您一样面临着同样的问题...缩进问题。 根据上级的建议,我改用了PyCharm社区版。 我将代码从Notepad +
  • Chrome将具有边框半径的缩放元素内的图像弄乱了(Chrome messing up images inside a scaled element which has border radius)
    问题 使用案例 我正在尝试构建“幻灯片放映”类型的应用程序。 每张幻灯片都有固定的宽高比,但是我希望内容以其正常的宽度/高度呈现-因此,我尝试使用视口的width / height在幻灯片的内容上使用CSS3“ transform:scale”计算使幻灯片适合视口的理想比例/边距。 在一张特定的幻灯片上,我向人们展示了一些“信息卡”以及每个人的“继任者”列表 问题 Chrome浏览器在图像上显示出一些非常奇怪的行为。 如果您调整窗口的大小,图像将在整个位置移动。 如果您以某种方式强制图像重新绘制,则图像似乎可以自行修复(即,上下滚动页面) 编辑此内容似乎与边框半径框内的图像特别相关! 问题 这是Chrome中的错误吗? 是否有任何解决方法可以解决此问题? 现场例子 现场小提琴 在此实时示例中,您可以调整“结果窗格”的大小以使图像缩放。 至少在我的chrome版本中,图像变得混乱。 发布编辑 我将代码浪费到了重现问题所需的最低限度。 我只使用了Webkit供应商前缀。 我还更新了问题描述,因为在将代码摆弄下来之后,我意识到它一定与包含图像的元素的边框半径有关! 原始小提琴 的HTML <div class="container"> <div class="inner"> <div class="box"> <img src="https://en.gravatar.com
  • 在iOS 7上,表情符号的字体大小不能超过16px(Emojis won't scale beyond 16px font-size on IOS 7)
    问题 我们正在使用UIWebView中的网页在phonegap中制作一个应用程序,并且在此产品中,我们允许使用Apple的表情符号,并对其应用AppleColorEmoji字体,从而可以缩放它们。 在iPad和iPhone上都更新到IOS 7之后,带有AppleColorEmoji字体的表情符号以前可以缩放为所需的大小,不再可以缩放到超过16px字体大小(可以缩放较小)。 它仍然可以在IOS <7的设备上按比例缩放 我担心这是他们有意在IOS 7中引入的。 有没有其他人遇到过这个问题,甚至可以解决? 回答1 如果不顾一切,在Webkit中,可以将HTML元素中的此类表情符号字符缩放到所需大小。 <span style="-webkit-transform: scale(5); position: absolute;">👿</span> 上面介绍的voodoo的不便之处在于,定位需要调整大小,因为必须将transform应用于位置为absolute元素。 如果表情符号变形太大,像素化也可能会有些烦人。 回答2 如果对于任何人来说这仍然很有趣(我忘记了它仍然处于打开状态),那么“解决方案”是将iPhone的meta标签设置为: <meta name="viewport" content="width=320"/> 这样可以确保iPhone放大内容以适合屏幕上的640像素(或更多)
  • 从变量中删除表情符号(Removing emojis from variable)
    问题 我正在使用 Smarty 传入并显示first_name变量的内容。 一些用户在他们的first_name有表情符号字符 (http://en.wikipedia.org/wiki/Emoji),我想知道我如何a) 有条件地不显示用户的first_name如果它包含表情符号或 b) 过滤掉表情符号字符来自first_name 。 这可以用Smarty来完成吗? 可以在Smarty中用PHP完成吗? 回答1 表情符号在块 U+1F300–U+1F5FF 中编码。 preg_replace('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', '', $first_name) 这将去除那些 回答2 我尝试了上面发布的一些解决方案,但没有一个解决方案,但是,当我使用 mb_ 函数将字符串转换为 UTF-8 时,它可以正常工作。 您可以使用: trim( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', mb_convert_encoding( $emojiString, "UTF-8" ) ) ); 为我工作。 回答3 问:Smarty 可以做到吗? 答:是的。 Q:在Smarty中用PHP可以做到吗? 答:是的。 但是请不要在模板端使用 PHP 标签。
  • 使用JavaScript和HTML打印表情符号(Printing emojis with JavaScript and HTML)
    问题 为什么这样做: <p id="emoji">😄</p> 而且这不是: document.getElementById("emoji").innerHTML = String.fromCharCode(parseInt('1f604', 16)); 回答1 用JS术语表示的“字符”实际上是UTF-16代码单元,而不是完整的Unicode字符。 (这种可悲的状况来自远古时代,没有什么区别*。)要在基本多语言平面之外使用字符,您必须以UTF-16编码的形式(两个成对的代理对)来编写它,两个16位代码单位: String.fromCharCode(0xD83D, 0xDE04) 在ECMAScript 6中,我们将获得一些接口,这些接口使我们可以将字符串当作完整的Unicode代码点来处理,尽管它们是不完整的,并且只是仍存储为代码单元序列的String类型的外观。 然后,我们将能够执行以下操作: String.fromCodePoint(0x1F604) 有关某些polyfill代码的信息,请参见此问题,以使您可以在当今的浏览器中使用此功能。 (*:当我访问时间机器时,我将独自离开希特勒,回到更早的时候发明UTF-8。UTF-16一定从来没有!) 回答2 如果不想在代码中包含String.fromCodePoint() ,也可以使用hacky方法。 它包括创建一个虚拟元素
  • Xcode构建失败“体系结构x86_64的未定义符号”(Xcode build failure “Undefined symbols for architecture x86_64”)
    问题 Xcode初学者的问题: 这是我第一次使用Xcode 4.6.3。 我正在尝试编写一个非常简单的控制台程序,该程序搜索配对的BT设备并将其打印到NSLog。 生成时出现以下错误: Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_IOBluetoothDevice", referenced from: objc-class-ref in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 我疯狂地搜寻。 常见的问题应该是对文件的引用,该文件仅导入了头文件,而链接器未找到任何实现(* .m文件)。 但是,IOBluetooth库是一个类似于Foundation框架的标准框架。 我在上述声明中遗漏了什么? 我也尝试过为32位计算机构建它(构建再次失败)。 显然,这是一个链接器错误,但与它的关系不知道,除了在x86和x64体系结构上查找IOBluetoothDevice的实现存在问题之外,而头文件来自一个包含在标准中的Framework(称为IO蓝牙? 供您参考,我的主要代码“ main.m”为:
  • ncurses到外部外壳,并弄乱了按键(ncurses to external shell and back messing with keys)
    问题 我有这个ncurses应用程序,该应用程序正在执行标准配方,以临时退出ncurses,运行外部编辑器/ shell /任何程序,然后在完成后返回至ncurses。 这几乎是可行的,除了ncurses之后得到的前几个按键显然是伪造的之外。 如果我按两次向上箭头,ncurses认为分别会看到^ [和A。 有人以前见过这种行为,知道解决此问题的魔咒是什么吗? 如果有帮助,那就是Ruby ncurses库。 回答1 闲逛了一会儿之后,我找到了一种货神教徒的解决方案:脱下stdscr上的外壳后,显式调用键盘(1)。 我不知道为什么这行得通,但是行得通。 如果其他人可以解释原因,我会标记为“是”。 当前的工作原理是键盘触摸某种内部缓冲区并将其清除。 划伤: NCURSES_EXPORT(int) keypad(WINDOW *win, bool flag) { T((T_CALLED("keypad(%p,%d)"), win, flag)); if (win) { win->_use_keypad = flag; returnCode(_nc_keypad(SP, flag)); } else returnCode(ERR); } 回答2 是的。 没有键盘,ncurses将无法为您处理转义码。 从键盘手册页: The keypad option enables the keypad
  • obj-c标头变量的重复符号(obj-c duplicate symbol for header variable)
    问题 我的印象是,使用#import每次构建只会导入一个文件,但是尝试在标头中定义变量,然后在两个不同的源文件中导入该标头后,该变量出现重复的符号链接器错误。 这怎么可能? 回答1 #import使每个文件中包含一次标头,但每个构建中不包含标头。 因此,在导入标头的每个文件中都定义了变量,并且由于默认情况下全局变量在整个项目中可见,因此会出现链接器错误。 定义全局变量的正确方法(如果您要执行此操作)是在实现文件中定义它,并在其他文件中使用关键字external引用它。 另外,在标头中将变量定义为static会将其可见性限制在单个文件中,因此不会出现任何错误,但可能不是您想要的结果;) 回答2 #import确保“声明”仅被包含一次。 由于您定义的变量是“定义”,因此会出现重复的符号链接器错误。 要解决此错误,请仅将.h用作声明,将.m用作定义 正如弗拉基米尔(Vladimir)解释的那样,您可以使用extern 回答3 开设新课程后,我突然出现了一堆重复的符号。 终于意识到我设法在.m文件中做到了这一点: #import "other-file.m" 注意“ m”。 :)
  • php strtotime() 弄乱了不同年份的日期(php strtotime() messes with date of a different year)
    问题 我正在使用 php 重新格式化日期并将其发布到 mysql。 一切都很好,直到我通过明年的日期。 例如Mon, 14 Jan, 2013将被翻译成2012-01-16 。 格式正确只是日期不正确,我什至尝试更改我通过它的格式,但仍然没有更改。 这是它在Mon, 14 Jan, 2013得到的结果Mon, 14 Jan, 2013这是处理它的 php: $startdate = $_REQUEST['one']; $start = date("Y-m-d", strtotime($startdate)); 关于为什么只有在我们进入新的一年甚至过去几年才会出现打嗝的任何线索? 回答1 在此处查看strtotime()的所有有效格式的列表。 您正在使用的那个不存在。 如果您想改用date_create_from_format ,方法如下: date_create_from_format("D, d M, Y", "Mon, 14 Jan, 2013")
  • 静态库中的Objective-C类别(Objective-C categories in static library)
    问题 您能指导我如何正确地将静态库链接到iPhone项目吗? 我使用添加到应用程序项目中的静态库项目作为直接依赖项(目标->常规->直接依赖项),所有工作正常,但类别有效。 静态库中定义的类别在应用程序中不起作用。 所以我的问题是如何将带有某些类别的静态库添加到其他项目中? 通常,在其他项目的应用程序项目代码中使用最佳实践是什么? 回答1 解决方案:从Xcode 4.2开始,您只需要转到与库链接的应用程序(而不是库本身),然后在“项目浏览器”中单击项目,单击应用程序的目标,然后构建设置,然后搜索“其他链接器标志”,单击+按钮,然后添加“ -ObjC”。 不再需要“ -all_load”和“ -force_load”。 详细信息:我在各种论坛,博客和Apple文档中找到了一些答案。 现在,我尝试对搜索和实验做一个简短的总结。 问题是由以下原因引起的(来自Apple技术问答QA1490 https://developer.apple.com/library/content/qa/qa1490/_index.html的引用): Objective-C并未为每个函数(或Objective-C中的方法)定义链接器符号-而是仅为每个类生成链接器符号。 如果使用类别扩展现有的类,则链接器不知道将核心类实现的对象代码与类别实现相关联。 这样可以防止在结果应用程序中创建的对象响应类别中定义的选择器。
  • 如何清除充满表情符号字符的字体缓存?(How to clear font cache filled with emoji characters?)
    问题 我正在为iPhone开发键盘扩展。 有表情符号屏幕smilar于苹果自己的表情符号键盘,在显示一些800 Emoji字元UICollectionView 。 滚动此表情符号UIScrollView ,内存使用量会增加,但不会下降。 我正确地重用了单元格,并且在测试显示800次的单个表情符号字符时,滚动期间内存不会增加。 使用工具后,我发现代码中没有内存泄漏,但表情符号字形似乎已缓存,并可能占用大约10-30MB的内存,具体取决于字体大小(研究表明它们实际上是PNG)。 键盘扩展在销毁之前可以使用很少的内存。 有没有办法清除字体缓存? 编辑 添加代码示例来重现该问题: let data = Array("😄😊☺️😉😍😘😚😗😙😜😝😛😳😁😔😌😒😞😣😢😂😭😪😥😰😅😓😩😫😨😱😠😡😤😖😆😋😷😎😴😵😲😟😦😧😈👿😮😬😐😕😯😶😇😏😑👲👳👮👷💂👶👦👧👨👩👴👵👱👼👸😺😸😻😽😼🙀😿😹😾👹👺🙈🙉🙊💀👽💩🔥✨🌟💫💥💢💦💧💤💨👂👀👃👅👄👍👎👌👊✊✌️👋✋👐👆👇👉👈🙌🙏☝️👏💪🚶🏃💃👫👪👬👭💏💑👯🙆🙅💁🙋💆💇💅👰🙎🙍🙇🐶🐺🐱🐭🐹🐰🐸🐯🐨🐻🐷🐽🐮🐗🐵🐒🐴🐑🐘🐼🐧🐦🐤🐥🐣🐔🐍🐢🐛🐝🐜🐞🐌🐙🐚🐠🐟🐬🐳🐋🐄🐏🐀🐃🐅🐇🐉🐎🐐🐓🐕🐖🐁🐂🐲🐡🐊🐫🐪🐆🐈🐩🐾💐🌸🌷🍀🌹🌻🌺🍁🍃🍂🌿🌾🍄🌵🌴🌲🌳🌰🌱🌼🌐🌞🌝🌚🌑🌒🌓🌔🌕🌖🌗🌘🌜🌛🌙🌍🌎🌏🌋🌌🌠⭐️☀️⛅️☁️⚡️☔️❄️⛄️🌀🌁🌈🌊
  • 黄瓜的ANSI颜色弄乱了emacs编译缓冲区(Cucumber's ANSI colors messing up emacs compilation buffer)
    问题 在Emacs中工作时,我使用compile命令(默认情况下为F12)运行程序。 当我在Emacs中运行Cucumber时,Cucumber吐出了Emacs编译模式无法解释的ANSI颜色。 结果是丑陋且难以阅读的。 这是* compilation *缓冲区的片段,显示了丑陋的样子: ^[[31m(::) failed steps (::)^[[0m 我正在使用的命令: ( cd ~/lab/rails/todolist && rake cucumber:all ) 版本: 埃马克斯23.1 黄瓜0.8.3 黄瓜栏0.3.2 如果我能做到,世界将是阳光和鸟儿歌唱: 获取Emacs以在其编译缓冲区中解释ANSI颜色代码,或者获取Cucumber以停止吐出ANSI颜色代码 有任何想法吗? 回答1 我用它来打开编译缓冲区中的ansi颜色解释: (require 'ansi-color) (defun colorize-compilation-buffer () (let ((inhibit-read-only t)) (ansi-color-apply-on-region (point-min) (point-max)))) (add-hook 'compilation-filter-hook 'colorize-compilation-buffer) 回答2 我改进了代码
  • Excel在复制时弄乱了我的公式,如何停止停止更改其中一部分而不更改另一部分?(Excel messes with my formula when copied, how can I stop I stop it changing one part but not the other?)
    问题 因此,我正在使用一个正在更新的旧数据库系统,以前它运行于许多不同的文件中,一个包含电子邮件,一个包含数字,您就明白了。 无论如何,在尝试编译为一个文件时,我遇到了麻烦,有些人没有电话号码或电子邮件等,这意味着我不能只复制旧数据(PersonID 5的电话会放在PersonID 4的空间) 所以我所做的就是使用Vlookup公式,遇到了一些麻烦,今天早上我意识到了问题所在。 =VLOOKUP(A2,'PhoneType - Email'!B1:V29190,3,FALSE) 我将快速进行分解,A是PersonID所在的列,email是电子邮件所在的工作表,B1:V29190应该选择整个表,而3是PersonID在该工作表中的列。 基本上,我需要A更改(A2,A3,A4)以使其与行中的行保持一致,我需要B1:V29190保持不变,因为当前Excel试图变得更聪明并在每次复制粘贴时对其进行处理。 我怎样才能做到这一点? 非常感谢, 冰冷的 回答1 名称是绝对和相对单元格引用。 $变为行或列的绝对值,因此在填充或复制到新位置时它们不会更改。 您正在填充行,因此只需要将行号“锁定”为绝对值即可。 如果将光标放在单元格地址中并按F4 ,您将看到第一个组合。 继续点击F4查看其他组合。 =VLOOKUP(A2,'PhoneType - Email'!B$1:V$29190,3,FALSE)
  • 发布和调试版本(Obj-C)中的不同代码/配置(Different code / config in Release & Debug build (Obj-C))
    问题 我在用Web服务进行通信的Objective C中编写了Cocoa应用,我希望它以调试模式连接到沙箱,并以发布模式连接到真实的Web服务。 我所需要的只是更改代码行,在该行中实例化保存配置的对象(使用不同的初始化消息和不同的参数)。 那么如何将一行代码交换为Release或Debug模式呢? 回答1 您可以检查#ifdef DEBUG ,但我建议您不要这样做。 调试和发布版本之间有很多差异。 不同的编译器优化,不同的符号集等... 总是会遇到一种情况,您想要针对调试目的在沙箱上运行Release版本....而针对生产Web服务运行调试版本,因为某些客户遇到的问题仅是在Release模式下才能重现。 因此,为此,我建议用户使用默认值。 参见NSUserDefaults 。 请注意,可以从命令行设置简单的用户默认值。 因此,您可以执行以下操作: /path/to/Myapp.app/Contents/Macos/Myapp -ServerMode Debug 回答2 您可以使用特定于配置的定义来更改已执行的代码。 首先阅读有关如何在Xcode中定义预处理器符号的信息。 然后,在您的代码中,执行以下操作: #if DEBUG_MODE #define BACKEND_URL @"http://testing.myserver.com" #else #define BACKEND
  • 如何根据文本标签的长度动态设置表格单元格的高度?(how to set table cell height dynamically depending on text label length?)
    问题 我正在尝试学习Obj-C和iOS编程,但是仍然很新。 我决定尝试制作一个简单的Reddit客户端应用程序。 我试图在UITableView显示首页帖子,每个帖子由其自己的单元格表示。 在单元格上,这是我设置标题的方式: cell.textLabel.numberOfLines = 0; cell.textLabel.text = [[tempDictionary objectForKey:@"data"] objectForKey:@"title"]; [cell.textLabel sizeToFit]; 但是,如果标题文本过长,则单元格最终会对其自身进行剪辑。 这是一张照片: 如何使单元格自动调整其高度以容纳更长的标题标签,而又不与其他单元格或详细文本标签相交? 感谢您的任何帮助! 回答1 对于新的iOS 8,有一种新方法可以简化这一过程。 有一个新参数可根据您的自动布局约束来计算单元格高度。 这是UITableViewAutomaticDimension 。 您可以在视图控制器的viewWillAppear方法中使用它。 目标C: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.tableView.estimatedRowHeight = 70.0; // for
  • Loopj在通过请求发送特殊字符之前弄乱了它们(Loopj messing special characters before sending them through a request)
    问题 我正在尝试通过http请求发送特殊字符,现在我将Loopj用作我的http客户端。 问题是,当我尝试发送特殊字符(即“áéíóú”)时,请求以字符“·ÈÌÛ˙”发出,这在服务器端引起了一些问题。 我遍历了Loopj代码,找不到与重新编码字符串有关的任何内容或类似的内容。 在最坏的情况下,似乎它将以UTF-8进行编码,而UTF-8实际上支持此字符。 希望任何人都能提供帮助。 此致。 回答1 我猜你的意思是AsyncHttpClient库,对吗? AHC默认将所有I / O编码为UTF-8。 由于缺乏源代码,我将指导您进行以下研究: 输入的编码是什么? 确保它在UTF-8中。 您是否通过可能更改其编码的过滤器/函数运行输入? 确保过滤器/功能也产生UTF-8。 在检查您的后端实际收到的内容之前,请更改您的客户端以提交到http://httpbin.org/post,然后检查结果。 如果您收到httpbin正确提交,并提交坏在你的后端,问题不是在AHC但在后端。 如果您在httpbin和后端均收到错误的提交,则发送的数据本来是错误的或编码错误。 希望这可以帮助您快速找到问题所在。 回答2 为什么不使用这种方法: HttpParams httpParameters = new BasicHttpParams(); HttpProtocolParams
  • jQuery切换事件弄乱了复选框的值(Jquery toggle event is messing with checkbox value)
    问题 当用户单击复选框时,我正在使用Jquery的toggle事件执行一些操作,例如: $('input#myId').toggle( function(){ //do stuff }, function(){ //do other stuff } ); 问题是当我单击复选框时,该复选框没有被打勾。 (我输入到toggle事件中的所有东西都正常工作。) 我尝试了以下方法: $('input#myId').attr('checked', 'checked'); 和 $(this).attr('checked', 'checked'); 甚至简单地 return true; 但是没有任何效果。 谁能告诉我我要去哪里错了? 编辑-感谢所有答复。 Dreas的回答几乎对我有用,除了检查属性的那一部分。 完美运行(尽管有点笨拙) $('input#myInput').change(function () { if(!$(this).hasClass("checked")) { //do stuff if the checkbox isn't checked $(this).addClass("checked"); return; } //do stuff if the checkbox isn't checked $(this).removeClass('checked'); })