iOS7 탭에 UI 버튼이 하이라이트로 표시되지 않음
비슷한 것들에 대한 수많은 게시물들을 살펴보았지만, 이 문제와 일치하거나 해결하는 것은 없습니다.7부터 iOS 7다a다i을 추가할 때마다UIButton
에 이르기까지UITableViewCell
에서도 "fine작동합니다. 동작을 는 고 "합니다 "즉 "다 "다 "되지 "는 "은 "하는 "으로 "상 "때 "에서도 "할 "을 "하지만 "" ", " "고 "a "t "r e 는 p , w, 즉 하는, n e eUIButton
터치에하는 버튼이 . 버튼이 터치에 반응하지 않는 UI를 펑키하게 만듭니다.
iOS7에서 버그로 간주된다고 확신하지만 해결책을 찾거나 찾을 수 있도록 도와줄 수 있는 사람이 있습니까? :)
편집: 버튼을 길게 누르면 강조 표시가 되지만, 표준 보기에 추가되는 경우처럼 빠르게 두드릴 수 없다는 것을 언급하는 것을 잊었습니다.
코드:
단추 만들기:
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.titleLabel.font = [UIFont systemFontOfSize:14];
button.titleLabel.textColor = [UIColor blueColor];
[button setTitle:@"Testing" forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonPressed:) forControlEvents: UIControlEventTouchDown];
button.frame = CGRectMake(0, 0, self.view.frame.size.width/2, 40);
테스트한 내용:
//하기에서 제스처 하기 UITableView
방해가 될까봐요
for (UIGestureRecognizer *recognizer in self.tableView.gestureRecognizers) {
recognizer.enabled = NO;
}
//셀에서 제스처 제거
for (UIGestureRecognizer *recognizer in self.contentView.gestureRecognizers) {
recognizer.enabled = NO;
}
//가벼운 터치감은 살짝 보여주지만 원하는 룩이 아닙니다.
button.showsTouchWhenHighlighted = YES;
테이블 보기에서 이 속성을 추가하면 됩니다.
tableview.delaysContentTouches = NO;
(ForRowAt) [ForRowAt]코드 아래에 추가하는 셀을 시작한 후 IndexPath. 7iOS 6과 iOS 7의 구조가 확연히 .
iOS 7 에는 UITableViewCell 콘텐츠 UITableViewCell 스크롤뷰In이 있습니다.
for (id obj in cell.subviews)
{
if ([NSStringFromClass([obj class]) isEqualToString:@"UITableViewCellScrollView"])
{
UIScrollView *scroll = (UIScrollView *) obj;
scroll.delaysContentTouches = NO;
break;
}
}
iOS 8부터 UITableView 서브뷰에도 동일한 기법을 적용해야 합니다(표에는 숨겨진 UITableView WrapperView 스크롤 뷰가 포함되어 있습니다).더 이상 UITableViewCell 서브뷰를 반복할 필요가 없습니다.
for (UIView *currentView in tableView.subviews) {
if ([currentView isKindOfClass:[UIScrollView class]]) {
((UIScrollView *)currentView).delaysContentTouches = NO;
break;
}
}
이 답은 이 질문과 연결되어야 합니다.
저는 이것을 합격된 답변에 추가하려고 했지만, 그것은 통과되지 않았습니다.이것이 셀 지연을 끄는 훨씬 더 안전한 방법입니다. 내용특정 클래스를 찾는 것이 아니라 선택기에 반응하는 모든 클래스를 찾을 때 속성을 만집니다.
셀 내:
for (id obj in self.subviews) {
if ([obj respondsToSelector:@selector(setDelaysContentTouches:)]) {
[obj setDelaysContentTouches:NO];
}
}
테이블 보기에서:
self.tableView.delaysContentTouches = NO;
지정 iOS7과 iOS8을 합니다.UITableView
및 지정와UITableViewCell
이 하기 을 을 UITableView
의initWithFrame:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// iterate over all the UITableView's subviews
for (id view in self.subviews)
{
// looking for a UITableViewWrapperView
if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewWrapperView"])
{
// this test is necessary for safety and because a "UITableViewWrapperView" is NOT a UIScrollView in iOS7
if([view isKindOfClass:[UIScrollView class]])
{
// turn OFF delaysContentTouches in the hidden subview
UIScrollView *scroll = (UIScrollView *) view;
scroll.delaysContentTouches = NO;
}
break;
}
}
}
return self;
}
이 하기 을 을 UITableViewCell
의initWithStyle:reuseIdentifier:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
// iterate over all the UITableViewCell's subviews
for (id view in self.subviews)
{
// looking for a UITableViewCellScrollView
if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewCellScrollView"])
{
// this test is here for safety only, also there is no UITableViewCellScrollView in iOS8
if([view isKindOfClass:[UIScrollView class]])
{
// turn OFF delaysContentTouches in the hidden subview
UIScrollView *scroll = (UIScrollView *) view;
scroll.delaysContentTouches = NO;
}
break;
}
}
}
return self;
}
문제를 해결하기 위해 제가 한 일은 다음 코드를 사용하는 UI 버튼의 범주였습니다.
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
[NSOperationQueue.mainQueue addOperationWithBlock:^{ self.highlighted = YES; }];
}
- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesCancelled:touches withEvent:event];
[self performSelector:@selector(setDefault) withObject:nil afterDelay:0.1];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
[self performSelector:@selector(setDefault) withObject:nil afterDelay:0.1];
}
- (void)setDefault
{
[NSOperationQueue.mainQueue addOperationWithBlock:^{ self.highlighted = NO; }];
}
하며, 는 UITableViewCell과 합니다.delaysContentTouches
강요당하지 않습니다.
스위프트 2에서 로만 B의 대답은 다음과 같습니다.
for view in tableView.subviews {
if view is UIScrollView {
(view as? UIScrollView)!.delaysContentTouches = false
break
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
for (id view in self.tableView.subviews)
{
// looking for a UITableViewWrapperView
if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewWrapperView"])
{
// this test is necessary for safety and because a "UITableViewWrapperView" is NOT a UIScrollView in iOS7
if([view isKindOfClass:[UIScrollView class]])
{
// turn OFF delaysContentTouches in the hidden subview
UIScrollView *scroll = (UIScrollView *) view;
scroll.delaysContentTouches = NO;
}
break;
}
}
}
UITable ViewCell의 텍스트 전용 UI 버튼이 터치 시 강조 표시되지 않는 문제와 유사한 문제가 있었습니다.제게 고쳐준 것은 버튼을 바꾸는 것이었습니다.Custom에서 System으로 다시 입력합니다.
설정 지연 내용NO에 대한 터치는 동일한 UITableViewCell에 있는 이미지 전용 UI 버튼에 대해 효과를 발휘했습니다.
self.tableView.delaysContentTouches = NO;
이것은 위의 라파엘 핀토의 답변을 스위프트 버전으로 한 것입니다.그에게도 투표하는 것 잊지 마세요 :)
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
super.touchesBegan(touches, withEvent: event)
NSOperationQueue.mainQueue().addOperationWithBlock { () -> Void in self.highlighted = true }
}
override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
super.touchesCancelled(touches, withEvent: event)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(time, dispatch_get_main_queue()) {
self.setDefault()
}
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
super.touchesEnded(touches, withEvent: event)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(time, dispatch_get_main_queue()) {
self.setDefault()
}
}
func setDefault() {
NSOperationQueue.mainQueue().addOperationWithBlock { () -> Void in self.highlighted = false }
}
Swift에서 제공하는 솔루션, iOS8만 해당(iOS7의 경우 각 셀에 대한 추가 작업 필요):
//
// NoDelayTableView.swift
// DivineBiblePhone
//
// Created by Chris Hulbert on 30/03/2015.
// Copyright (c) 2015 Chris Hulbert. All rights reserved.
//
// This solves the delayed-tap issue on buttons on cells.
import UIKit
class NoDelayTableView: UITableView {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
delaysContentTouches = false
// This solves the iOS8 delayed-tap issue.
// http://stackoverflow.com/questions/19256996/uibutton-not-showing-highlight-on-tap-in-ios7
for view in subviews {
if let scroll = view as? UIScrollView {
scroll.delaysContentTouches = false
}
}
}
override func touchesShouldCancelInContentView(view: UIView!) -> Bool {
// So that if you tap and drag, it cancels the tap.
return true
}
}
사용하려면 클래스를 다음으로 변경하기만 하면 됩니다.NoDelayTableView
당신의 스토리보드에.
iOS8에서는 셀의 컨텐츠 보기 안에 있는 버튼이 즉시 강조 표시된다는 것을 확인할 수 있습니다.
크리스 해리슨의 답변을 약간 변형한 버전.스위프트 2.3:
class HighlightButton: UIButton {
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesBegan(touches, withEvent: event)
NSOperationQueue.mainQueue().addOperationWithBlock { _ in self.highlighted = true }
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
super.touchesCancelled(touches, withEvent: event)
setDefault()
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesEnded(touches, withEvent: event)
setDefault()
}
private func setDefault() {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
NSOperationQueue.mainQueue().addOperationWithBlock { _ in self.highlighted = false }
}
}
}
수용된 답변은 제게 어떤 "탭"에서는 통하지 않았습니다.
마지막으로 uibutton 카테고리(/subclass)에 bellow code를 추가하면 100% 작동합니다.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
self.backgroundColor = [UIColor greenColor];
[UIView animateWithDuration:0.05 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.backgroundColor = [UIColor clearColor];
} completion:^(BOOL finished)
{
}];
[super touchesBegan:touches withEvent:event];
}
저는 했습니다에 했습니다.UITableViewCell
이 문제를 간단히 다룰 수 있도록 하기 위해서입니다.과 동일한 합니다. 로과한을다단로는를다는층된는다e(t로단sytw를oisep,로)ndmey된kr층d과UITableViewCell contentView
.
는 모든 을 Δ Δ A/S Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ, UITableView
그들의 것을 정합니다.delaysContentTouches
에는태e는o에 걸맞게 합니다.UITableView
의delaysContentTouches
state.이주州)을 휘저어야 . 이 일을 하려면 내가 그 일을 할 때UITableView
에게 a, 를 에게 a 합니다 하도록 합니다 하도록 를UITableView
◦ 그 어떤 것도 하고 싶지 , 에 더 되는 이 해결책을 했습니다.저는 그 어느 것도 요구하고 싶지 않았고, 더 단순하고 유연하다고 생각되는 이 해결책을 결정했습니다.
카테고리 확장 및 샘플 하니스:
https://github.com/TomSwift/UITableViewCell-TS_delaysContentTouches
사용하기가 매우 간단합니다.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// using static cells from storyboard...
UITableViewCell* cell = [super tableView: tableView cellForRowAtIndexPath: indexPath];
cell.ts_delaysContentTouches = NO;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
카테고리 코드는 다음과 같습니다.
@interface UITableViewCell (TS_delaysContentTouches)
@property (nonatomic, assign) BOOL ts_delaysContentTouches;
@end
@implementation UITableViewCell (TS_delaysContentTouches)
- (UIScrollView*) ts_scrollView
{
id sv = self.contentView.superview;
while ( ![sv isKindOfClass: [UIScrollView class]] && sv != self )
{
sv = [sv superview];
}
return sv == self ? nil : sv;
}
- (void) setTs_delaysContentTouches:(BOOL)delaysContentTouches
{
[self willChangeValueForKey: @"ts_delaysContentTouches"];
[[self ts_scrollView] setDelaysContentTouches: delaysContentTouches];
[self didChangeValueForKey: @"ts_delaysContentTouches"];
}
- (BOOL) ts_delaysContentTouches
{
return [[self ts_scrollView] delaysContentTouches];
}
@end
objc는 동적이고 scrollView는 delaysContent에 응답하는 유일한 클래스이므로터치하면 ios 7 및 8에 모두 사용할 수 있습니다(awakeFromNib과 같이 테이블 뷰 컨트롤러의 초기 위치에 배치).
for (id view in self.tableView.subviews)
{
if ([view respondsToSelector:@selector(delaysContentTouches)]) {
UIScrollView *scrollView = (UIScrollView *)view;
scrollView.delaysContentTouches = NO;
break;
}
}
또한 "delays Content"를 해제해야 할 수도 있습니다.보기컨트롤러 내부의 테이블을 선택하여 스토리보드 또는 펜촉에서 "터치"합니다.그건 그렇고, 뷰 컨트롤러 내의 테이블뷰를 사용하는 경우 ios 7에서는 이것이 작동하지 않을 수 있습니다. 적어도 작동시킬 수 없었습니다.
그 솔루션은 저에게 효과가 없어요, 저는 TableView를 서브클래싱하고 이 두 가지 방법을 구현했습니다.
- (instancetype)initWithCoder:(NSCoder *)coder{
self = [super initWithCoder:coder];
if (self) {
for (id obj in self.subviews) {
if ([obj respondsToSelector:@selector(setDelaysContentTouches:)]){
[obj performSelector:@selector(setDelaysContentTouches:) withObject:NO];
}
}
}
return self;
}
- (BOOL)delaysContentTouches{
return NO;
}
Swift의 iOS 7 및 8용 솔루션:
먼저 유틸리티 함수를 작성했습니다.
class func classNameAsString(obj: AnyObject) -> String {
return _stdlib_getDemangledTypeName(obj).componentsSeparatedByString(".").last!
}
그런 다음 UITableView를 서브클래스하고 이를 구현합니다.
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
for view in self.subviews {
if (Utility.classNameAsString(view) == "UITableViewWrapperView") {
if view.isKindOfClass(UIScrollView) {
var scroll = (view as UIScrollView)
scroll.delaysContentTouches = false
}
break
}
}
}
또한 UITableViewCell을 서브클래스하고 이를 구현합니다.
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
for view in self.subviews {
if (Utility.classNameAsString(view) == "UITableViewCellScrollView") {
if view.isKindOfClass(UIScrollView) {
var scroll = (view as UIScrollView)
scroll.delaysContentTouches = false
}
}
}
}
제 경우에는 init(coder:)가 실행됩니다.init 함수에 디버그 포인트를 넣어 어떤 init 함수가 실행될지 알고 나서 위의 코드를 사용하여 작동시키시기 바랍니다.누군가에게 도움이 되길 바랍니다.
Swift 3에서 이 UIView 확장은 UITableViewCell에서 사용할 수 있습니다.가급적.cellForRowAt
방법.
func removeTouchDelayForSubviews() {
for subview in subviews {
if let scrollView = subview as? UIScrollView {
scrollView.delaysContentTouches = false
} else {
subview.removeTouchDelayForSubviews()
}
}
}
언급URL : https://stackoverflow.com/questions/19256996/uibutton-not-showing-highlight-on-tap-in-ios7
'programing' 카테고리의 다른 글
Hibernate HQL에서 Oracle의 regexp_like를 사용하는 방법은 무엇입니까? (0) | 2023.09.08 |
---|---|
ASP에서 "runAll Managed Modules For All Requests"의 올바른 사용법은 무엇입니까?NET MVC 2/3? (0) | 2023.09.08 |
오버레이를 위해 CSS 글래스/블러 효과가 작동하도록 하려면 어떻게 해야 합니까? (0) | 2023.09.08 |
텍스트 상자가 이전에 입력한 값으로 자동 채우기 방지 (0) | 2023.09.08 |
Python을 사용하여 Excel 파일을 실행 (0) | 2023.09.08 |