小编Mis*_*cha的帖子

iOS 6/7 Deltas:仅适用于子视图?

我为iOS 5和6设计了我的iPhone应用程序.现在我希望它支持iOS 7,但也支持两个旧版本.像许多开发人员一样,我一直在努力与状态栏重叠我的观点,我明白在iOS 7中没有办法保留旧的状态栏样式.

然而,Stackoverflow上的很多帖子建议使用iOS 6/7 Deltas,可以使用新的SDK在Xcode中设置:

Xcode中的iOS 6/7 Deltas

我试过了,但是我发现当我将这些值应用到视图控制器的根视图时没有任何反应.这些Deltas仅对根视图中包含的所有子视图产生影响.

为什么Deltas不能用于根视图?有没有办法让它发挥作用?(我不想将Deltas添加到我所有视图控制器中的所有UI元素中.)

statusbar delta ios ios6 ios7

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

使用Autolayout将XIB的根视图动态调整为其内容的大小

我在Xcode中创建一个XIB并添加一个简单的视图作为子视图:

具有rootview和子视图的XIB

我想要实现的是子视图具有固定的大小,rootview会自动调整大小到该子视图的大小,并在其周围留下20.0的边距:

调整大小的XIB

所以我给子视图添加了固定宽度和固定高度约束.然后我为20.0边距添加了四个约束:

约束 查看显示约束

由于superview没有任何约束,因此既不应该有歧义也不应该有冲突的约束:我希望superview缩小以匹配约束.然而,Xcode抱怨:

警告

如果rootview具有固定大小并且看起来是这种情况,那么这些约束只会相互矛盾.所以我的问题是:如何使XIB的rootview灵活,以便动态调整其大小以匹配其内容?

(甚至可以使用Interface Builder吗?)

xcode resize constraints interface-builder autolayout

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

我可以将枚举限制为另一个枚举的某些情况吗?

说我有面包店和成分库存:

enum Ingredient {
    case flower     = 1
    case sugar      = 2
    case yeast      = 3
    case eggs       = 4
    case milk       = 5
    case almonds    = 6
    case chocolate  = 7
    case salt       = 8
}
Run Code Online (Sandbox Code Playgroud)

案例rawValue代表库存编号.

然后我有两个食谱:

巧克力蛋糕:

  • 500克花
  • 300克糖
  • 3个鸡蛋
  • 200毫升牛奶
  • 200克巧克力

杏仁蛋糕:

  • 300克花
  • 200克糖
  • 20克酵母
  • 200克杏仁
  • 5个鸡蛋
  • 2克盐

现在我定义一个函数

func bake(with ingredients: [Ingredient]) -> Cake
Run Code Online (Sandbox Code Playgroud)

当然,我相信我的员工,但我仍然想确保他们只使用正确的成分来烘焙蛋糕.

我可以通过定义两个单独的枚举来做到这一点:

enum ChocolateCakeIngredient {
    case flower
    case sugar
    case eggs
    case milk
    case chocolate
}

enum AlmondCakeIngredient { …
Run Code Online (Sandbox Code Playgroud)

enums restriction swift

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

如何将视图约束到UITextView的第一个基线?

我拼命想要限制接口生成器中a UILabel和a 的第一个基线UITextView.根据我的理解,通过简单地添加以下约束(伪代码),这应该是非常容易的:

label.firstBaseline = textView.firstBaseline
Run Code Online (Sandbox Code Playgroud)

但是,根据其他约束和一些视图设置,我得到了非常尴尬的结果,如以下屏幕截图所示.

第一种情况:禁用滚动和对齐顶部边缘

这仅用于显示常规视图设置.我已禁用滚动textView以避免歧义.(否则textView无法从其包含的文本中计算出自己的高度.)

第一种情况:对齐两个视图的顶部边缘

第二种情况:禁用滚动并对齐第一个基线

与第一种情况相同的设置,唯一的区别是我删除了对齐视图顶边的约束,并添加了一个约束视图的第一个基线.

出于某种原因,标签"起飞"远远超出其超级视图的界限,最终位于7764的位置.不知道为什么.

第二种情况:对齐第一个基线

第三种情况:约束高度并对齐第一个基线

现在我已经启用了滚动功能,textView而是限制了它的高度.

显然,label第一个基线与textViews顶边对齐,即使约束表示要对齐它们的第一个基线.我在Apple文档中读到,firstBaseline如果该视图没有基线,则参数返回视图的上边缘.所以看起来textView在这种情况下没有第一个基线.

第三种情况:对齐第一个基线并添加高度约束

做了UITextView一般都没有firstBaseline?如果是这样:为什么?毕竟,它是一个绘制文本的视图,因此应该设置此属性.

对此有任何想法表示赞赏.

baseline uitextview ios autolayout

8
推荐指数
0
解决办法
813
查看次数

我可以将枚举定义为另一个枚举案例的子集吗?

注意:这与我昨天在Stackoverflow上发布的另一个问题基本相同.但是,我认为我在那个问题中使用了一个不好的例子,这个例子并没有完全归结为我的想法.由于对原始帖子的所有回复都提到了第一个问题,我认为将新示例放在一个单独的问题中可能更好一点 - 没有重复的意图.


可以移动的模型游戏角色

让我们定义一个简单游戏中使用的方向枚举:

enum Direction {
    case up
    case down
    case left
    case right
}
Run Code Online (Sandbox Code Playgroud)

现在在游戏中我需要两种角色:

  • HorizontalMover只能左右移动的A.
  • A VerticalMover只能上下移动.

他们都可以移动所以他们都实现了

protocol Movable {
    func move(direction: Direction)
}
Run Code Online (Sandbox Code Playgroud)

那么让我们定义两个结构:

struct HorizontalMover: Movable {
    func move(direction: Direction)
    let allowedDirections: [Direction] = [.left, .right]
}

struct VerticalMover: Movable {
    func move(direction: Direction)
    let allowedDirections: [Direction] = [.up, .down]
}
Run Code Online (Sandbox Code Playgroud)

问题

...使用这种方法是我仍然可以将不允许的值传递move()函数,例如以下调用将是有效的:

let horizontalMover = HorizontalMover()
horizontalMover.move(up) …
Run Code Online (Sandbox Code Playgroud)

enums subset restriction swift

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

使用协议中定义的默认参数实现函数

Swift协议可以通过向它们添加扩展来为函数和计算属性提供默认实现.我做了很多次.我的理解是,默认实现仅用作"后备":当类型符合协议但不提供自己的实现时执行.

至少我是如何阅读Swift编程语言指南的:

如果符合类型提供其自己的必需方法或属性的实现,则将使用该实现而不是扩展提供的实现.

现在我遇到了这样一种情况:我实现特定协议的自定义类型确实为特定函数提供了一个实现,但它没有被执行 - 而是执行协议扩展中定义的实现.


作为示例,我定义了一个Movable具有函数move(to:)和扩展的协议,该协议为此函数提供了一个默认实现:

protocol Movable {

    func move(to point: CGPoint)

}

extension Movable {

    func move(to point: CGPoint = CGPoint(x: 0, y: 0)) {
        print("Moving to origin: \(point)")
    }

}
Run Code Online (Sandbox Code Playgroud)

接下来,我定义一个Car符合的类,Movable但为move(to:)函数提供了自己的实现:

class Car: Movable {

    func move(to point: CGPoint = CGPoint(x: 0, y: 0)) {
        print("Moving to point: \(point)")
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我创建一个新的Car并将其向下转换为Movable:

let castedCar = …
Run Code Online (Sandbox Code Playgroud)

extension-methods protocols swift swift-extensions swift-protocols

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

如何缩放图像以填充父视图而不影响 SwiftUI 中的布局?

目标

我经常遇到这样的情况:我想要缩放图像,以便它按比例填充其容器而不修改其框架。下面的第一个屏幕截图中显示了一个示例。容器视图具有固定框架,如红色边框所示。图像本身具有不同的长宽比。它被缩放以填充整个容器,但它仍然具有与容器相同的框架,因此不会影响容器的布局(大小)。

我的解决方案

我使用以下代码来完成此操作:

struct ContentView: View {
    var body: some View {
        ImageContainerView()
            .frame(width: 300, height: 140)
            .border(.red, width: 2)
    }
}

struct ImageContainerView: View {
    var body: some View {
        GeometryReader { geometry in
            Image("image")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .border(.blue, width: 2)
                .frame(width: geometry.size.width, height: geometry.size.height)
                .clipped()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

如您所见,我使用几何读取器手动设置图像的框架以匹配父视图的框架。这感觉有点多余,因为图像已经从其父视图隐式接收到此信息作为建议的大小。但是,如果我不以这种方式使用几何读取器,则图像不会被剪切,并且其框架与完整缩放的图像匹配,而不是父视图的框架。下面的第二个屏幕截图显示了这一点。

问题

SwiftUI 中是否有一种(更“原生”)的方法可以在不使用几何读取器的情况下实现所需的行为?

剪裁的 未修剪的

image clipping aspect-ratio swiftui geometryreader

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

将嵌套在容器视图控制器中的UINavigationController添加到UITabBarController

我有一个UIViewController(红色)设置为a的第一个标签,UITabBarController如下面的故事板所示.此视图控制器是一个容器视图控制器,并UINavigationController在其内部加载contentView(红色视图控制器内的白色矩形).

故事板

这是我在红色视图控制器中加载导航控制器的代码contentView:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // instantiate navigation controller
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UINavigationController *navigationVC = [storyboard instantiateViewControllerWithIdentifier:@"N"];

    // place navigation controller inside content view
    [self addChildViewController:navigationVC];
    navigationVC.view.frame = self.containerView.bounds;
    [self.containerView addSubview:navigationVC.view];
    [navigationVC didMoveToParentViewController:self];
}
Run Code Online (Sandbox Code Playgroud)

根据我所知的视图控制器包含,这应该工作,因为我明确设置导航控制器的框架.但是,如果有足够的单元格tableView超过容器的高度,那么tableView当我向下滚动时,总会有一个条形.为了看到差异,我将tableView's 设置backgroundColor橙色,将单元格设置backgroundColor白色.

tableView结束时的差距

我怎么摆脱那个橙色的差距tableView呢?

(注意:我没有使用autolayout,我需要一个适用于iOS7 iOS6 的解决方案.)

uitableview uiview uinavigationcontroller ios containment

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

默认今日小组件中的布局约束冲突

我在今天为我的应用程序创建的今日小部件中观察到一个非常奇怪的关于Autolayout的行为.试图找到问题的根源我最终创建了一个简单的新Xcode项目(单视图应用程序),并添加了一个今日扩展作为新目标 - 甚至没有触及它.

当我在我的设备(iPhone 6s)上启动Today Extension时,首先发生的是在控制台中抛出布局约束冲突:

2016-05-03 18:17:22.216 TodayExtension[10183:4611907] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<_UILayoutSupportConstraint:0x15c665320 V:[_UILayoutGuide:0x15c6657b0(0)]>",
    "<_UILayoutSupportConstraint:0x15c663890 V:|-(0)-[_UILayoutGuide:0x15c6657b0]   (Names: '|':UIView:0x15c6642a0 )>",
    "<_UILayoutSupportConstraint:0x15c666010 V:[_UILayoutGuide:0x15c666380(0)]>",
    "<_UILayoutSupportConstraint:0x15c666ed0 _UILayoutGuide:0x15c666380.bottom == UIView:0x15c6642a0.bottom>",
    "<NSLayoutConstraint:0x15c666b80 V:[_UILayoutGuide:0x15c6657b0]-(NSSpace(8))-[UILabel:0x15c6617c0'Hello World']>", …
Run Code Online (Sandbox Code Playgroud)

xcode ios autolayout today-extension

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

当位置服务未获得许可时,MKUserTrackingButton 会变成一个微调器

我已MKUserTrackingButton在地图视图中将 Apple 的新功能添加到我的应用程序中。当用户先前已授予使用位置服务的许可(例如CLAuthorizationStatus.authorizedWhenInUse)时,它可以正常工作。

MKUserTrackingButton 默认

但是,当用户拒绝权限或权限状态未确定时,用户跟踪按钮会变成活动指示器(又名微调器)并且永不停止旋转。

MKUserTrackingButton 未经许可旋转

相反,我想像在 Apple Maps 应用程序中一样显示 iOS 权限警报,或者至少显示某种警报,以向用户提示为什么它不起作用。当然,我也希望活动指示器停止并返回默认的“指南针”图标。

不幸的是,MKUserTrackingButton它不是一个 sublass,UIButton所以我不能向它添加任何目标,而且似乎没有 API 来改变按钮的视觉状态。

知道如何做到这一点吗?

mapkit mkmapview cllocationmanager ios mkuserlocation

6
推荐指数
0
解决办法
421
查看次数