我问这个(某种程度上)简单的问题只是为了挑剔,因为有时候我担心我可能会对许多UIView的API进行误操作,特别是在涉及自动布局时.
为了使它变得非常简单,我将使用一个例子,假设我需要一个具有图像图标和多行标签的UIView子类; 我想要的行为是我的视图高度随着标签的高度而变化(以适应文本内部),而且,我正在使用Interface builder进行布局,所以我有这样的事情:

使用一些约束来为图像视图提供固定的宽度和高度,并将固定的宽度和位置(相对于图像视图)固定到标签:

现在,如果我在标签上设置了一些文本,我希望视图在高度上调整大小以适应它,或者保持与xib中相同的高度.在自动布局之前我会做到这样的事情:
在CustoView子类文件中,我会sizeThatFits:像这样重写:
- (CGSize) sizeThatFits:(CGSize)size{
//this stands for whichever method I would have used
//to calculate the height needed to display the text based on the font
CGSize labelSize = [self.titleLabel intrinsicContentSize];
//check if we're bigger than what's in ib, otherwise resize
CGFloat newHeight = (labelSize.height <= 21) ? 51: labelSize.height+20;
size.height = newHeight;
return size;
}
Run Code Online (Sandbox Code Playgroud)
而且我会称之为:
myView.titleLabel.text = @"a big text to display that should be more than a line";
[myView …Run Code Online (Sandbox Code Playgroud) 我一直在玩相机插件,我知道有可能通过CameraControllerwith 函数 捕获视频start/stopVideoRecording,这些函数将采用文件路径作为输入。
我希望能够在录制视频时将此视频流式传输到服务器,是否有可能以某种方式使用相机插件的当前功能?
我是一名经验丰富的Objective-c程序员,但我不能对Swift说同样的话,我很难在不使用像OCMock这样的框架的情况下在swift中测试一个类.
问题:我正在将Firebase集成到一个混合的Objective-C/Swift项目中,我需要根据应用程序的构建配置对其进行配置.
我为此编写了一个Swift类(将由obj-c app委托使用),但是由于firebase框架是通过静态类方法配置的FIRApp.configure(with: FIROptions),所以我需要以某种方式模拟这个方法以进行单元测试它.
我的代码,没有任何处理依赖注入,看起来像这样:
@objc class FirebaseConfigurator: NSObject{
func configureFirebase(){
let config = configManager.buildConfiguration
var optionsPlistBaseName = getPlistName()
let optionsFile = Bundle.main.path(forResource: optionsPlistBaseName, ofType: "plist")
guard let opts = FIROptions(contentsOfFile: optionsFile) else{
assert(false, "fatal: unable to load \(optionsFile)")
return
}
FIRApp.configure(with: opts)
}
func getPlistName() -> String{
// retrieves correct plist name and returns it
}
}
Run Code Online (Sandbox Code Playgroud)
我做了一些研究,但到目前为止我没有发现任何适合我的解决方案,但我想到的是以下其中一项:
FIRApp.configure(with:)但是我应该从objective-c执行此操作并且函数也接受一个参数,我正在努力学习语法作为参考(个人和可能需要它的人),这些是我认为有用的一些资源,我将继续挖掘:
同时,每一个帮助都会非常感激.
作为旁注,有很多方法可以解决这个问题而不用嘲笑静态类方法,但我的目标是找到一种嘲弄它的方法,以便在测试更复杂时更好地理解最佳实践的情况.
unit-testing dependency-injection xctest swift swift-protocols
我已经创建了一个基于页面的应用程序,并为一些实验进行了一些攻击; 我的简单目标是拥有一个UIPageViewController,其页面将包含一个UIViewController,其中包含一个UITableView(在进一步检查之后,如果我使用UITableViewController,我的实验结果是相同的).为此,我简单地编辑了项目模板,并使用Storyboard的ContainerView对象将UIPageViewController添加为RootViewController的嵌入视图,如此截图中所示:

每个控制器都通过故事板配置来自动调整滚动视图的内容插入,如果我使用此配置启动项目,一切看起来都很好,并且DataViewController的tableview正确地在导航栏下按预期正确调整内容插件; 但是,当用户与tableview进行交互时,内容insets会中断,tableview会在导航栏下面显示:

我已经能够通过在DataViewController的viewDidLayoutSubview方法中手动设置内容insets,并通过在任何控制器上禁用Adjusts Scroll View Insets来解决这个问题,所以我不需要这个来解决我的问题.我的问题是为什么在第一次控制器第一次从故事板加载后正确设置内容插入,以及为什么它们在任何类型的用户交互后中断.
如果您需要直接测试,这里是项目的链接
objective-c uitableview ios uipageviewcontroller uicontainerview
如您所知,您可以使用标签在GFM (github flavoured markdown)中创建任务列表
- [ ] for unchecked task
- [x] for a checked task
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能通过在提交中记录它来检查给定问题的任务列表中的任务.
我正在设置一个像这样的WKInterfaceController:
(将RTC视为相对于容器,将AL视为对齐,将STF视为适合内容的大小)
- Main Group: w: RTC (1) h: RTC (1) - AL h: Center v: Top
- WKInterfaceImage w: 30 h: 30 - AL h: Center v: Top
- Mid Group: w: RTC (1) h: RTC (0.5) - AL h: Center v: Center
- WKInterfaceLabel: w: RTC (1) h: RTC (0.5) - AL h: Center v: Center
- Bottom Group: w RTC (1) h: STC - AL h: Center v: Bottom
- other stuff...
Run Code Online (Sandbox Code Playgroud)
表示看起来像这样:
我希望Mid Group中包含的标签的字体缩小,如果文本太大而不能留在它里面(如果多行则可以).为了实现这一点,我将字体设置为系统粗体30,Min Scale …
似乎是一个非常简单的问题,不需要堆栈溢出,但我似乎找不到直接而明确的答案。
我最近从谷歌分析换成了 FB 分析,非常精确地遵循了他们的设置教程。
如果配置是开发,则默认情况下不会记录事件(用于 facebook 分析),但我不确定,是这样吗?
我有一个谷歌分析的“试运行”选项,我问自己是否有这样的东西我无法找到,或者如果在调试模式下默认启用试运行,或者我应该这样做通过为预编译器添加 #if 语句来手动实现。
据我所知,在 Dart 中可以使用抽象类来声明“接口”或“协议”(如果您来自 Objective-c)。无论如何,我无法找到在抽象类/接口中声明可选方法的方法。
如果我在抽象类A 中声明一个方法,并让具体类B实现A,我会在编译器中收到警告。我希望能够将一个方法声明为可选的,或者至少提供一个默认实现,而无需在实现我的接口的类中“重新声明”它。
abstract class A{
void abstractMethod();
}
class B implements A{
//not implementing abstract method here gives a warning
}
Run Code Online (Sandbox Code Playgroud) 正如标题中所述,从链接图像中可以看出,自 Xcode 9 以来,我缺少状态栏模拟指标下拉菜单。
无论项目如何,都是如此,所以我假设它不依赖于配置。
删除此功能是否有特定原因?
在具有深色背景的视图中,无法更改状态栏模拟指标会导致深色状态栏文本不可读:
我必须在MKMapView上显示MKMapRoute,它必须显示在我的地图上的特定区域,而不是在中心,而是在顶部区域.它必须放在约80个高度的"框架"中.
我想我可以通过使用MKMapView的方法来实现这一点
- (MKMapRect)mapRectThatFits:(MKMapRect)mapRect edgePadding:(UIEdgeInsets)insets
但我面临着一些奇怪的现象.确切地说,如果我使用这段代码:
//obj is the returned mkroute object.
MKRoute *rout = obj;
MKPolyline *line = [rout polyline];
MKMapRect boundingMapRect = [line boundingMapRect];
MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]
edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];
MKCoordinateRegion r = MKCoordinateRegionForMapRect(fittedRect);
[self.mapView setRegion: r animated:YES];
Run Code Online (Sandbox Code Playgroud)
结果在以下屏幕截图中可见:

但是,如果我(0,0,0,0)通过更改前一个代码段的第四行来设置边缘插入:
MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]
edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];
Run Code Online (Sandbox Code Playgroud)
结果是这一个:

您可以清楚地看到,偏移量已从顶部改变了50(而不是100)点.当我使用MKMapRegion的跨度纬度和经度增量时,或者更改设备屏幕时,事情似乎变得更加奇怪.
现在,我的目的只是告诉mapView在一个框架中绘制该路线,说"从顶部64点,高度为80点,宽度为320点",我找不到一个简单的方法来做到这一点而且我害怕我错过了一些东西.我不想通过改变区域的纬度进行游戏,因为内容大小可能会有所不同(可能会显示更小或更大的路线).我错过了什么,这可能是一个简单的方法吗?为什么插图没有正确计算?
我正在 golang 中测试一个 http 服务器,除了一件烦人的事情之外,一切看起来都很顺利。
在某些时候,当我配置服务器时,在执行http.ListenAndServe我注册一个处理程序之前http.Handle("/", myrouter),问题是在以下测试中,当再次调用配置方法时,我收到以下恐慌:
恐慌:http:/ [已恢复]的多个注册
我想在干净的环境中运行每个测试,但还没有找到拆卸的方法http.DefaultServeMux,是否有一种方便的方法可以通过“清空”某些内容或重新配置测试环境来执行每个测试在新鲜的环境中?
编辑: 为了按照要求提供一些背景信息,我在这里发布了一些代码和我想编写的测试,我必须清楚地表明我什至不确定这里所做的实现选择(我想我会以稍微不同的方式配置服务器,但代码不是我的)。
package httpserver
import (
"github.com/gorilla/mux"
"github.com/private/private/httpserver/rpchandler"
"net/http"
)
type HTTPServer struct {
router *mux.Router
port int
}
// Config is used to override the default port of the http server.
type Config struct {
Port *int
}
func NewHTTPServer(config *Config) (*HTTPServer, error) {
hs := &HTTPServer{
port: 80,
}
// Overwrite default port if passed.
if config != nil && config.Port != …Run Code Online (Sandbox Code Playgroud) 从官方文档以及几乎所有在线其他地方都可以看出,处理 http 客户端错误的常见模式如下:
req, err := http.NewRequest("GET", "http://example.com", nil)
req.Header.Add("If-None-Match", `W/"wyzzy"`)
resp, err := client.Do(req)
if err != nil {
// handle error
}
defer resp.Body.Close()
Run Code Online (Sandbox Code Playgroud)
阅读有关 http 客户端上的方法的文档,我无法理解是否可以接收两者resp而err 不是nil,如果我们考虑 Do 方法文档中所写的内容,似乎这是可能的:
请求正文如果非零,将被底层传输关闭,即使出现错误也是如此。
发生错误时,任何响应都可以被忽略。仅当 CheckRedirect 失败时才会出现具有非零错误的非零响应,即使返回的 Response.Body 已关闭。
因此我的问题如下:
resp 和? errreturn或panic在//handle error上面显示的代码片段中,因此永远不会立即达到延迟,从长远来看,我最终是否有可能得到运输工具无法关闭太多打开的尸体?上下文附录:
我遇到的问题是,过了一会儿,程序崩溃了,并在 stdErr 上显示了以下 goroutine 的大打印,并且按照跟踪,我最终得到了一段看起来正常的代码,除非遇到错误时发生了不好的事情并且有一个responseBody,不会延迟关闭,但既然官方文档说不用担心它,问题一定在其他地方......
Stderr logs
Display timestamps
net/http.(*persistConn).readLoop(0xc4244e0240)
/usr/local/go/src/net/http/transport.go:1474 +0x196
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:1117 +0xa35
goroutine 194055 …Run Code Online (Sandbox Code Playgroud) ios ×6
objective-c ×3
dart ×2
go ×2
http ×2
unit-testing ×2
analytics ×1
apple-watch ×1
autolayout ×1
camera ×1
cgsize ×1
facebook ×1
flutter ×1
github ×1
interface ×1
mapkit ×1
markdown ×1
mkmaprect ×1
mkmapview ×1
oop ×1
server ×1
swift ×1
task ×1
uistoryboard ×1
uitableview ×1
uiview ×1
watchkit ×1
xcode ×1
xctest ×1