小编Ben*_*ohn的帖子

编辑时,`UITableView`不会调用didSelectRowAtIndexPath ??

我有一个UITableViewController用户应该能够编辑项目的地方.为了启用编辑我使用这个:

self.navigationItem.rightBarButtonItem = self.editButtonItem;
Run Code Online (Sandbox Code Playgroud)

对于不知道self.editButtonItem来自哪里的每个人,它都是由SDK预定义的.

所以,现在当我按下任何一个项目时,这个方法被称为:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
Run Code Online (Sandbox Code Playgroud)

但是当我点击编辑按钮并且编辑处于活动状态时,似乎没有调用此方法.

知道我错过了什么吗?

这是与编辑相关的其余代码:

// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return UITableViewCellEditingStyleNone;
}


- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.

MCB

iphone uitableview

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

Swift是否具有空合并运算符,如果不是,那么自定义运算符的示例是什么?

许多语言中的一个共同特征是Null Coalescing Operator,它是一个二进制运算符,通常用于缩短类型的表达式:

x = possiblyNullValue NCO valueIfNull
Run Code Online (Sandbox Code Playgroud)

...这NCO是语言的空合并运算符的占位符.

Objective C的Null Coalescing运算符是?:,所以表达式为:

x = possiblyNullValue ?: valueIfNull
Run Code Online (Sandbox Code Playgroud)

上面的表达式也相当于使用第三运算符:

 x =  someTestForNotNull( possiblyNullValue ) ? possiblyNullValue : valueIfNull
Run Code Online (Sandbox Code Playgroud)

Null Coalescing Operator的优点

  • 更易读的代码(特别是长的描述性变量名称)
  • 减少印刷错误的可能性(测试的var仅键入一次)
  • 没有对测试变量进行双重评估,其中测试变量是一个getter,因为它访问过一次(或者需要将其缓存以有意避免双重评估).

swift

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

我可以使用UIEdgeInsets调整CGRect吗?

我有一个CGRect,我想调整它UIEdgeInsets.

似乎可能有一个内置函数可以做到这一点.我已经找了一个CGRectAdjustByInsets或带有其他CGRect…前缀的函数,但我没有找到任何东西.

我应该自己编码吗?

cgrect uiedgeinsets

42
推荐指数
3
解决办法
2万
查看次数

使用Objective-C块实现更好的异步控制流程

我正在使用AFNetworking来异步调用Web服务.这些呼叫中的一些必须链接在一起,其中呼叫A的结果由呼叫B使用,其由呼叫C使用,等等.

AFNetworking处理异步调用的结果,并在创建操作时设置成功/失败块:

NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/public_timeline.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@"Public Timeline: %@", JSON);
} failure:nil];
[operation start];
Run Code Online (Sandbox Code Playgroud)

这会导致嵌套的异步调用块很快变得不可读.当任务不依赖于彼此而是必须并行执行并且执行取决于所有操作的结果时,它甚至更复杂.

似乎更好的方法是利用promises框架来清理控制流.

我遇到过MAFuture,但无法弄清楚如何最好地将它与AFNetworking集成.由于异步调用可能有多个结果(成功/失败)并且没有返回值,因此它似乎不是理想的选择.

任何指针或想法将不胜感激.

design-patterns objective-c objective-c-blocks afnetworking

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

将缩放缩放添加到UICollectionView

介绍

我将描述我想要实现的效果,然后我将详细介绍我目前是如何实现这一点以及它的行为有什么问题.我还会提到我看过的另一种方法,但根本无法完成工作.

最相关的代码内嵌在问题的底部,以便快速访问.您可以下载源代码的zip或在BitBucket上将项目作为Mercurial Repository获取.该项目现在包含以下答案的修复程序.如果你想要最初提供的破碎版本,它会被标记为"initial-buggy-version"

该项目是概念/尖峰的最小证明,用于评估效果是否可行,因此它非常轻巧简单!

期望的效果

该应用程序将显示大量离散的信息行,形成一个垂直表.该表将由用户垂直滚动.这是a的标准行为UITableView,你也可以使用它UICollectionView.但是,应用程序还必须支持缩放缩放.当你在桌子上捏缩放时,所有的线条应该挤压在一起.当你伸展时,所有的线都应该分开.

在我的概念证明中,单个细胞没有调整大小,它们只是重新定位在一起或更远.这是故意的:我认为验证这个想法的可行性并不重要.

这是屏幕抓取,显示当前应用程序看起来如何缩小和放大:

放大图像 缩小图像

目前的实施

我正在使用UICollectionView自定义UICollectionViewLayout子类.布局将UICollectionViewCells一个漂亮的摇摆正弦波放在屏幕中间.每个UICollectionViewCell仅仅是一个容器UILabel持有indexPath行.

UICollectionViewLayout子类具有参数来设置每个单元之间的垂直间距它描述到UICollectionView,调整这允许表被压扁或如所期望垂直拉伸.

我的UICollectionViewController子类有一个UIPinchGestureRecognizer.当识别器检测到比例变化时,相应地UICollectionView改变布局中的垂直单元间距.

在没有进一步考虑的情况下,缩放将从内容的顶部发生,而不是围绕触摸手势的中心发生.该UICollectionViewcontentOffset属性捏提供此功能时调整.

手势识别器还需要适应挤压时发生的拖动.这也是通过改变UICollectionView's 来处理的contentOffset.一些附加代码允许触摸手势的中心点随着手指被添加到手势或从手势移除而改变.

请注意UICollectionView,作为UIScrollView子类,它有自己的UIPanGestureRecognizerUIPinchGestureRecogniser我添加的交互.我不确定这是否会导致问题.

我添加了代码以UICollectionView在我的捏合手势期间禁用内置滚动,但这似乎没有太大区别.我试图gestureRecognizer:shouldRequireFailureOfGestureRecognizer:使我UIPinchGestureRecognizer的内置失败UIPanGestureRecognizer,但这似乎停止我的捏识别器工作.我不知道这是不是我是傻瓜,还是iOS中的错误.

如前所述,当前的UICollectionViewCells未调整大小.他们只是重新定位.这是故意的.我认为验证这个概念并不重要. …

ios pinchzoom uipinchgesturerecognizer uicollectionview uicollectionviewlayout

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

匹配自定义和标准UITableViewCell类型的左对齐

UITableViewCell在故事板中定义自定义.我也使用了一些内置的标准样式单元格.我需要设置约束,以便我的自定义单元格与平台定义的单元格匹配(在左侧正确对齐它们的标题).

我注意到,在iOS版本和运行它的设备之间,单元格的左对齐会发生变化.它看起来像左对齐相同的默认单元格separatorInset.

这里是UITableViewCell小号separatorInset几设备和iOS版本:

  • iPad上7-15点.
  • iPad上8 - 20点.
  • iPhone上7 - 15点.
  • iPhone上8 - 16点.

其他设备(iPhone 6 +,iPad Mini)可能有所不同 - 我没有详尽检查.

您将如何确保自定义单元格和内置单元格的标签左对齐?

是否有一种合理的方法来获取这些插入默认值并在故事板中设置的自动布局约束中使用它们?代码怎么样?

uitableview ios autolayout

30
推荐指数
3
解决办法
5969
查看次数

使用UICollectionViewLayout的失效上下文

因此,我已通过返回实现部分工作在我UICollectionView粘头YESshouldInvalidateLayoutForBoundsChange:.但是,这会影响性能,我不想让整个布局无效,只有我的标题部分无效.

现在,根据我可以用来UICollectionViewLayoutInvalidationContext为我的布局定义自定义失效上下文的官方文档,但文档非常缺乏.它要求我"定义代表可以独立重新计算的布局数据部分的自定义属性",但我不明白它们的含义.

有没有人有任何经验子类UICollectionViewLayoutInvalidationContext

cocoa-touch ios uicollectionview uicollectionviewlayout

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

ARKit隐藏墙后的物体

如何使用ARKit跟踪的水平和垂直平面隐藏墙后/真实物体后面的物体?目前,当你离开房间和/或它们应该在后面的物体前面时,可以通过墙看到3D添加的物体.那么有可能使用ARKit让我提供更自然的AR体验而不会通过墙壁出现这些对象吗?

augmented-reality ios scenekit swift arkit

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

UIViewController - 自定义解除转换的问题

摘要

我有一个内容UIViewController,它使用自定义转换呈现设置UIViewController.演示文稿是presentViewController:animated:completion:.

当我稍后解除设置时dismissViewControllerAnimated:completion:,呈现控制器突然跳回设置控制器演示之前的初始位置.

我在设备上有一个解决方法,但不是模拟器.但是,我想知道我做错了什么而不是黑客入侵让它消失的小屋.我还打算让这个动画互动,我怀疑这个问题会在我这样做时放大.

定制过渡 - 打开引擎盖

期望的效果是呈现控制器在屏幕上向下滑动,并且看到呈现的控制器位于其后面,从其抬起以填充屏幕.在呈现控制器的使用寿命期间,呈现控制器的顶部保持在屏幕上.它停留在屏幕的底部,但位于显示的控制器上方.

您可以想象在汽车(前部控制器)上抬起发动机罩以查看后面的发动机(显示的设置),但发动机罩在底部保持可见,以获得一些背景信息.

我计划对其进行改进,以便呈现控制器真正看起来以3d方式提升视角,但我还没有那么远.

当设置被取消时,原始呈现控制器(发动机罩)应向上滑回屏幕,并且呈现的控制器(设置)稍微下沉(关闭发动机罩).

这是切换屏幕上和屏幕外设置的方法(它只是由UIButton调用).你会注意到呈现视图控制器将自己设置为<UIViewControllerTransitioningDelegate>.

-(void) toggleSettingsViewController
{
  const BOOL settingsAreShowing = [self presentedViewController] != nil;
  if(!settingsAreShowing)
  {
    UIViewController *const settingsController = [[self storyboard] instantiateViewControllerWithIdentifier: @"STSettingsViewController"];
    [settingsController setTransitioningDelegate: self];
    [settingsController setModalPresentationStyle: UIModalPresentationCustom];
    [self presentViewController: settingsController animated: YES completion: nil];
  }
  else
  {
    [self dismissViewControllerAnimated: YES completion: nil];
  }
}
Run Code Online (Sandbox Code Playgroud)

要实现<UIViewControllerAnimatedTransitioning>呈现视图控制器,也只需返回自身<UIViewControllerAnimatedTransitioning>

-(id<UIViewControllerAnimatedTransitioning>) animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting …
Run Code Online (Sandbox Code Playgroud)

uiviewcontroller uikit uiviewanimationtransition ios

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

如何使用Core Graphics/iPhone绘制渐变线(淡入/淡出)?

我知道如何绘制一条简单的线条:

CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
CGContextMoveToPoint(context, x, y);
CGContextAddLineToPoint(context, x2, y2);
CGContextStrokePath(context);
Run Code Online (Sandbox Code Playgroud)

我知道如何做一个渐变矩形,ig:

CGColorSpaceRef myColorspace=CGColorSpaceCreateDeviceRGB();
size_t num_locations = 2;
CGFloat locations[2] = { 1.0, 0.0 };
CGFloat components[8] = { 0.0, 0.0, 0.0, 1.0,    1.0, 1.0, 1.0, 1.0 };

CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, components, locations, num_locations);

CGPoint myStartPoint, myEndPoint;
myStartPoint.x = 0.0;
myStartPoint.y = 0.0;
myEndPoint.x = 0.0;
myEndPoint.y = 10.0;
CGContextDrawLinearGradient (context, myGradient, myStartPoint, myEndPoint, 0);
Run Code Online (Sandbox Code Playgroud)

但是我怎么能画一条渐变的线条,ig从黑色渐变到白色(也可能在另一边渐渐变成黑色)?

iphone gradient core-graphics draw

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