小编XJo*_*nes的帖子

为什么AVCaptureVideoOrientation横向模式会导致静止图像颠倒?

我正在使用AVFoundation类在我的应用程序中实现自定义相机.我只捕捉静止图像,而不是视频.我有一切工作,但我被一些东西困扰.我会在捕获静止图像时考虑设备方向,并适当地设置视频连接的videoOrientation.代码段:

    // set the videoOrientation based on the device orientation to
    // ensure the pic is right side up for all orientations
    AVCaptureVideoOrientation videoOrientation;
    switch ([UIDevice currentDevice].orientation) {
        case UIDeviceOrientationLandscapeLeft:
            // Not clear why but the landscape orientations are reversed
            // if I use AVCaptureVideoOrientationLandscapeLeft here the pic ends up upside down
            videoOrientation = AVCaptureVideoOrientationLandscapeRight;
            break;
        case UIDeviceOrientationLandscapeRight:
            // Not clear why but the landscape orientations are reversed
            // if I use AVCaptureVideoOrientationLandscapeRight here the pic ends up upside down …
Run Code Online (Sandbox Code Playgroud)

iphone image-capture ios avcapturesession avcapturedevice

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

使用iOS布局约束是否可以在高度为0时折叠标签之间的填充?

考虑一个包含三个UILabel垂直约束的视图,其定义如下:

[self.view
 addConstraints:[NSLayoutConstraint
                 constraintsWithVisualFormat:@"V:[label1]-2-[label2]-2-[label3]"
                 options:0
                 metrics:nil
                 views:views]];
Run Code Online (Sandbox Code Playgroud)

这将生成一个布局,标签垂直堆叠,每个标签之间有2px填充.

在我的应用程序中,有时一个或多个标签上显示的文本是nil(或空白),这意味着标签框架最终高度== 0.在这种情况下,我希望0高度标签之间的2px填充是崩溃了.

当所有标签都有文本值时,我希望布局为:

label1 text
[2px]
label2 text
[2px]
label3 text

label2有一个nil文本值时,我希望布局为:

label1 text
[2px]
label3 text

在后一种情况下,标签2实际上仍然存在但是高度为0且其2px填充已经折叠.

问题:这可能吗?我如何定义约束来实现这一目标?

编辑

我意识到可以在子类中实现填充(边缘插入)UILabel并从约束中取出填充.我可能会走那条路,只是希望有一种方法来定义在约束定义中折叠这个填充.

ios autolayout nslayoutconstraint

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

如何在[UIAlertView initWithTitle ...]中调用一个采用可变数量参数的方法的超类实现?

OS X Developer Library显示了如何在以下技术文章中创建一个采用可变数量args的方法:http://developer.apple.com/library/mac/#qa/qa1405/_index.html.

我试图弄清楚是否可以继承现有的方法实现,该方法采用变量args并调用超类实现.

以UIActionSheet为例,请看下面的代码.调用超类initWithTitle方法只传递第一个'otherButtonTitle'.我不知道如何传递变量参数列表中包含的其余字符串.

// MyActionSheet.m

- (id)initWithTitle:(NSString *)title
           delegate:(id < UIActionSheetDelegate >)delegate
  cancelButtonTitle:(NSString *)cancelButtonTitle
destructiveButtonTitle:(NSString *)destructiveButtonTitle
otherButtonTitles:(NSString *)otherButtonTitles, ...
{
    // this calls the superclass initWithTitle: method but does not
    // pass NIL terminated list of strings
    self = [super initWithTitle:title
                       delegate:delegate
              cancelButtonTitle:cancelButtonTitle
         destructiveButtonTitle:destructiveButtonTitle
              otherButtonTitles:otherButtonTitles, nil];
    if (self) {
        // custom initialization
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我可以使用va_list,va_start,va_end获取args,但不知道如何将它们传递给超类方法.

万一有人试图告诉我,我可以用不同的方式做到这一点(例如,不要传递变量args但是使用va_list,va_start,va_end创建一个字符串数组并调用addButtonWithTitle:多次,我知道我可以我用UIActionSheet作为例子.在其他情况下,使用变量args对方法进行子类化的能力将是有用的,我想学习如何做到我所问的是否可行.

谢谢!

iphone variables methods arguments objective-c

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

如何在转换为ARC后完成处理之前确保控制器保留?

我在我的应用程序中使用以下模式并转换到ARC.基本上,对象保留控制器的实例,并在通过委托协议通知它已完成时释放该控制器.我不使用iVar /属性b/c startProcess可以调用N次来处理N个东西.

示例如下:

// start a process in a controller
- (void)startProcess
{
    MyController *controller = [[MyController alloc] init];
    // set the delegate, the delegate is defined as (nonatomic, assign)
    controller.delegate = self;
    [controller start];
}

// when the delegate is notified, release the controller
- (void)myControllerDidFinish:(MyController):controller
{
    // do something with results
    [controller release];
}
Run Code Online (Sandbox Code Playgroud)

当上述实现转换为ARC时,在startProcess结束后不再保留控制器,因此不会发生处理并且永远不会收到委托消息.

问题:在将我的项目转换为使用ARC时,如何修改上述实现以便在实例化控制器的对象中创建iVar而无法正常工作?Apple的文档中有一个类似的例子可以转换到ARC,但它涉及使用块.我宁愿不用完成块替换委托协议.

编辑:在代码中添加注释re如何定义委托

编辑:澄清第一段解释为什么持有控制器的iVar/property不起作用

objective-c ios xcode4.2 automatic-ref-counting

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

在iOS 7中包装时"UILabel"文本布局"错误"

下面的屏幕截图是在iOS 7中.label1(黄色,顶部)绘制时,文本原点位于其框架的左上方,并在底部剪裁.在iOS 5/6中,文本原点位于标签框的左上角.label2并按label3预期渲染和布局.

在此输入图像描述

以下是生成此视图的代码:

- (void)loadView
{
    UIView *view = [[UIView alloc] initWithFrame:UIScreen.mainScreen.applicationFrame];
    view.backgroundColor = UIColor.blueColor;
    self.view = view;

    UILabel *label1 = [UILabel new];
    label1.backgroundColor = UIColor.yellowColor;
    label1.font = [UIFont systemFontOfSize:16.0f];
    label1.numberOfLines = 0;
    label1.lineBreakMode = NSLineBreakByWordWrapping;
    label1.frame = CGRectMake(50, 100, 200, 18);
    label1.text = @"This text is too long to fit on one line.";
    [self.view addSubview:label1];

    UILabel *label2 = [UILabel new];
    label2.backgroundColor = UIColor.greenColor;
    label2.font = [UIFont systemFontOfSize:16.0f];
    label2.numberOfLines = 0;
    label2.lineBreakMode = …
Run Code Online (Sandbox Code Playgroud)

uilabel ios7

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

如何同步2个不同图层的动画

我有一个UIView,其图层有2个子图层,一个是CAShapeLayer,另一个是CALayer.

CAShapeLayer使用bezierPathWithOvalInRect设置路径,并使用CABasicAnimation进行动画处理."strokeEnd"属性在一定的持续时间内从0.0到1.0动画.这具有在持续时间内从头到尾看到椭圆形绘制的效果.

CALayer只是将其内容设置为铅笔图像,并使用CAKeyframeAnimation进行动画处理.通过将CAKeyframeAnimation的path属性设置为与CAShapeLayer相同的路径来设置"position"属性,并将其设置为与CABasicAnimation相同的持续时间.这具有铅笔在相同持续时间内沿相同路径移动的效果,并且看起来铅笔正在绘制椭圆形.

在iOS6中工作得很漂亮.然而,在iOS7中,时间关闭 - 位置和strokeEnd动画不同步 - 它们在特定时刻同步,特别是在时间0,持续时间/ 4,持续时间/ 2,持续时间*3/4和持续时间 - 但在两者之间,同步已关闭.

如果不使用椭圆,我使用矩形或三角形,例如,它在iOS6和iOS7中运行良好.只有问题是iOS7中的椭圆.

基本上我需要知道如何同步2个不同的动画,其中每个动画都动画一个不同的层.

以下是创建2个图层的代码:

self.drawingLayer = [CAShapeLayer layer];
self.drawingLayer.frame = self.view.bounds;
self.drawingLayer.bounds = drawingRect;
self.drawingLayer.path = path.CGPath;
self.drawingLayer.strokeColor = [[UIColor blackColor] CGColor];
self.drawingLayer.fillColor = nil;
self.drawingLayer.lineWidth = 10.0f;
self.drawingLayer.lineJoin = kCALineJoinRound;
self.drawingLayer.lineCap = kCALineJoinRound;

[self.view.layer addSublayer:self.drawingLayer];

UIImage *pencilImage = [UIImage imageNamed:@"pencil.png"];
self.pencilLayer = [CALayer layer];
self.pencilLayer.contents = (id)pencilImage.CGImage;
self.pencilLayer.contentsScale = [UIScreen mainScreen].scale;
self.pencilLayer.anchorPoint = CGPointMake(0.0, 1.0); //bottom left corner
self.pencilLayer.frame = CGRectMake(0.0f, 0.0f, 100.0f, 100.0f);

[self.view.layer addSublayer:self.pencilLayer];
Run Code Online (Sandbox Code Playgroud)

这里是创建和启动2个不同动画的代码(self.drawingLayer是CAShapeLayer,self.pencilLayer是CALayer)

CABasicAnimation …
Run Code Online (Sandbox Code Playgroud)

core-animation ios

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

与正则表达式匹配时是否可以忽略字符串中的字符

我想创建一个正则表达式,以便当我将字符串与字符串数组进行比较时,返回匹配项,正则表达式忽略某些字符。

这是一个例子。考虑以下名称数组:

{
    "Andy O'Brien",
    "Bob O'Brian",
    "Jim OBrien",
    "Larry Oberlin"
}
Run Code Online (Sandbox Code Playgroud)

如果用户输入“ob”,我希望应用程序将正则表达式谓词应用于数组,并且上述数组中的所有名称都将匹配(例如,忽略 ')。

我知道我可以运行两次匹配,第一次针对每个名称,第二次针对每个名称,并从字符串中删除被忽略的字符。我宁愿通过单个正则表达式来完成此操作,这样我就不需要两次传递。

这可能吗?这是一个 iOS 应用程序,我正在使用 NSPredicate。

编辑:使用说明

从最初的答案我意识到我不清楚。上面的例子就是一个具体的例子。我需要一个通用的解决方案,其中名称数组是一个具有不同名称的大型数组,并且我要匹配的字符串是由用户输入的。所以我不能像 [o]'?[b] 这样对正则表达式进行硬编码。

另外,我知道如何进行不区分大小写的搜索,因此不需要答案来关注这一点。只需要一个解决方案来忽略我不想匹配的字符。

regex objective-c nspredicate ios

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

如何在保存之前自动设置计算的NSManagedObject属性?

假设我有一个NSManagedObject名为的子类Item.每当item保存实例时,我想根据瞬态属性中的计算值更新属性.我知道只要瞬态属性发生变化,我就可以更新属性,但是对于这个问题,假设有一个很好的理由我不想这样做.

我尝试在willSave方法中执行以下操作:

- (void)willSave
{
    self.computedProperty = [self computedValueFromTransientProperty];
}
Run Code Online (Sandbox Code Playgroud)

这会在保存上下文时导致崩溃.如果我移出代码willSave并在调用save之前显式设置属性,它可以正常工作.apple docs说你应该避免更改托管对象属性willSave.

问题:是否有一种很好的方法可以在NSManagedObject子类中构建功能,因此可以在保存之前更新属性,无需在类外部显式设置属性,并且每次瞬态属性更改时都不设置属性?

core-data nsmanagedobject ios

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

如何定义布局约束以使一个标签保持其内容的宽度并允许另一个标签填充剩余空间?

考虑以下所需的布局.请注意,这不是"布局字符串",而是图片的代理.所以| = superview边缘, - =空间,[xxx] =视图.

| - [LABEL1] - [标签2 --------------] - [按钮] - |

上面的布局是我想要实现的.用英语讲:

  • label1 大小适合内容,并从超视图的边缘填充
  • label2label1根据可用的水平空间从边缘填充并展开/收缩
  • button大小适合内容,并从superview的边缘label2和右边缘填充

我希望这很清楚.我当前的约束定义为:

[NSLayoutConstraint
 constraintsWithVisualFormat:@"H:|-8-[label1]-4-[label2]-4-[button]-8-|"
 options:0
 metrics:nil
 views:views];
Run Code Online (Sandbox Code Playgroud)

这导致以下布局:

| - [LABEL1 ----------------------] - [标签2] - [按钮] - |

:我怎么能修改约束,以便label2按比例尺寸和labelbutton的大小以适合的内容?

- 编辑 -

如果有帮助,这里是创建上述样本生成的约束的等效代码.

NSLayoutConstraint *c1 = [NSLayoutConstraint
                          constraintWithItem:self.label1
                          attribute:NSLayoutAttributeLeading
                          relatedBy:NSLayoutRelationEqual
                          toItem:self
                          attribute:NSLayoutAttributeLeading
                          multiplier:1.0f
                          constant:8.0f];

NSLayoutConstraint *c2 = [NSLayoutConstraint
                          constraintWithItem:self.label2
                          attribute:NSLayoutAttributeLeading
                          relatedBy:NSLayoutRelationEqual
                          toItem:self.label1
                          attribute:NSLayoutAttributeTrailing
                          multiplier:1.0f
                          constant:4.0f];

NSLayoutConstraint *c3 = …
Run Code Online (Sandbox Code Playgroud)

ios autolayout nslayoutconstraint

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