我正在使用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) 考虑一个包含三个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并从约束中取出填充.我可能会走那条路,只是希望有一种方法来定义在约束定义中折叠这个填充.
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对方法进行子类化的能力将是有用的,我想学习如何做到我所问的是否可行.
谢谢!
我在我的应用程序中使用以下模式并转换到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不起作用
下面的屏幕截图是在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) 我有一个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) 我想创建一个正则表达式,以便当我将字符串与字符串数组进行比较时,返回匹配项,正则表达式忽略某些字符。
这是一个例子。考虑以下名称数组:
{
"Andy O'Brien",
"Bob O'Brian",
"Jim OBrien",
"Larry Oberlin"
}
Run Code Online (Sandbox Code Playgroud)
如果用户输入“ob”,我希望应用程序将正则表达式谓词应用于数组,并且上述数组中的所有名称都将匹配(例如,忽略 ')。
我知道我可以运行两次匹配,第一次针对每个名称,第二次针对每个名称,并从字符串中删除被忽略的字符。我宁愿通过单个正则表达式来完成此操作,这样我就不需要两次传递。
这可能吗?这是一个 iOS 应用程序,我正在使用 NSPredicate。
编辑:使用说明
从最初的答案我意识到我不清楚。上面的例子就是一个具体的例子。我需要一个通用的解决方案,其中名称数组是一个具有不同名称的大型数组,并且我要匹配的字符串是由用户输入的。所以我不能像 [o]'?[b] 这样对正则表达式进行硬编码。
另外,我知道如何进行不区分大小写的搜索,因此不需要答案来关注这一点。只需要一个解决方案来忽略我不想匹配的字符。
假设我有一个NSManagedObject名为的子类Item.每当item保存实例时,我想根据瞬态属性中的计算值更新属性.我知道只要瞬态属性发生变化,我就可以更新属性,但是对于这个问题,假设有一个很好的理由我不想这样做.
我尝试在willSave方法中执行以下操作:
- (void)willSave
{
self.computedProperty = [self computedValueFromTransientProperty];
}
Run Code Online (Sandbox Code Playgroud)
这会在保存上下文时导致崩溃.如果我移出代码willSave并在调用save之前显式设置属性,它可以正常工作.apple docs说你应该避免更改托管对象属性willSave.
问题:是否有一种很好的方法可以在NSManagedObject子类中构建功能,因此可以在保存之前更新属性,无需在类外部显式设置属性,并且每次瞬态属性更改时都不设置属性?
考虑以下所需的布局.请注意,这不是"布局字符串",而是图片的代理.所以| = 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按比例尺寸和label和button的大小以适合的内容?
如果有帮助,这里是创建上述样本生成的约束的等效代码.
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 ×7
objective-c ×3
autolayout ×2
iphone ×2
arguments ×1
core-data ×1
ios7 ×1
methods ×1
nspredicate ×1
regex ×1
uilabel ×1
variables ×1
xcode4.2 ×1