小编dev*_*ush的帖子

在具有autolayout的UIView子类上正确使用intrinsicContentSize和sizeThatFits :.

我问这个(某种程度上)简单的问题只是为了挑剔,因为有时候我担心我可能会对许多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)

objective-c uiview ios autolayout cgsize

60
推荐指数
1
解决办法
4万
查看次数

是否可以使用颤振相机插件流式传输视频?

我一直在玩相机插件,我知道有可能通过CameraControllerwith 函数 捕获视频start/stopVideoRecording,这些函数将采用文件路径作为输入。

我希望能够在录制视频时将此视频流式传输到服务器,是否有可能以某种方式使用相机插件的当前功能?

camera video-streaming dart flutter

12
推荐指数
1
解决办法
2万
查看次数

在swift单元测试中以一种快速的方式模拟静态类方法?

我是一名经验丰富的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执行此操作并且函数也接受一个参数,我正在努力学习语法
  • 我可以在FIRApp周围使用包装器,但我想避免它,除非唯一可行的清洁解决方案.
  • 我可以继续使用协议并进行依赖性反转,但是作为静态的方法我再次遇到语法,我找不到一个简单的方法来使用静态方法对模拟类进行DI.

作为参考(个人和可能需要它的人),这些是我认为有用的一些资源,我将继续挖掘:

同时,每一个帮助都会非常感激.

作为旁注,有很多方法可以解决这个问题而不用嘲笑静态类方法,但我的目标是找到一种嘲弄它的方法,以便在测试更复杂时更好地理解最佳实践的情况.

unit-testing dependency-injection xctest swift swift-protocols

10
推荐指数
1
解决办法
1909
查看次数

为什么UIPageViewController中UITableView的内容插件在交互后会变得混乱?

我已经创建了一个基于页面的应用程序,并为一些实验进行了一些攻击; 我的简单目标是拥有一个UIPageViewController,其页面将包含一个UIViewController,其中包含一个UITableView(在进一步检查之后,如果我使用UITableViewController,我的实验结果是相同的).为此,我简单地编辑了项目模板,并使用Storyboard的ContainerView对象将UIPageViewController添加为RootViewController的嵌入视图,如此截图中所示:

故事板的控制器

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

uipageviewcontroller和tableview的内容插入问题

我已经能够通过在DataViewController的viewDidLayoutSubview方法中手动设置内容insets,并通过在任何控制器上禁用Adjusts Scroll View Insets来解决这个问题,所以我不需要这个来解决我的问题.我的问题是为什么在第一次控制器第一次从故事板加载后正确设置内容插入,以及为什么它们在任何类型的用户交互后中断.

如果您需要直接测试,这里是项目的链接

objective-c uitableview ios uipageviewcontroller uicontainerview

9
推荐指数
2
解决办法
5171
查看次数

通过提交更新github markdown任务列表(GFM)

如您所知,您可以使用标签在GFM (github flavoured markdown)中创建任务列表

- [ ] for unchecked task
- [x] for a checked task
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可能通过在提交中记录它来检查给定问题的任务列表中的任务.

markdown github task github-flavored-markdown

7
推荐指数
1
解决办法
469
查看次数

WKInterfaceLabel Min Scale如何工作?一旦设定值,它就会被忽略

我正在设置一个像这样的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 …

ios apple-watch watchkit wkinterfacelabel

5
推荐指数
1
解决办法
618
查看次数

Facebook SDK 是否默认在开发中禁用事件日志记录?

似乎是一个非常简单的问题,不需要堆栈溢出,但我似乎找不到直接而明确的答案。
我最近从谷歌分析换成了 FB 分析,非常精确地遵循了他们的设置教程。

如果配置是开发,则默认情况下不会记录事件(用于 facebook 分析),但我不确定,是这样吗?

我有一个谷歌分析的“试运行”选项,我问自己是否有这样的东西我无法找到,或者如果在调试模式下默认启用试运行,或者我应该这样做通过为预编译器添加 #if 语句来手动实现。

analytics facebook ios facebook-ios-sdk

5
推荐指数
0
解决办法
579
查看次数

在抽象类中将方法声明为可选方法

据我所知,在 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)

oop abstract-class interface dart

5
推荐指数
1
解决办法
6869
查看次数

为什么 Xcode 中缺少状态栏模拟指标?

正如标题中所述,从链接图像中可以看出,自 Xcode 9 以来,我缺少状态栏模拟指标下拉菜单。

无论项目如何,都是如此,所以我假设它不依赖于配置。

删除此功能是否有特定原因?

状态栏选项已删除

在具有深色背景的视图中,无法更改状态栏模拟指标会导致深色状态栏文本不可读:

在此处输入图片说明

xcode ios uistoryboard xcode-storyboard

5
推荐指数
1
解决办法
803
查看次数

如何正确抵消MKMapRect

我必须在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)

结果在以下屏幕截图中可见:

MKMapRect有100分顶部插图

但是,如果我(0,0,0,0)通过更改前一个代码段的第四行来设置边缘插入:

MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]  
                               edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];
Run Code Online (Sandbox Code Playgroud)

结果是这一个:

MKMapRect有0分顶部插图

您可以清楚地看到,偏移量已从顶部改变了50(而不是100)点.当我使用MKMapRegion的跨度纬度和经度增量时,或者更改设备屏幕时,事情似乎变得更加奇怪.

现在,我的目的只是告诉mapView在一个框架中绘制该路线,说"从顶部64点,高度为80点,宽度为320点",我找不到一个简单的方法来做到这一点而且我害怕我错过了一些东西.我不想通过改变区域的纬度进行游戏,因为内容大小可能会有所不同(可能会显示更小或更大的路线).我错过了什么,这可能是一个简单的方法吗?为什么插图没有正确计算?

objective-c mapkit mkmapview ios mkmaprect

3
推荐指数
1
解决办法
2473
查看次数

在 golang 中重置 http 处理程序以进行单元测试

我正在 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)

unit-testing http go server

3
推荐指数
1
解决办法
2828
查看次数

使用go http client Do方法时,httpResponse和error不能同时为nil吗?

官方文档以及几乎所有在线其他地方都可以看出,处理 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 客户端上的方法的文档,我无法理解是否可以接收两者resperr 不是nil,如果我们考虑 Do 方法文档中所写的内容,似乎这是可能的:

请求正文如果非零,将被底层传输关闭,即使出现错误也是如此。

发生错误时,任何响应都可以被忽略。仅当 CheckRedirect 失败时才会出现具有非零错误的非零响应,即使返回的 Response.Body 已关闭。

因此我的问题如下:

  1. 是否可以同时接收非零resp 和? err
  2. 如果可能的话,在我的程序中,我最终会收到很多错误,并且我returnpanic//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)

http go

1
推荐指数
1
解决办法
4971
查看次数