小编Jor*_*n H的帖子

如何在浏览器中模拟设备宽度和方向以测试媒体查询?

我正在本地开发我的网站,并使用Chrome进行预览.虽然调整浏览器大小以测试使用的媒体查询非常容易max/min-width,但我无法max/min-device-width通过任何内置设置进行模拟.是否有Chrome扩展程序可以模拟移动设备并触发媒体查询,具体而言max/min-device-width也是如此orientation:portrait/landscape

我基本上想用某种方法在我的计算机而不是智能手机上使用Chrome测试此媒体查询:
@media only screen and (max-device-width: 600px) and (orientation: portrait)

css google-chrome google-chrome-extension media-queries device-width

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

是否可以设置自定义单元格的textLabel?

当您对UITableViewCells 使用内置样式(字幕,右侧细节等)时,无论您选择哪种样式,都可以非常轻松地访问文本标签,textLabel以及detailTextLabel哪些属性UITableViewCell.我利用这个优势来实现可重用的代码,允许我将特定样式应用于我的所有静态单元格.但现在我想将它们全部转换为自定义样式单元格,但是使用这种样式我仍然只有两个标签.我的问题是,是否可以手动设置textLabeldetailTextLabel属性自定义单元格?如果是这样,我不必更改我的代码,我只需要设置标签属性.否则,我将不得不改变我的所有代码,以针对每个单独的单元格标记每个单独的标签,这将非常混乱.

对于我正在做的事情的一个例子,我有一个接受a UITableViewCell和in该方法的方法,我可以启用或禁用该单元格,它会根据需要将标签文本颜色更改为黑色或浅灰色.如果我无法访问textLabeldetailTextLabel属性,我将需要添加if语句来比较单元格参数和我的单元格出口,以了解我需要更改哪些标签.

objective-c uitableview ios

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

如何存储Closure完成处理程序以便稍后调用?

我正在努力将这个应用程序内购买教程转换为Swift,并且遇到了一个试图保存完成处理程序的问题.我们需要存储这个完成处理程序,以便以后可以调用它.我无法弄清楚如何从参数中存储闭包的副本.具体来说,我相信我需要复制它,但Xcode声明这个对象没有复制功能.

我这样定义它:

typealias RequestProductsCompletionHandler = (success: Bool, products: NSArray) -> Void
Run Code Online (Sandbox Code Playgroud)

在这里,我为它声明了一个属性:

var completionHandler: RequestProductsCompletionHandler?
Run Code Online (Sandbox Code Playgroud)

然后我需要将传入的完成处理程序存储到我的属性中:

func requestProductsWithCompletionHandler(completionBlock: RequestProductsCompletionHandler) -> Void {
    //self.completionHandler = completionBlock.copy() //problem: RequestProductsCompletionHandler does not have a member named copy
}
Run Code Online (Sandbox Code Playgroud)

这是在Obj-C教程中完成的:

typedef void (^RequestProductsCompletionHandler)(BOOL success, NSArray * products);

RequestProductsCompletionHandler _completionHandler;

- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
    _completionHandler = [completionHandler copy];
}
Run Code Online (Sandbox Code Playgroud)

后来它被这样使用:

_completionHandler(YES, skProducts);
_completionHandler = nil;
Run Code Online (Sandbox Code Playgroud)

编辑:我已删除.copy()以防止错误(还必须使NSArray可选,以便我可以将其设置为零以后).我的问题是,它是否会按预期工作而不明确复制它?我不相信它会因为Apple声明闭包是参考类型.这将存储对原始闭包的引用,我不想这样做.如何执行副本?

closures in-app-purchase ios swift

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

UIScrollView框架在iOS 8和iOS 7上的大小不同

我实现了一个视图控制器,它只显示一个图像,并允许用户捏合放大/平移图​​像.它在iOS 7上运行良好,但在iOS 8上,滚动视图的框架大小不同,最终结果是iPhone上的图像放大太远,在iOS 8上运行时在iPad上缩小得太远.这是因为滚动视图框架的宽度为600pt,这是故事板中的大小(使用大小类的通用故事板).但我有自动布局约束,应该确保滚动视图延伸以填充可用空间 - 它应该是在iPad上768pt.iOS 7就是这种情况,而不是iOS 8.

这是设置:在界面生成器,我有一个UIViewController包含UIView其中包含UIScrollView有自动布局约束上落后,领先,底部和顶部空间到上海华.然后在viewDidLoad:

    UIImage *image = [UIImage imageNamed:@"image"];
    self.imageView = [[UIImageView alloc] initWithImage:image];
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);

    [self.scrollView addSubview:self.imageView];
    self.scrollView.contentSize = image.size;

    #warning Bug here - scroll view frame is 600pt on iOS 8 - should be 768 for iPad
    NSLog(@"scroll view frame wid: %f", self.scrollView.frame.size.width);
Run Code Online (Sandbox Code Playgroud)

我发现如果我把它NSLog放在viewDidAppear框架的宽度正确768pt.我尝试将代码移动到viewWillAppear而不是viewDidLoad,但我得到相同的结果 - 它也是600 viewWillAppear.因此滚动视图正确拉伸以填充显示,但直到它出现在屏幕上之后.在图像出现在屏幕上之前我需要正确的帧大小,以便我可以计算出正确的最小和最大缩放值.

我该怎么做才能解决这个问题并确保它适用于iOS 7和8?

uiscrollview uiimageview ios autolayout ios8

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

使用Interface Builder中的"自动布局"启用NSScrollView以滚动其内容

我已经实现了一个NSView包含许多NSTextFields和其他NSViews 的自定义.然后,我使用编辑器>嵌入>滚动视图在滚动视图中嵌入该自定义视图.这将在Outline中创建适当的层次结构,但我需要添加Auto Layout约束以指定此滚动视图应放置在视图中的位置(顶部,底部,前导,尾随).另外,我必须为剪辑视图添加自定义视图的约束,以便在正确的位置布置元素.这很有效,当我运行应用程序时,所有元素都会正确显示,并且视图会弹回滚动.但是,当我减小主视图的高度以使并非所有元素都适合屏幕时,会出现自动布局警告,当我更新帧时,它会再次增加视图的高度.为了解决这个问题,我不得不将滚动视图的底部约束移到主视图中.现在,当我运行应用程序时,窗口设置为正确的大小,但我无法滚动自定义视图以到达内容的底部 - 它受到限制,因此它除了弹性反弹效果之外根本不会滚动,因为你'重新处于边缘限制.所以我的问题是,当我在XIB中布局所有元素并使用自动布局时,我必须做什么才能允许滚动视图滚动?

macos cocoa interface-builder nsscrollview autolayout

7
推荐指数
2
解决办法
3722
查看次数

无法编辑屏幕截图,performChanges阻止失败

我正在开发一个允许用户使用PhotoKit编辑照片的应用程序.我之前将编辑过的照片以JPEG格式保存到磁盘.我想避免转换为JPEG,并已实施修改,以便这样做.它适用于使用相机拍摄的照片,但如果您尝试编辑屏幕截图,则该PHPhotoLibrary.sharedPhotoLibrary().performChanges块将失败并记录The operation couldn’t be completed. (Cocoa error -1.).我不确定为什么这会导致performChanges块失败,我在这里做错了什么?

我已经创建了一个可供下载示例应用程序来演示问题,我已经在下面提供了相关代码.该应用会尝试编辑照片库中的最新照片.如果成功,它将提示访问以编辑照片,否则不会发生任何事情,您将看到控制台日志.要重现此问题,请截取屏幕截图然后运行该应用.

当前使用屏幕截图的代码:

let jpegData: NSData = outputPhoto.jpegRepresentationWithCompressionQuality(0.9)

let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input)

var error: NSError?
let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: &error)
if success {
    return contentEditingOutput
} else {
    return nil
}
Run Code Online (Sandbox Code Playgroud)

导致屏幕截图失败的替换代码:

let url = self.input.fullSizeImageURL
let orientation = self.input.fullSizeImageOrientation
var inputImage = CIImage(contentsOfURL: url)
inputImage = inputImage.imageByApplyingOrientation(orientation)

let outputPhoto = createOutputImageFromInputImage(inputImage)!

let originalImageData = NSData(contentsOfURL: self.input.fullSizeImageURL)!
let imageSource = CGImageSourceCreateWithData(originalImageData, …
Run Code Online (Sandbox Code Playgroud)

cgimage nsdata ios ios8 photokit

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

在NSUserActivity上CSSearchableIttributeSet应该使用哪些属性?

我在网站上添加了Web Markup,因此当用户在iOS 9中搜索时,项目将显示在Spotlight搜索结果中.用户可以浏览应用程序中的相同项目,因此我想创建NSUserActivity在用户浏览项目时链接到Web内容的对象.

现在,NSUserActivity有一个contentAttributeSet属性我将用于将缩略图照片附加到活动.CSSearchableItemAttributeSet有一些属性NSUserActivity也有,所以我不确定我应该实现哪一个,或者我应该为两者指定相同的数据.难道我设置titleNSUserActivity,以及在titleCSSearchableItemAttributeSet,或只有一个或其他?同样keywords是两者的财产.

NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@“com.domain.appname-something"];
activity.title = @“My Title";
activity.keywords = [NSSet setWithArray:@[@“one", @“two", @“three"]];
activity.userInfo = @{@“id": @“12345"};
activity.requiredUserInfoKeys = [NSSet setWithArray:@[@“id"]];
activity.eligibleForSearch = YES;
activity.eligibleForPublicIndexing = YES;
activity.webpageURL = [NSURL URLWithString:@"https://someurl.com"];

//QUESTION: Do I need to duplicate title and keywords here:
CSSearchableItemAttributeSet *contentAttributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeImage];
contentAttributeSet.title = activity.title;
contentAttributeSet.displayName = …
Run Code Online (Sandbox Code Playgroud)

ios corespotlight ios-searchapi nsuseractivity

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

使用NSKeyValueObservation来观察UserDefaults中的值

我想使用Swift 4中基于块的KVO来观察值的变化UserDefaults.我能够观察的关键路径做到这一点WKWebViewestimatedProgress,但都没有成功与UserDefaults因为提供的关键路径是不是它的寻找.提供一个字符串是不够的(无法推断通用参数'值'),前缀\不够(表达式类型没有更多上下文是模糊的).创建KeyPath观察值的正确方法是UserDefaults什么?

observerToken = UserDefaults.standard.observe("myvalue") { (object, change) in
    //...
}
Run Code Online (Sandbox Code Playgroud)

key-value-observing ios swift swift4

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

在滚动视图中使用堆栈视图并遵守安全区域插图

我有一个UIStackView垂直滚动的内部UIScrollView,所有内容都受“自动版式”限制。滚动视图填充超级视图,堆栈视图填充滚动视图,然后将各种元素添加到堆栈视图中。为了使它与“自动版式”一起很好地发挥作用并定义滚动视图的内容大小,还必须指定堆栈视图的宽度。这是通过在堆栈视图上添加等于滚动视图宽度的宽度约束来完成的。在这一点上,没有什么是模棱两可的,它的行为完全符合预期。

现在,如果要添加边距以使元素不会延伸到屏幕的最左侧和右侧边缘,则可以将堆栈视图上的前导约束和尾随约束常量更改为例如在两侧插入15pt。但是,您必须确保将等宽约束常数更改为-30。效果很好,插入了可滚动内容,仍然允许您在屏幕的远处滑动以滚动。

现在,iPhone X出现了,横向放置15pt的填充物已不再足够,因为内容被放置在外壳传感器的下方。因此,您需要更新此设置以设置边距以遵守安全区域布局边距。您真的只想使用默认边距。您可以更改堆栈视图的前导约束和尾随约束常量以使用视图的布局边距(考虑安全区域插图),但这将不起作用,因为等宽度约束常量不再是边距量的两倍,而且边距是动态的现在。

因此,解决此问题的一种方法是IBOutlet为堆栈视图的前,尾和宽度约束创建,然后在布局边距更改时以编程方式调整所有边界viewLayoutMarginsDidChange。但是我想知道是否有更好的方法,最好是在Interface Builder中运行的解决方案,不需要任何代码。

uiscrollview ios autolayout uistackview

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

文字中的转义序列无效:"\ b"

我需要能够创建一个String "\b".但是当我尝试时,Xcode会抛出编译时错误:文字中的转义序列无效.我不明白为什么,但"\r"工作得很好.如果我把"\\b"那就是实际存储在String中的东西,这不是我需要的东西 - 我只需要一个反斜杠.对我来说,这似乎是一个Swift古怪,因为它在Objective-C中运行得很好.

let str = "\b" //Invalid escape sequence in literal
NSString *str = @"\b"; //works great
Run Code Online (Sandbox Code Playgroud)

我需要生成这个字符串,因为这"\b"是检测用户何时使用"删除"的唯一方法UIKeyCommand:

let command = UIKeyCommand(input: "\b", modifierFlags: nil, action: "didHitDelete:")
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

编辑:它真的不想生成一个只有的字符串"\b",这不起作用 - 它保持原始值:

var delKey = "\rb"
delKey = delKey.stringByReplacingOccurrencesOfString("r", withString: "", options: .LiteralSearch, range: nil)
Run Code Online (Sandbox Code Playgroud)

string escaping ios swift

6
推荐指数
2
解决办法
6272
查看次数