小编Tob*_*zer的帖子

在旋转接口方向时将contentOffset保留在UICollectionView中

我正在尝试在UICollectionViewController中处理接口方向更改.我想要实现的是,我想在接口旋转后拥有相同的 contentOffset.意思是,它应该根据边界变化的比例进行更改.

从肖像开始,内容偏移量为{ bounds.size.width*2,0} ...

在portait中的UICollectionView

...应该导致景观中的内容偏移{ bounds.size.width*2,0}(反之亦然).

UICollectionView在风景中

计算新的偏移量不是问题,但不知道,在何处(或何时)设置它以获得平滑的动画.我正在做的事情是使布局无效willRotateToInterfaceOrientation:duration:并重置内容偏移didRotateFromInterfaceOrientation::

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration;
{
    self.scrollPositionBeforeRotation = CGPointMake(self.collectionView.contentOffset.x / self.collectionView.contentSize.width,
                                                    self.collectionView.contentOffset.y / self.collectionView.contentSize.height);
    [self.collectionView.collectionViewLayout invalidateLayout];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;
{
    CGPoint newContentOffset = CGPointMake(self.scrollPositionBeforeRotation.x * self.collectionView.contentSize.width,
                                           self.scrollPositionBeforeRotation.y * self.collectionView.contentSize.height);
    [self.collectionView newContentOffset animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

这会在旋转后更改内容偏移.

如何在旋转期间设置它?我试图设置新的内容偏移量,willAnimateRotationToInterfaceOrientation:duration:但这会导致一种非常奇怪的行为.

一个例子可以在我的GitHub项目中找到.

cocoa-touch objective-c uiscrollview ios uicollectionview

70
推荐指数
8
解决办法
3万
查看次数

嵌套的AVMutableComposition

我试图在嵌套层次结构中使用AVMutableComposition.因此,我必须将一种成分放入其他成分中.这样做会导致以下错误消息:

AVCompositionTest [45347:10703] comp2 >>>操作无法完成

我使用了以下代码剪切.

AVAsset *audioAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"02 Undefined" ofType:@"mp3"]]];

AVMutableComposition *comp1 = [AVMutableComposition composition];

BOOL success = YES;
NSError *error = nil;

success = [comp1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
                         ofAsset:audioAsset
                          atTime:kCMTimeZero
                           error:&error];

if (!success) {
    NSLog(@"comp1 >>> %@", [error localizedDescription]);
}

AVMutableComposition *comp2 = [AVMutableComposition composition];

success = [comp2 insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
                         ofAsset:comp1
                          atTime:kCMTimeZero
                           error:&error];

if (!success) {
    NSLog(@"comp2 >>> %@", [error localizedDescription]);
}
Run Code Online (Sandbox Code Playgroud)

是否有可能筑巢成分?

cocoa avfoundation avmutablecomposition

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

NSDictionary的哈希值

我遇到了一个问题,我为不同的词典获得了相同的哈希值.也许我做了一些明显错误的事情,但我认为,具有不同内容(也就是不相等的对象)的对象应该具有不同的哈希值.

NSDictionary *dictA = @{ @"foo" : @YES };
NSDictionary *dictB = @{ @"foo" : @NO };

BOOL equal = [dictA hash] == [dictB hash];

NSAssert(!equal, @"Assuming, that different dictionaries have different hash values.");
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

cocoa objective-c nsdictionary

10
推荐指数
2
解决办法
6230
查看次数

无法在iOS上以后台模式重新启动中断的音频输入队列

我正在使用AudioQueue编写iOS应用程序进行录制.我创建一个配置为获得线性PCM的输入队列,声明此队列,一切都按预期工作.

为了管理中断,我实现了AVAudioSession的委托方法来捕获中断的开始和结束.endInterruption方法如下所示:

- (void)endInterruptionWithFlags:(NSUInteger)flags;
{
    if (flags == AVAudioSessionInterruptionFlags_ShouldResume && audioQueue != 0) {

        NSLog(@"Current audio session - category: '%@' mode: '%@'",
              [[AVAudioSession sharedInstance] category],
              [[AVAudioSession sharedInstance] mode]);

        NSError *error = nil;
        OSStatus errorStatus;
        if ((errorStatus = AudioSessionSetActive(true)) != noErr) {
            error = [self errorForAudioSessionServiceWithOSStatus:errorStatus];
            NSLog(@"Could not reactivate the audio session: %@",
                  [error localizedDescription]);
        } else {
            if ((errorStatus = AudioQueueStart(audioQueue, NULL)) != noErr) {
                error = [self errorForAudioQueueServiceWithOSStatus:errorStatus];
                NSLog(@"Could not restart the audio queue: %@",
                      [error localizedDescription]);
            }
        } …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c audioqueueservices ios avaudiosession

8
推荐指数
2
解决办法
2988
查看次数

- [CALayer setNeedsDisplayInRect:]导致重绘整个图层

我正在继承CALayer以提供我自己的方法绘图.为了优化,我打电话给-[MyLayer setNeedsDisplayInRect:]而不是-[MyLayer setNeedsDisplay].在绘图方法中,我得到了应该重绘的矩形CGContextGetClipBoundingBox().

如果我使用这个层作为UIView 的基础层,每个东西都按预期工作.一旦我将自定义图层用作其他CALayer的子图层,就会出现问题.比CGContextGetClipBoundingBox()始终返回层的边界的矩形.

有任何想法吗?

[编辑]

看来,没有保证,CALayer的内容被缓存,只有脏部分被重绘.我做了一个小测试,并将需要显示的矩形存储为一个单独的属性.结果是,只有这部分在屏幕上可见.

我现在将渲染到图像上下文并将该图像保存为缓存.在绘制方法中,我只显示缓存的图像.

cocoa-touch core-graphics calayer ios

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

XML 命名空间和无前缀属性

XML 命名空间规范解释说,无前缀属性的解释由它们出现的元素决定。并且无前缀属性名称的命名空间名称始终没有值

无前缀属性名称的命名空间名称始终没有值。

jid在以下情况下,此规则如何应用于属性的命名空间。

<query xmlns="jabber:iq:roster">
  <item jid="romeo@example.com"></item>
</query>
Run Code Online (Sandbox Code Playgroud)

如果命名空间的声明和相关属性都没有前缀,则该属性jid位于命名空间中jabber:iq:roster

<q:query xmlns:q="jabber:iq:roster">
  <q:item q:jid="romeo@example.com"></q:item>
</q:query>
Run Code Online (Sandbox Code Playgroud)

如果命名空间的声明和属性具有相同的前缀,则属性jid也具有命名空间jabber:iq:roster

<q:query xmlns:q="jabber:iq:roster">
  <q:item jid="romeo@example.com"></q:item>
</q:query>
Run Code Online (Sandbox Code Playgroud)

但是,如果使用前缀声明命名空间但该属性没有前缀,则该属性位于哪个命名空间中?我假设该属性jid

  1. 具有在父元素中声明的默认名称空间,

    <parent xmlns="http://example.com">
      <q:query xmlns:q="jabber:iq:roster">
        <q:item jid="romeo@example.com"></q:item>
      </q:query>
    </parent>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者没有命名空间,如果没有这样的声明。

我理解得对吗?

xml xml-namespaces

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

如何替换NSLayoutManager的文本存储

我正在尝试构建一个具有UITextView的表视图单元格.为了重用此表视图单元格,我将新文本存储设置到布局管理器.但是将布局管理器添加到新文本存储中不会更改文本视图的文本存储.

布局管理器,文本容器,文本视图的设置如下:

_myLayoutManager = [[NSLayoutManager alloc] init];
_myTextContainer = [[NSTextContainer alloc] init];

[_myLayoutManager addTextContainer:_myTextContainer];

_myTextView = [[UITextView alloc] initWithFrame:self.bounds
                                  textContainer:_myTextContainer];
Run Code Online (Sandbox Code Playgroud)

当我"配置"表格视图单元格时,我将布局管理器添加到新的文本存储中:

MyTextStorage *textStorage = ...
[textStorage addLayoutManager:self.myLayoutManager];
Run Code Online (Sandbox Code Playgroud)

这项工作到目前为止,新文本将正确显示.但是,当我重用单元格(将布局管理器添加到另一个文本存储)并获得文本视图的大小时,通过...

[self.myTextView systemLayoutSizeFittingSize:...]
Run Code Online (Sandbox Code Playgroud)

......得到错误的大小.在查看我发现的文本视图的属性后,它仍然指向错误的文本存储.

self.myLayoutManager.textStorage -> <new text storage>
self.myTextView.textStorage -> <old text storage>
Run Code Online (Sandbox Code Playgroud)

这感觉很奇怪.我是否需要再次设置整个堆栈(布局管理器,文本容器,文本视图)?

如果是,我需要启动一个新的文本视图,并更新布局约束,这将是非常昂贵的.

nslayoutmanager uitextview ios nstextstorage textkit

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

getAttributeNS的行为是什么?

我正在用JavaScript编写一个小程序,我要在其中解析以下小的XML片段:

<iq xmlns="jabber:client" other="attributes">
  <query xmlns="jabber:iq:roster">
    <item subscription="both" jid="romeo@example.com"></item>
  </query>
</iq>
Run Code Online (Sandbox Code Playgroud)

因为我不知道,如果元素和属性有名称空间前缀,我正在使用名称空间感知函数(getElementsByTagNameNS,getAttributeNS).

var queryElement = iq.getElementsByTagNameNS('jabber:iq:roster', 'query')[0];
if (queryElement) {
  var itemElements = queryElement.getElementsByTagNameNS('jabber:iq:roster', 'item');
  for (var i = itemElements.length - 1; i >= 0; i--) {
    var itemElement = itemElements[i];

    var jid = itemElement.getAttributeNS('jabber:iq:roster', 'jid');
  };
};
Run Code Online (Sandbox Code Playgroud)

使用此代码,我没有得到属性的值jid(我得到一个空字符串),但是当我使用itemElement.getAttribute('jid')而不是itemElement.getAttributeNS('jabber:iq:roster', 'jid')我得到预期的结果.

如何以命名空间感知的方式编写代码?在我对XML的理解中,属性jid的命名空间具有命名空间jabber:iq:roster,因此函数getAttributeNS应该返回值romeo@example.com.

[更新]问题是(或者是)我对使用命名空间和XML属性的理解,并且与DOM API无关.因此,我创建了另一个问题:XML命名空间和未加前缀的属性.另外因为XML命名空间和属性不幸没有给我答案.

[更新]我现在做的是首先检查是否存在没有命名空间的属性,然后是否存在具有命名空间的属性:

var queryElement = iq.getElementsByTagNameNS('jabber:iq:roster', …
Run Code Online (Sandbox Code Playgroud)

javascript xml html5 dom

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