ios convert - UIBarButtonItem:كيف يمكنني العثور على إطاره؟





objective swift (10)


أوفوه ، الكثير من الإجابات الخاطئة في هذا الموضوع. إليك الطريقة الصحيحة للقيام بذلك:

-(CGRect) getBarItemRc :(UIBarButtonItem *)item{
    UIView *view = [item valueForKey:@"view"];
    return [view frame];
}

لدي زر في شريط الأدوات. كيف يمكنني التقاط إطاره؟ هل لا UIBarButtonItem خاصية frame ؟




جرب هذه؛

UIBarButtonItem *item = ... ;
UIView *view = [item valueForKey:@"view"];
CGFloat width;
if(view){
    width=[view frame].size.width;
}
else{
    width=(CGFloat)0.0 ;
}



إليك ما أستخدمه في iOS 11 و Swift 4. يمكن أن يكون منظفًا صغيرًا بدون اختياري ، ولكني أعزف عليه بأمان:

@implementation UIBarButtonItem(Extras)

- (CGRect)frameInView:(UIView *)v {

    UIView *theView = self.customView;
    if (!theView.superview && [self respondsToSelector:@selector(view)]) {
        theView = [self performSelector:@selector(view)];
    }

    UIView *parentView = theView.superview;
    NSArray *subviews = parentView.subviews;

    NSUInteger indexOfView = [subviews indexOfObject:theView];
    NSUInteger subviewCount = subviews.count;

    if (subviewCount > 0 && indexOfView != NSNotFound) {
        UIView *button = [parentView.subviews objectAtIndex:indexOfView];
        return [button convertRect:button.bounds toView:v];
    } else {
        return CGRectZero;
    }
}

@end

والاستخدام:

extension UIBarButtonItem {
    var view: UIView? {
        return perform(#selector(getter: UIViewController.view)).takeRetainedValue() as? UIView
    }
}



يمكنك إنشاء UIBarButtonItem مع عرض مخصص ، وهو UIButton ، ثم يمكنك القيام بكل ما تريد. :]




import UIKit

class ViewController: UIViewController {

    let customButton = UIButton(type: .system)

    override func viewDidLoad() {
        super.viewDidLoad()

        customButton.setImage(UIImage(named: "myImage"), for: .normal)
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: customButton)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print(self.customButton.convert(self.customButton.frame, to: nil))
    }
}



باستخدام Swift ، إذا كنت بحاجة إلى العمل في الغالب مع عناصر زر الشريط ، يجب عليك تنفيذ ملحق مثل:

extension UIBarButtonItem {

    var frame: CGRect? {
        guard let view = self.value(forKey: "view") as? UIView else {
            return nil
        }
        return view.frame
    }

}

ثم في الرمز الخاص بك يمكنك الوصول بسهولة:

if let frame = self.navigationItem.rightBarButtonItems?.first?.frame {
    // do whatever with frame            
}



جرب هذا التنفيذ:

if let barButtonFrame = myBarButtonItem.view?.frame {
    // etc...
}



هذه الطريقة تعمل بشكل أفضل بالنسبة لي:

UIView *targetView = (UIView *)[yourBarButton performSelector:@selector(view)];
CGRect rect = targetView.frame;



شكرا ل Anoop Vaidya للإجابة المقترحة. قد يكون البديل (تزويدك بمعرفة موضع الزر في شريط الأدوات)

UIView *view= (UIView *)[self.toolbar.subviews objectAtIndex:0]; // 0 for the first item


CGRect viewframe = view.frame;



لقد وضعت معا ، UICollectionView ، UICollectionView ، وحتى UICollectionView الفئة الفرعية التي تعتني نقل جميع حقول النص داخلها من طريقة لوحة المفاتيح.

عندما تكون لوحة المفاتيح على وشك الظهور ، فإن الفئة الفرعية ستعثر على العرض الفرعي الذي على وشك تحريره ، وتعديل إزاحته وإطاره للمحتوى للتأكد من أن العرض مرئي ، مع رسم متحرك لمطابقة لوحة المفاتيح المنبثقة. عندما تختفي لوحة المفاتيح ، فإنها تستعيد حجمها السابق.

يجب أن تعمل مع أي إعداد ، إما واجهة UITableView based ، أو واحدة تتكون من وجهات النظر وضعت يدويا.

هنا tis: حل لنقل حقول النص بعيدا عن طريقة لوحة المفاتيح







ios objective-c swift