我刚刚开始在 SwiftUI 中编码并遇到了一个问题。我需要为导航栏(NavigationView)的背景赋予不同的颜色。当我从一个视图转到下一个视图时,颜色会发生变化。我需要让它为“内联”的 navigationBarTitleDisplayMode 工作。
我尝试了SwiftUI update navigation bar title color中提出的解决方案 ,但这些解决方案都不能完全满足我的需要。
对该帖子的回复中的解决方案适用于内联: 使用 UIViewControllerRepresentable。然而,当我们第一次打开视图时,它会显示前一个视图的颜色一秒钟,然后再更改为新颜色。我想避免这种情况,并在所有内容出现在屏幕上时立即显示颜色。有没有办法做到这一点?
这个其他解决方案也不起作用:在 init() 中更改 UINavigation 的外观,因为当我在 init() 中设置背景时,它将更改应用程序中所有视图的背景。同样,我需要视图具有不同的背景颜色。
我尝试了类似于此解决方案的方法:修改工具栏,但它不允许我更改导航栏的颜色。
我尝试的另一个解决方案是:Creating navigationBarColor function,它基于:NAVIGATIONVIEW DYNAMIC Behind COLOR IN SWIFTUI。该解决方案适用于navigationBarTitleDisplayMode“large”,但是当将navigationBarTitleDisplayMode设置为“inline”时,它将以不同的颜色显示导航栏的背景颜色,就好像它被灰色/透明层覆盖一样。例如,它在“大”模式下显示的颜色是: 大模式下的红色 但是相反,它显示的颜色是: 内联模式下的红色
最后,我尝试了这个解决方案:子类化 UIViewController 并配置 viewDidLayoutSubviews(),但它也无法满足我的需求。
最接近我需要的解决方案是 1. 和 4.,但它们仍然不能 100% 工作。
有人知道如何使这些解决方案中的任何一个都适用于内联的 navigationBarTitleDisplayMode,能够更改不同布局中导航栏的背景颜色,并在显示视图后显示新颜色(无延迟)?
谢谢你!
顺便说一下,我使用的是 XCode 12.5。
以下是我正在使用的示例代码,以示例 4. 作为模型:
FirstView.swift
import SwiftUI
struct FirstView: View {
@State private var selection: String? = nil
var …Run Code Online (Sandbox Code Playgroud) 有些人喜欢使用inline关键字C,并在标题中添加大功能.你什么时候认为这是无效的?我认为它有时甚至很烦人,因为它很不寻常.
我的原则是inline应该用于非常频繁访问的小函数,或者用于实际类型检查.无论如何,我的品味指导我,但我不知道如何最好地解释为什么inline对大功能不那么有用的原因.
在这个问题中,人们建议编译器可以更好地猜测正确的事情.这也是我的假设.当我尝试使用这个参数时,人们回复它不适用于来自不同对象的函数.好吧,我不知道(例如,使用GCC).
谢谢你的回答!
我与Johannes Schaub就关键字进行了讨论.那里的代码是这样的:inline
namespace ... {
static void someFunction() {
MYCLASS::GetInstance()->someFunction();
}
};
Run Code Online (Sandbox Code Playgroud)
他说:
将其作为内联函数可以在可执行文件中保存代码大小
然而,约翰内斯表示明确指定它还有其他好处.不幸的是我不理解他们.例如,他说,"内联"允许您在程序中多次定义函数.,我很难理解(并找到参考).
所以
inline只是编译器的建议?inline?inline以减少可执行文件的大小,即使编译器(根据维基百科[我知道,错误的引用])应该自己找到这样的函数?还有什么我想念的吗?
我不知道为什么这个显示不正确,列表是水平显示的?而是垂直显示!
这是我的代码:
#stats li {
display: inline;
list-style-type: none;
padding-right: 20px;
}Run Code Online (Sandbox Code Playgroud)
<ul id="stats">
<li>
<h1>53</h1>
</a>
</li>
<li>
<h1>67</h1>
</a>
</li>
</ul>Run Code Online (Sandbox Code Playgroud)
我到处都看过如何做到这一点,还没有找到答案.是否可以在iPhone内联的UIWebView中播放YouTube视频,即不是全屏?我知道iPhone不支持flash,但youtube支持html5并且有h.264视频不是吗?我不应该这样做吗?
我已将allowsInlineMediaPlayback设置为YES,但仍然可以全屏播放.
C++链接器是否会自动内联"传递"函数,这些函数未在头文件中定义,并且未明确要求通过inline关键字"内联" ?
例如,以下情况经常发生,并且应始终受益于"内联",似乎每个编译器供应商都应该通过链接器"内联""自动"处理它(在可能的情况下):
//FILE: MyA.hpp
class MyA
{
public:
int foo(void) const;
};
//FILE: MyB.hpp
class MyB
{
private:
MyA my_a_;
public:
int foo(void) const;
};
//FILE: MyB.cpp
// PLEASE SAY THIS FUNCTION IS "INLINED" BY THE LINKER, EVEN THOUGH
// IT WAS NOT IMPLICITLY/EXPLICITLY REQUESTED TO BE "INLINED"?
int MyB::foo(void)
{
return my_a_.foo();
}
Run Code Online (Sandbox Code Playgroud)
我知道MSVS链接器将通过其链接时间代码生成(LTGCC)执行一些"内联" ,并且GCC工具链还支持链接时间优化(LTO)(请参阅: 链接器内联函数能否?).
此外,我知道有些情况下不能 "内联",例如当实现对链接器"不可用"时(例如,跨共享库边界,发生单独链接).
但是,如果这是代码链接到一个单一的,不跨越DLL /共享-lib的边界可执行文件,我希望编译器/连接器供应商,以自动内联函数,作为一个简单的和显而易见的优化(使双方获益的性能-和大小)? …
我最近在C#中实现了QuickSort算法.对包含数百万个项目的整数数组进行排序,代码的性能比.NET的实现大约低10%.
private static void QS(int[] arr, int left, int right)
{
if (left >= right) return;
var pIndex = Partition(arr, left, right);
QS( arr, left, pIndex);
QS( arr, pIndex + 1, right);
}
Run Code Online (Sandbox Code Playgroud)
在包含500万个项目的数组中,此代码比.NET慢大约60ms.
随后,我创建了另一个方法,该Partition()方法具有内联方法QS()(消除方法调用和return语句).然而,这导致性能下降到比.NET的排序方法慢约250ms.
为什么会这样?
编辑:这是该Partition()方法的代码.在内联版本中QS(),除了return语句之外,此方法的全部内容都替换了该var pIndex = Partition(arr, left, right);行.
private static int Partition(int[] arr, int left, int right)
{
int pivot = arr[left];
int leftPoint = left - 1;
int pIndex = …Run Code Online (Sandbox Code Playgroud) 我有一个宏将行号和文件名传递给错误处理程序:
#define SYSTEM_FAILURE (error_code, comment) \
System_Failure((error_code), (comment), __LINE__, __FILE__);
Run Code Online (Sandbox Code Playgroud)
__LINE__在内联函数中使用时如何解决?
file.h:
inline int divide(int x, int y)
{
if (y == 0)
{
SYSTEM_FAILURE(ENUM_DIVIDE_BY_ZERO, "divide by zero error");
}
return x/y;
}
Run Code Online (Sandbox Code Playgroud)
将__LINE__包含头文件中的行号,或调用内联函数的源文件的行号(假设编译器在源代码中执行"粘贴")?
根据F#的规格(见§6.5.7),for循环简单的通过整数界(int又名int32又名System.Int32)的限制start和stop,如
for i = start to stop do
// do sth.
Run Code Online (Sandbox Code Playgroud)
我想知道为什么要求这种类型的for循环的迭代界限int32.为什么不允许uint32?int64?bigint?
我知道序列迭代表达式(for ... in ...)可以迭代任意序列; 然而,这需要分配一个迭代器和调用MoveNext,Current什么不是,因此可能比普通循环效率低得多(增量计数器,比较,条件跳转).为避免这种情况,您将无法使用while和手动递增循环计数器......
奇怪的是,如果表达式包含在序列表达式中,F#确实允许非int32循环边界for,例如
seq { for i = 0I to 10I do
printfn "%A" i }
Run Code Online (Sandbox Code Playgroud)
所以,我想问题是:是否有一个特殊的原因只允许int32循环?为什么这个限制不适用于表达式中包含的for循环seq?
我没有在任何地方找到这个特定主题......
我在23个整数的std :: vector中的不同数据上调用nth_element()算法,每秒大约400,000次,更精确的"无符号短"值.
我想提高计算速度,这个特定的调用需要很大一部分CPU时间.现在我注意到,与std :: sort()一样,即使具有最高优化级别和NDEBUG模式(Linux Clang编译器),nth_element函数在探查器中也是可见的,因此比较是内联的而不是函数调用本身.好吧,更多的preise:不是nth_element()但是std :: __ introselect()是可见的.
由于数据的大小很小,我尝试使用二次排序函数PIKSORT,当数据大小小于20个元素时,它通常比调用std :: sort更快,可能是因为函数将是内联的.
template <class CONTAINER>
inline void piksort(CONTAINER& arr) // indeed this is "insertion sort"
{
typename CONTAINER::value_type a;
const int n = (int)arr.size();
for (int j = 1; j<n; ++j) {
a = arr[j];
int i = j;
while (i > 0 && a < arr[i - 1]) {
arr[i] = arr[i - 1];
i--;
}
arr[i] = a;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这比在这种情况下使用nth_element慢.
此外,使用统计方法是不合适的,比std :: nth_element更快
最后,由于值在0到约20000的范围内,因此直方图方法看起来不合适. …
inline ×10
c++ ×4
c ×2
performance ×2
background ×1
c# ×1
control-flow ×1
css ×1
f# ×1
for-loop ×1
html ×1
html-lists ×1
line ×1
linker ×1
nth-element ×1
optimization ×1
quicksort ×1
sorting ×1
swiftui ×1
uiwebview ×1
youtube ×1