在UITableViewCell子类中,我重写,layoutSubviews因为我需要计算几个子视图的帧.我所有计算的基础是内容视图的宽度.这是我的实现开始的layoutSubviews样子:
- (void) layoutSubviews
{
[super layoutSubviews]; // invoke this to set up the content view's bounds
CGFloat contentViewWidth = self.contentView.bounds.size.width;
[...] // calculate and assign frames to subviews
}
Run Code Online (Sandbox Code Playgroud)
我已经开始在iPhone模拟器的分组表视图中测试它了.单元格应该只包含内容视图中的内容,即我已经关闭了所有周围的花哨的东西.具体来说,我通过将附件类型设置为禁用了附件视图UITableViewCellAccessoryNone.因此,附件视图被隐藏,但其边界/框架属性仍然报告大小为20/20.
基于所有这些,以及下面的简单说明,我希望上面代码片段中的内容视图宽度报告为300.
<----------- screen width = 320 ----------->
+------------------------------------------+
| |
| <--- content view width = 300 ---> |
| +--------------------------------+ |
|<-->| table view cell |<-->|
| 10 +--------------------------------+ 10 |
| |
| [...] |
Run Code Online (Sandbox Code Playgroud)
但事实并非如此,实际报告的内容视图宽度为270!
一些研究表明,30个缺失点包括a)配件视图的20宽度,以及b)内容视图和附件视图之间的10个间距.我尝试将附件视图大小设置为0/0,效果是内容视图宽度现在报告为290.稍微好一些,但仍然是10分.我也尝试将accessoryView属性设置为nil,但视图只是重新创建 …
在我的通用应用程序中,我当前supportedInterfaceOrientations在窗口的根视图控制器中覆盖以定义允许的方向.到目前为止,决定是基于设备的用户界面习语:
- (NSUInteger) supportedInterfaceOrientations
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
else
return UIInterfaceOrientationMaskAll;
}
Run Code Online (Sandbox Code Playgroud)
现在我想改变它,以便我也可以支持iPhone 6 Plus的风景,但不支持其他iPhone.我可以想象一两个解决方案,但这些都非常脆弱,并且可能会在Apple开始制造新设备时破坏.
在理想的世界中,我想将上述方法更改为以下代码段,其中决策基于设备的用户界面大小类而不是用户界面惯用语:
- (NSUInteger) supportedInterfaceOrientations
{
// Note the hypothetical UIDevice method "landscapeSizeClass"
if ([[UIDevice currentDevice] landscapeSizeClass] == UIUserInterfaceSizeClassCompact)
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
else
return UIInterfaceOrientationMaskAll;
}
Run Code Online (Sandbox Code Playgroud)
landscapeSizeClass在UIKit的某个地方有类似神奇的方法吗?我在各种课程参考和指南中看了一下,但没有找到任何有用的东西.或者有人可以建议一个同样通用且面向未来的不同解决方案吗?
请注意,我的应用程序以编程方式创建其UI,因此纯粹基于故事板的解决方案已经完成.此外,我的应用程序仍然需要支持iOS 7,所以我不能只是改变一切使用大小类.但是,我可以做的是在使用简单的iOS 8 API之前进行运行时检查.
使用该函数libc++版本的程序getline在从管道读取输入时将阻塞,直到管道缓冲区已满。
对于该函数的版本,情况并非如此:在此处,该函数将立即读取并在输入可用后立即返回一行输入。libstdc++getline
我应该期待libstdc++和之间的这种行为差异libc++吗?[ 编辑:我在这里不是要征求意见,我只是对管道不甚了解,也对实施C ++标准库的困难不甚了解。对我来说,这种行为差异肯定是令人惊讶的,但也许有人知道更好,可以向我保证这种差异是可以预料的,也许这只是一个实现细节?]
更重要的是,我该怎么做才能libc++像人一样libstdc++?也就是说,该getline函数不应等到管道缓冲区已满,而应在可用时立即返回一行输入。
参见下面的代码示例,该代码示例显示了如何读取和写入管道。
我怀疑问题不仅限于macOS,但我还没有clang可以用来测试的Linux开发系统。
打开三个壳,我们称它们为A,B和C。
在外壳A中:创建一个新文件pipe-test.cpp并从下面添加源代码。一次编译源代码,一次编译libstdc++一次libc++:
g++ -stdlib=libstdc++ -o pipe-test-libstdc++ pipe-test.cpp
g++ -stdlib=libc++ -o pipe-test-libc++ pipe-test.cpp
Run Code Online (Sandbox Code Playgroud)
在外壳A中:创建两个管道:
mkfifo input-pipe output-pipe
Run Code Online (Sandbox Code Playgroud)
libstdc++程序版本pipe-test-libstdc++ input-pipe output-pipecat output-pipecat >input-pipe库“foo”依赖于库“bar”。这两个库的构建系统都基于 CMake。库“bar”提供了下游项目(例如库“foo”)可以使用的 CMake 包。
“foo”通过 Git 子模块集成“bar”。“foo”期望“bar”被构建并安装在特定位置的子模块路径中。文件夹结构如下所示:
/path/to/foo
+-- bar <-- "bar" Git submodule
| +-- build <-- "bar" out-of-source build folder
| +-- install <-- "bar" installation folder
+-- build <-- "foo" out-of-source build folder
+-- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
这是“foo”的简约 CMakeLists.txt,显示了find_package我正在使用的调用:
project ( foo )
set ( BAR_INSTALLATION_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/bar/build/install" )
find_package (
bar
0.1
EXACT
QUIET
PATHS ${BAR_INSTALLATION_PREFIX}
)
Run Code Online (Sandbox Code Playgroud)
这工作正常,即find_package找到“bar”,只要我为主机平台 macOS 构建“foo”。然而,当我尝试为 iOS 交叉编译“foo”时,find_package找不到“bar”。
我曾经-DCMAKE_FIND_DEBUG_MODE=ON诊断过这个问题,看起来find_package只是忽略了为该选项指定的文件夹PATHS。这是我在诊断过程中到达的简约命令行,但仍然存在问题:
cmake .. -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_FIND_DEBUG_MODE=ON …Run Code Online (Sandbox Code Playgroud) 假设两个非交叉矩形,宽10点,高5点.以下模式中的x/y值表示两个矩形的角点的坐标.
x/y = 0/0 +------------------+ x/y = 9/0
| |
| |
| |
| |
x/y = 0/4 +------------------+ x/y = 9/4
x/y = 0/5 +------------------+ x/y = 9/5
| |
| |
| |
| |
x/y = 0/9 +------------------+ x/y = 9/9
Run Code Online (Sandbox Code Playgroud)
这是设置这些矩形的代码:
CGRect rect1 = CGRectMake(0.0f, 0.0f, 10.0f, 5.0f);
CGRect rect2 = CGRectMake(0.0f, 5.0f, 10.0f, 5.0f);
Run Code Online (Sandbox Code Playgroud)
CGRectGetMaxXCore Graphics函数的返回值记录如下:
矩形的x坐标的最大值.
这是一个使用该函数的代码片段:
CGFloat maxX = CGRectGetMaxX(rect1);
Run Code Online (Sandbox Code Playgroud)
从文档中,我希望maxX是9.然而,maxX是10.嗯?
CGRectIntersectionCore Graphics函数的返回值记录如下: …
我维护strncpy了一大堆仍然使用很多的遗留代码.我现在开始strncpy用它的安全对应物替换使用的过程strncpy_s.我注意到这strncpy_s是用-2值填充目标缓冲区 - 但仅在调试版本中!在发布版本中,不会发生填充.
例如:
char buffer[3];
// buffer becomes 00000000 00000000 00000000
memset(buffer, 0, sizeof(buffer));
// buffer becomes 01100001 00000000 11111110
// 97 ('a') 0 -2
strncpy_s(buffer, sizeof(buffer), "a", _TRUNCATE);
// i is -2
int i = buffer[2];
Run Code Online (Sandbox Code Playgroud)
在MSDN文档不提这个填充行为,在我的情况下,它是真正的东西,我不想因为我的遗留代码依赖于一个事实,即缓冲区的归零部分保持零和字符串复制过程中不会被覆盖.
有没有办法阻止strncpy_s在调试版本中填充目标字符串?
请注意,我已使用Visual Studio 2010和Visual Studio 2013对此进行了测试.
我有一个函数应该通过将所有文件从源文件复制到目标文件夹来创建源文件夹的备份.该函数使用由FindFirstFile/ 驱动的while循环FindNextFile,然后调用函数CopyFile找到的每个文件Find....
现在,当源文件夹是SMB网络路径时(无论我是使用映射驱动器还是UNC路径),有时会FindNextFile"看到"文件,但CopyFile拒绝复制文件.错误代码是2,即ERROR_FILE_NOT_FOUND.
我发现这很难相信,所以我添加了一个调用_access备份函数,该函数在CopyFile调用之前检查文件是否存在.结果与for相同CopyFile,即_access报告文件不存在(返回代码-1并且errno为2,即ENOENT).
所以我的主要问题是:如何FindFirstFile/ FindNextFile"看到"网络文件夹中既CopyFile没有_access也看不到的文件?
附加信息/诊断:
CopyFile并_access在重试约4秒后突然开始看到有问题的文件.这向我表明确实存在某种网络延迟.因为如果它出现FindFirstFile/ FindNextFile不同接入网络的路径比CopyFile/ _access.不幸的是,我对这种效果的研究没有发现任何有用的信息,所以我只能推测.如果FindFirstFile/ FindNextFile/ CopyFile确实不能很好地协同工作,你知道一组不同的查找/复制API函数吗?
我尝试重构现有的和有效的 COM事件接收器实现.事件接收器类是用C++编写的,驻留在使用不推荐使用的CComModule类的DLL中.重构的目标是用CComModule新的ATL 7.0类CAtlComModule替换.
现有实现在.cpp文件中的某处声明了一个全局变量:
CComModule _Module;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,变量具有通常的"神奇"名称_Module.但是,缺少惯常的初始化,没有调用,CComModule::Init()DLL项目中也没有COM对象映射.事件接收器仍然有效,其事件处理程序方法被正确调用.
缺乏任何文档如何过渡CComModule到CAtlComModule,我天真地尝试将变量声明更改为:
CAtlComModule _Module;
Run Code Online (Sandbox Code Playgroud)
但是它没有用完:更改后事件接收器停止工作,即它的事件处理程序方法不再被调用.
有谁知道迁移到应该执行的步骤CAtlComModule?到目前为止,我无法在MSDN或谷歌上找到解决方案,但也许我看起来不正确...
顺便说一句:如果有必要,我可以提供有关事件接收器实现的更多细节,但到目前为止我觉得问题不在这个领域.
我的iOS应用程序使用的库依赖于Boost.在修改第三方构建系统的同时,我遇到了像这样的链接器警告
ld: warning: direct access in ___cxx_global_var_init to global weak symbol
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::~basic_ofstream()
means the weak symbol cannot be overridden at runtime.
This was likely caused by different translation units being compiled with different visibility settings.
Run Code Online (Sandbox Code Playgroud)
还有这个
ld: warning: direct access in __GLOBAL__I_a to global weak symbol
boost::exception_ptr::~exception_ptr()
means the weak symbol cannot be overridden at runtime.
This was likely caused by different translation units being compiled with different visibility settings.
Run Code Online (Sandbox Code Playgroud)
我看到关于这个警告还有很多其他问题.我按照他们的建议,确保所有版本中的可见性设置都相同(-fvisibility=hidden和-fvisibility-inlines-hidden).完全重建后,我仍然收到警告.
环境:
我有一个带有标识列的表,我想在INSERT之后得到它的值.以下代码,不使用参数,完美地工作:
string query = "INSERT INTO aTable ([aColumn]) VALUES (42)";
SqlCommand command = new SqlCommand(query, connection);
command.ExecuteNonQuery();
query = "SELECT CAST(SCOPE_IDENTITY() AS bigint)";
command = new SqlCommand(query, connection);
object identity = command.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)
如果我更改上面代码的INSERT部分以使用参数化查询,ExecuteScalar()则会突然返回一个System.DBNull值.这是参数化查询代码的样子:
string query = "INSERT INTO aTable ([aColumn]) VALUES (@aColumn)";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@aColumn", 42);
command.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
我试图更改SCOPE_IDENTITY代码,以便它使用输出参数并调用ExecuteNonQuery(),但我仍然在out参数中得到一个空值.我也尝试在两个不同版本的SQL Server(2012和2008,两个Express Edition)上运行代码,同样的结果.
我在这里做错了什么想法?